X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/f47cdeec5fbda82dc74d506f24e069558ee51a2c..f2ad23eeb92e1e2bc6bb3679e179157102898816:/src/internal.h diff --git a/src/internal.h b/src/internal.h index a20dd93..69eb827 100644 --- a/src/internal.h +++ b/src/internal.h @@ -82,9 +82,21 @@ typedef union { typedef struct { adns_rrtype type; - const char *name; + const char *rrtname; + const char *fmtname; int rrsz; + void (*makefinal)(adns_query qu, void *data); + /* Change memory management of *data. + * Previously, used alloc_interim, now use alloc_final. + */ + + adns_status (*convstring)(vbuf *vb, const void *data); + /* Converts the RR data to a string representation in vbuf. + * vbuf will be appended to (it must have been initialised), + * and will not be null-terminated by convstring. + */ + adns_status (*parse)(adns_query qu, int serv, const byte *dgram, int dglen, int cbyte, int max, void *store_r); @@ -97,9 +109,9 @@ typedef struct { * *rdstart to -1; otherwise it may set it to anything else positive. */ - void (*makefinal)(adns_query qu, void *data); - /* Change memory management of *data. - * Previously, used alloc_interim, now use alloc_final. + 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; @@ -127,7 +139,7 @@ struct adns__query { void *final_allocspace; const typeinfo *typei; - char *query_dgram; + byte *query_dgram; int query_dglen; vbuf vb; @@ -239,7 +251,7 @@ void adns__diag(adns_state ads, int serv, adns_query qu, const char *fmt, ...) PRINTFFORMAT(4,5); int adns__vbuf_ensure(vbuf *vb, int want); -int adns__vbuf_appendstr(vbuf *vb, const char *data); +int adns__vbuf_appendstr(vbuf *vb, const char *data); /* does not include nul */ int adns__vbuf_append(vbuf *vb, const byte *data, int len); /* 1=>success, 0=>realloc failed */ void adns__vbuf_appendq(vbuf *vb, const byte *data, int len); @@ -266,6 +278,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. @@ -315,11 +334,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); @@ -487,16 +506,16 @@ static inline int ctype_alpha(int c) { #define LIST_LINK_TAIL_PART(list,node,part) \ do { \ - (node)->part back= 0; \ - (node)->part next= (list).tail; \ - if ((list).tail) (list).tail->part back= (node); else (list).part head= (node); \ + (node)->part next= 0; \ + (node)->part back= (list).tail; \ + if ((list).tail) (list).tail->part next= (node); else (list).part head= (node); \ (list).tail= (node); \ } while(0) #define LIST_UNLINK(list,node) LIST_UNLINK_PART(list,node,) #define LIST_LINK_TAIL(list,node) LIST_LINK_TAIL_PART(list,node,) -#define GETIL_B(cb) (dgram[(cb)++]) +#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff) #define GET_B(cb,tv) ((tv)= GETIL_B((cb))) #define GET_W(cb,tv) ((tv)=0, (tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))