chiark / gitweb /
src/: Separate context state into parts for the type itself and its parent.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 25 May 2014 15:57:41 +0000 (16:57 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 13 Jun 2014 08:57:41 +0000 (09:57 +0100)
The `qcontext.info' union has two distinct uses.  A PTR query uses it to
store the initial query address, against which it compares the answer to
its child A query.  On the other hand, `pap_hostaddr' uses this space in
each child query it makes, to keep track of where to put the socket
addresses when the answers come back.

These two kinds of uses are incompatible, so split `qcontext.info' into
two pieces: one for the internal use of a query type, and one for the
use of a child query's parent -- and specifically for its completion
callback.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
src/internal.h
src/query.c
src/types.c

index 9df4da5..512a2b1 100644 (file)
@@ -181,10 +181,15 @@ union maxalign {
 typedef struct {
   void *ext;
   void (*callback)(adns_query parent, adns_query child);
+
+  union {
+    adns_rr_addr ptr_addr;
+  } tinfo; /* type-specific state for the query itself: zero-init if you
+           * don't know better. */
+
   union {
-    adns_rr_addr ptr_parent_addr;
     adns_rr_hostaddr *hostaddr;
-  } info;
+  } pinfo; /* state for use by parent's callback function */
 } qcontext;
 
 struct adns__query {
index d09702e..2b36d04 100644 (file)
@@ -230,7 +230,8 @@ int adns_submit(adns_state ads,
   
   qu->ctx.ext= context;
   qu->ctx.callback= 0;
-  memset(&qu->ctx.info,0,sizeof(qu->ctx.info));
+  memset(&qu->ctx.pinfo,0,sizeof(qu->ctx.pinfo));
+  memset(&qu->ctx.tinfo,0,sizeof(qu->ctx.tinfo));
 
   *query_r= qu;
 
index b920136..8bc7155 100644 (file)
@@ -456,7 +456,7 @@ static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha,
 
 static void icb_hostaddr(adns_query parent, adns_query child) {
   adns_answer *cans= child->answer;
-  adns_rr_hostaddr *rrp= child->ctx.info.hostaddr;
+  adns_rr_hostaddr *rrp= child->ctx.pinfo.hostaddr;
   adns_state ads= parent->ads;
   adns_status st;
 
@@ -510,7 +510,8 @@ static adns_status pap_hostaddr(const parseinfo *pai, int *cbyte_io,
 
   ctx.ext= 0;
   ctx.callback= icb_hostaddr;
-  ctx.info.hostaddr= rrp;
+  ctx.pinfo.hostaddr= rrp;
+  memset(&ctx.tinfo, 0, sizeof(ctx.tinfo));
   
   nflags= adns_qf_quoteok_query;
   if (!(pai->qu->flags & adns_qf_cname_loose)) nflags |= adns_qf_cname_forbid;
@@ -720,7 +721,7 @@ static void icb_ptr(adns_query parent, adns_query child) {
     return;
   }
 
-  queried= &parent->ctx.info.ptr_parent_addr;
+  queried= &parent->ctx.tinfo.ptr_addr;
   for (i=0, found=cans->rrs.addr; i<cans->nrrs; i++, found++) {
     if (queried->len == found->len &&
        !memcmp(&queried->addr,&found->addr,queried->len)) {
@@ -758,7 +759,7 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart,
   if (st) return st;
   if (cbyte != max) return adns_s_invaliddata;
 
-  ap= &pai->qu->ctx.info.ptr_parent_addr;
+  ap= &pai->qu->ctx.tinfo.ptr_addr;
   if (!ap->len) {
     adns__findlabel_start(&fls, pai->ads, -1, pai->qu,
                          pai->qu->query_dgram, pai->qu->query_dglen,
@@ -797,7 +798,8 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart,
 
   ctx.ext= 0;
   ctx.callback= icb_ptr;
-  memset(&ctx.info,0,sizeof(ctx.info));
+  memset(&ctx.pinfo,0,sizeof(ctx.pinfo));
+  memset(&ctx.tinfo,0,sizeof(ctx.tinfo));
   st= adns__internal_submit(pai->ads, &nqu, adns__findtype(adns_r_addr),
                            &pai->qu->vb, id,
                            adns_qf_quoteok_query, pai->now, &ctx);