X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/1e9efa7116ea04acfc29e7b0a7672d06db5cf00c..f318f883cd7d30bcf2882a82134bb4a2e918068f:/src/internal.h?ds=sidebyside diff --git a/src/internal.h b/src/internal.h index 852c05c..09ba2fe 100644 --- a/src/internal.h +++ b/src/internal.h @@ -99,7 +99,7 @@ typedef struct { adns_status (*parse)(adns_query qu, int serv, const byte *dgram, int dglen, int cbyte, int max, - void *store_r); + int nsstart, int *arstart_io, void *store_r); /* Parse one RR, in dgram of length dglen, starting at cbyte and * extending until at most max. * @@ -107,6 +107,15 @@ typedef struct { * * If there is an overrun which might indicate truncation, it should set * *rdstart to -1; otherwise it may set it to anything else positive. + * + * nsstart is the offset of the authority section; *arstart_io is + * -1 or the offset of the additional section; if it is -1 then + * parse may set it to the correct offset. + */ + + int (*diff_needswap)(const void *datap_a, const void *datap_b); + /* Returns !0 if RR a should be strictly after RR b in the sort order, + * 0 otherwise. Must not fail. */ } typeinfo; @@ -134,7 +143,7 @@ struct adns__query { void *final_allocspace; const typeinfo *typei; - char *query_dgram; + byte *query_dgram; int query_dglen; vbuf vb; @@ -253,8 +262,8 @@ void adns__vbuf_appendq(vbuf *vb, const byte *data, int len); void adns__vbuf_init(vbuf *vb); void adns__vbuf_free(vbuf *vb); -const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb, - int flags, const byte *dgram, int dglen, int cbyte); +const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, + vbuf *vb, const byte *dgram, int dglen, int cbyte); /* Unpicks a domain in a datagram and returns a string suitable for * printing it as. Never fails - if an error occurs, it will * return some kind of string describing the error. @@ -266,6 +275,14 @@ const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb, * vb before using the return value. */ +void adns__isort(void *array, int nobjs, int sz, void *tempbuf, + int (*needswap)(const void *a, const void *b)); +/* Does an insertion sort of array which must contain nobjs objects + * each sz bytes long. tempbuf must point to a buffer at least + * sz bytes long. needswap should return !0 if a>b (strictly, ie + * wrong order) 0 if a<=b (ie, order is fine). + */ + /* From transmit.c: */ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, @@ -273,6 +290,13 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, const typeinfo *typei, adns_queryflags flags); /* Assembles a query packet in vb, and returns id at *id_r. */ +adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r, + const byte *qd_dgram, int qd_dglen, int qd_begin, + adns_rrtype type, adns_queryflags flags); +/* Same as adns__mkquery, but takes the owner domain from an existing datagram. + * That domain must be correct and untruncated. + */ + void adns__query_tcp(adns_query qu, struct timeval now); /* Query must be in state tcpwait/timew; it will be moved to a new state * if possible and no further processing can be done on it for now. @@ -322,11 +346,11 @@ void *adns__alloc_interim(adns_query qu, size_t sz); * big enough for all these allocations, and then adns__alloc_final * will get memory from this buffer. * - * _alloc_interim can fail, in which case it will fail the query too, - * so nothing more need be done with it. + * _alloc_interim can fail (and return 0). + * The caller must ensure that the query is failed. * - * adns__alloc_interim(qu,0) will not return 0, but it will not - * necessarily return a distinct pointer each time. + * adns__alloc_interim_{only,fail}(qu,0) will not return 0, + * but it will not necessarily return a distinct pointer each time. */ void *adns__alloc_mine(adns_query qu, size_t sz); @@ -409,8 +433,12 @@ adns_status adns__findlabel_next(findlabel_state *fls, int *lablen_r, int *labst * Do not then call findlabel_next again. */ +typedef enum { + pdf_quoteok= 0x001 +} parsedomain_flags; + adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu, - vbuf *vb, int flags, + vbuf *vb, parsedomain_flags flags, 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