src/query.c: Remove flag hacking from adns_submit.
[adns] / src / query.c
index 31adfc4..71d635d 100644 (file)
@@ -83,7 +83,7 @@ static adns_query query_alloc(adns_state ads,
   qu->answer->expires= -1;
   qu->answer->nrrs= 0;
   qu->answer->rrs.untyped= 0;
-  qu->answer->rrsz= typei->rrsz;
+  qu->answer->rrsz= typei->getrrsz ? typei->getrrsz(type) : typei->rrsz;
 
   return qu;
 }
@@ -105,10 +105,8 @@ static void query_submit(adns_state ads, adns_query qu,
   qu->query_dglen= qu->vb.used;
   memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used);
 
-  if (typei->query_send && !(qu->flags & adns__qf_senddirect))
-    typei->query_send(qu,now);
-  else
-    adns__query_send(qu, now);
+  if (typei->query_send) typei->query_send(qu,now);
+  else adns__query_send(qu, now);
 }
 
 adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
@@ -225,9 +223,6 @@ int adns_submit(adns_state ads,
 
   adns__consistency(ads,0,cc_entex);
 
-  if (!(type & adns__qtf_bigaddr) || !(type & adns__qtf_manyaf))
-    flags = (flags & ~adns__qf_afmask) | adns_qf_ipv4_only;
-
   typei= adns__findtype(type);
   if (!typei) return ENOSYS;
 
@@ -236,7 +231,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;
 
@@ -388,13 +384,22 @@ void *adns__alloc_preserved(adns_query qu, size_t sz) {
   return rv;
 }
 
-void adns__free_interim(adns_query qu, void *p) {
+static allocnode *alloc_info(adns_query qu, void *p, size_t *sz_r)
+{
   allocnode *an;
-  size_t sz;
 
-  if (!p) return;
+  if (!p || p == qu) { *sz_r = 0; return 0; }
   an = (allocnode *)((byte *)p - MEM_ROUND(sizeof(allocnode)));
-  sz = MEM_ROUND(an->sz);
+  *sz_r = MEM_ROUND(an->sz);
+  return an;
+}
+
+void adns__free_interim(adns_query qu, void *p) {
+  size_t sz;
+  allocnode *an = alloc_info(qu, p, &sz);
+
+  if (!an) return;
+  assert(!qu->final_allocspace);
   LIST_UNLINK(qu->allocations, an);
   free(an);
   qu->interim_allocd -= sz;
@@ -404,12 +409,11 @@ void *adns__alloc_mine(adns_query qu, size_t sz) {
   return alloc_common(qu,MEM_ROUND(sz));
 }
 
-void adns__transfer_interim(adns_query from, adns_query to,
-                           void *block, size_t sz) {
-  allocnode *an;
+void adns__transfer_interim(adns_query from, adns_query to, void *block) {
+  size_t sz;
+  allocnode *an = alloc_info(from, block, &sz);
 
-  if (!block) return;
-  an= (void*)((byte*)block - MEM_ROUND(sizeof(*an)));
+  if (!an) return;
 
   assert(!to->final_allocspace);
   assert(!from->final_allocspace);
@@ -417,7 +421,6 @@ void adns__transfer_interim(adns_query from, adns_query to,
   LIST_UNLINK(from->allocations,an);
   LIST_LINK_TAIL(to->allocations,an);
 
-  sz= MEM_ROUND(sz);
   from->interim_allocd -= sz;
   to->interim_allocd += sz;