X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/1dfe95d8d1f8f2abaef02f9b0817c720bd955f7b..a6536d8becc65c37fbeab7bc0793c6dd55bea977:/src/internal.h diff --git a/src/internal.h b/src/internal.h index 985da50..672e3a9 100644 --- a/src/internal.h +++ b/src/internal.h @@ -50,6 +50,8 @@ typedef unsigned char byte; #define DNS_HDRSIZE 12 #define DNS_CLASS_IN 1 +#define DNS_INADDR_ARPA "in-addr", "arpa" + typedef enum { rcode_noerror, rcode_formaterror, @@ -75,17 +77,13 @@ typedef struct { byte *buf; } vbuf; -typedef union { - void *ext; - int dmaddr_index; -} qcontext; - typedef struct { adns_state ads; adns_query qu; int serv; const byte *dgram; int dglen, nsstart, nscount, arcount; + struct timeval now; } parseinfo; typedef struct { @@ -124,7 +122,7 @@ typedef struct { } typeinfo; typedef struct allocnode { - struct allocnode *next; + struct allocnode *next, *back; } allocnode; union maxalign { @@ -136,13 +134,22 @@ union maxalign { union maxalign *up; } data; +typedef struct { + void *ext; + void (*callback)(adns_query parent, adns_query child); + union { + adns_rr_addr ptr_parent_addr; + adns_rr_hostaddr *hostaddr; + } info; +} qcontext; + struct adns__query { adns_state ads; enum { query_udp, query_tcpwait, query_tcpsent, query_child, query_done } state; adns_query back, next, parent; struct { adns_query head, tail; } children; struct { adns_query back, next; } siblings; - struct allocnode *allocations; + struct { allocnode *head, *tail; } allocations; int interim_allocd; void *final_allocspace; @@ -173,7 +180,8 @@ struct adns__query { int udpnextserver; unsigned long udpsent, tcpfailed; /* bitmap indexed by server */ struct timeval timeout; - qcontext context; + + qcontext ctx; /* Possible states: * @@ -337,7 +345,7 @@ int adns__internal_submit(adns_state ads, adns_query *query_r, * If failstat is nonzero then if we are successful in creating the query * it is immediately failed with code failstat (but _submit still succeds). * - * ctx is copied byte-for-byte into the query. + * *ctx is copied byte-for-byte into the query. */ void *adns__alloc_interim(adns_query qu, size_t sz); @@ -357,6 +365,16 @@ void *adns__alloc_interim(adns_query qu, size_t sz); * but it will not necessarily return a distinct pointer each time. */ +void adns__transfer_interim(adns_query from, adns_query to, void *block, size_t sz); +/* Transfers an interim allocation from one query to another, so that + * the `to' query will have room for the data when we get to makefinal + * and so that the free will happen when the `to' query is freed + * rather than the `from' query. + * + * It is legal to call adns__transfer_interim with a null pointer; this + * has no effect. + */ + void *adns__alloc_mine(adns_query qu, size_t sz); /* Like _interim, but does not record the length for later * copying into the answer. This just ensures that the memory @@ -537,17 +555,17 @@ static inline int ctype_alpha(int c) { #define LIST_UNLINK_PART(list,node,part) \ do { \ - if ((node)->back) (node)->back->part next= (node)->part next; \ - else (list).head= (node)->part next; \ - if ((node)->next) (node)->next->part back= (node)->part back; \ - else (list).tail= (node)->part back; \ + if ((node)->part back) (node)->part back->part next= (node)->part next; \ + else (list).head= (node)->part next; \ + if ((node)->part next) (node)->part next->part back= (node)->part back; \ + else (list).tail= (node)->part back; \ } while(0) #define LIST_LINK_TAIL_PART(list,node,part) \ do { \ (node)->part next= 0; \ (node)->part back= (list).tail; \ - if ((list).tail) (list).tail->part next= (node); else (list).part head= (node); \ + if ((list).tail) (list).tail->part next= (node); else (list).head= (node); \ (list).tail= (node); \ } while(0)