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 9df4da5f839ea89bc299a2400c86c6dbf33e3aad..512a2b11e4e4511b61e946482fe823b7886ac089 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 d09702e3702f555d8fc1c85b1c8a129d911ce55a..2b36d041f4a19967638daf5c5941ae62b117caaa 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 b920136dd277c83e8abbd3a4df137f24cdee1fba..8bc7155a311f3759919e3b21f54a55946a6e895a 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);