chiark / gitweb /
Restarting a TCP-using query doesn't abort.
[adns.git] / src / reply.c
index c1ad342e1cb29f3a20c5f3bc93548afacbe74b56..96e43edca4d4b004e07c376b5b46c9388c70a783 100644 (file)
@@ -170,7 +170,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
        if (!qu->vb.used) goto x_truncated;
        if (st) { adns__query_fail(qu,st); return; }
        l= strlen(qu->vb.buf)+1;
-       qu->answer->cname= adns__alloc_interim(qu,l);
+       qu->answer->cname= adns__alloc_preserved(qu,l);
        if (!qu->answer->cname) { adns__query_fail(qu,adns_s_nomemory); return; }
 
        qu->cname_dgram= adns__alloc_mine(qu,dglen);
@@ -227,7 +227,12 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
     if (rcode == rcode_nxdomain) {
       /* We still wanted to look for the SOA so we could find the TTL. */
       adns__update_expires(qu,soattl,now);
-      adns__query_fail(qu,adns_s_nxdomain);
+
+      if (qu->flags & adns_qf_search) {
+       adns__search_next(ads,qu,now);
+      } else {
+       adns__query_fail(qu,adns_s_nxdomain);
+      }
       return;
     }
 
@@ -302,7 +307,6 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
     LIST_LINK_TAIL(ads->childw,qu);
     return;
   }
-
   adns__query_done(qu);
   return;
 
@@ -316,7 +320,6 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
   qu->flags |= adns_qf_usevc;
   
  x_restartquery:
-  
   if (qu->cname_dgram) {
     st= adns__mkquery_frdgram(qu->ads,&qu->vb,&qu->id,
                              qu->cname_dgram, qu->cname_dglen, qu->cname_begin,
@@ -331,6 +334,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
     memcpy(newquery,qu->vb.buf,qu->vb.used);
   }
   
-  adns__reset_cnameonly(qu);
-  adns__query_udp(qu,now);
+  if (qu->state == query_tcpsent) qu->state= query_tosend;
+  adns__reset_preserved(qu);
+  adns__query_send(qu,now);
 }