X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/adns/blobdiff_plain/d3eea6424e9ba051c0e72b3c39cd826fda168762..f1e474dda132e6d9626bc9930fd9025616de81fb:/src/internal.h diff --git a/src/internal.h b/src/internal.h index ab68ead..c449e7f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -76,13 +76,14 @@ struct adns__query { struct { adns_query back, next; } siblings; const typeinfo *typei; - vbuf ans; + vbuf ansbuf; /* Used for answer RRs */ + char *cname; int id, flags, udpretries; int udpnextserver; unsigned long udpsent, tcpfailed; /* bitmap indexed by server */ struct timeval timeout; byte *querymsg; - int querylen, cnameoff, rrsoff; + int querylen; qcontext context; char owner[1]; /* After the owner name and nul comes the query message, pointed to by querymsg */ @@ -164,7 +165,6 @@ void adns__diag(adns_state ads, int serv, const char *fmt, ...) PRINTFFORMAT(3,4 int adns__vbuf_ensure(vbuf *vb, int want); int adns__vbuf_append(vbuf *vb, const byte *data, int len); -int adns__vbuf_malloc(vbuf *vb, size_t len); /* 1=>success, 0=>realloc failed */ void adns__vbuf_appendq(vbuf *vb, const byte *data, int len); void adns__vbuf_init(vbuf *vb); @@ -195,22 +195,90 @@ const typeinfo *adns__findtype(adns_rrtype type); /* From parse.c: */ -int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len); +typedef struct { + adns_state ads, int serv; + const byte *dgram; + int dglen, max, cbyte, namelen; + int *dmend_rlater, *namelen_rlater; +} findlabel_state; + +void adns__findlabel_start(findlabel_state *fls, + adns_state ads, int serv, + const byte *dgram, int dglen, int max, + int dmbegin, int *dmend_rlater); +/* Finds labels in a domain in a datagram. + * + * Call this routine first. + * endpoint_rlater may be null. + */ + +adns_status adns__findlabel_next(findlabel_state *fls, + int *lablen_r, int *labstart_r); +/* Then, call this one repeatedly. + * + * It will return adns_s_ok if all is well, and tell you the length + * and start of successive labels. labstart_r may be null, but + * lablen_r must not be. + * + * After the last label, it will return with *lablen_r zero. + * Do not then call it again; instead, just throw away the findlabel_state. + * + * *dmend_rlater will have been set to point to the next part of + * the datagram after the label (or after the uncompressed part, + * if compression was used). *namelen_rlater will have been set + * to the length of the domain name (total length of labels plus + * 1 for each intervening dot). + * + * If the datagram appears to be truncated, *lablen_r will be -1. + * *dmend_rlater, *labstart_r and *namelen_r may contain garbage. + * Do not call _next again. + * + * There may also be errors, in which case *dmend_rlater, + * *namelen_rlater, *lablen_r and *labstart_r may contain garbage. + * Do not then call findlabel_next again. + */ + +adns_status adns__parse_domain(adns_state ads, int serv, vbuf *vb, + const byte *dgram, int dglen, + int *cbyte_io, int max); +/* vb must already have been initialised; it will be reset if necessary. + * If there is truncation, vb->used will be set to 0; otherwise + * (if there is no error) vb will be null-terminated. + * If there is an error vb and *cbyte_io may be left indeterminate. + */ + +adns_status adns__findrr(adns_state ads, int serv, + const byte *dgram, int dglen, int *cbyte_io, + int *type_r, int *class_r, int *rdlen_r, int *rdstart_r, + const byte *eo_dgram, int eo_dglen, int eo_cbyte, + int *eo_matched_r); + /* Finds the extent and some of the contents of an RR in a datagram + * and does some checks. The datagram is *dgram, length dglen, and + * the RR starts at *cbyte_io (which is updated afterwards to point + * to the end of the RR). + * + * The type, class and RRdata length and start are returned iff + * the corresponding pointer variables are not null. type_r and + * class_r may not be null. + * + * If the caller thinks they know what the owner of the RR ought to + * be they can pass in details in eo_*: this is another (or perhaps + * the same datagram), and a pointer to where the putative owner + * starts in that datagram. In this case *eo_matched_r will be set + * to 1 if the datagram matched or 0 if it did not. Either + * both eo_dgram and eo_matched_r must both be non-null, or they + * must both be null (in which case eo_dglen and eo_cbyte will be ignored). + * The eo datagram and contained owner domain MUST be valid and + * untruncated. + * + * If there is truncation then *type_r will be set to -1 and + * *cbyte_io, *class_r, *rdlen_r, *rdstart_r and *eo_matched_r will be + * undefined. + * + * If an error is returned then *type_r will be undefined too. + */ -adns_status adns__get_label(const byte *dgram, int dglen, int *max_io, - int *cbyte_io, int *lablen_r, int *labstart_r, - int *namelen_io); -adns_status adns__get_domain_perm(adns_state ads, adns_query qu, int serv, - const byte *dgram, int dglen, - int *cbyte_io, int max, int *domainstart_r); -adns_status adns__get_domain_temp(adns_state ads, adns_query qu, int serv, - const byte *dgram, int dglen, - int *cbyte_io, int max, int *domainstart_r); -adns_status adns__get_rr_temp(adns_state ads, adns_query qu, int serv, - const byte *dgram, int dglen, int *cbyte_io, - int *type_r, int *class_r, int *rdlen_r, int *rdstart_r, - const byte *eo_dgram, int eo_dglen, int eo_cbyte, - int *eo_matched_r); +int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len); /* From event.c: */