+ * TCP handling revamped (avoids recursive-invocation problems).
[adns] / src / setup.c
index 8604f8e..ba80f14 100644 (file)
@@ -461,7 +461,8 @@ static int init_begin(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
   ads->iflags= flags;
   ads->diagfile= diagfile;
   ads->configerrno= 0;
-  LIST_INIT(ads->timew);
+  LIST_INIT(ads->udpw);
+  LIST_INIT(ads->tcpw);
   LIST_INIT(ads->childw);
   LIST_INIT(ads->output);
   ads->forallnext= 0;
@@ -469,6 +470,7 @@ static int init_begin(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
   ads->udpsocket= ads->tcpsocket= -1;
   adns__vbuf_init(&ads->tcpsend);
   adns__vbuf_init(&ads->tcprecv);
+  ads->tcprecv_skip= 0;
   ads->nservers= ads->nsortlist= ads->nsearchlist= ads->tcpserver= 0;
   ads->searchndots= 1;
   ads->tcpstate= server_disconnected;
@@ -515,7 +517,7 @@ static void init_abort(adns_state ads) {
   free(ads);
 }
 
-int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
+int adns_init(adns_state *ads_r, int flags, FILE *diagfile) {
   adns_state ads;
   const char *res_options, *adns_res_options;
   int r;
@@ -555,7 +557,7 @@ int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
   return 0;
 }
 
-int adns_init_strcfg(adns_state *ads_r, adns_initflags flags,
+int adns_init_strcfg(adns_state *ads_r, int flags,
                     FILE *diagfile, const char *configtext) {
   adns_state ads;
   int r;
@@ -579,7 +581,8 @@ int adns_init_strcfg(adns_state *ads_r, adns_initflags flags,
 void adns_finish(adns_state ads) {
   adns__consistency(ads,0,cc_entex);
   for (;;) {
-    if (ads->timew.head) adns_cancel(ads->timew.head);
+    if (ads->udpw.head) adns_cancel(ads->udpw.head);
+    else if (ads->tcpw.head) adns_cancel(ads->tcpw.head);
     else if (ads->childw.head) adns_cancel(ads->childw.head);
     else if (ads->output.head) adns_cancel(ads->output.head);
     else break;
@@ -594,7 +597,8 @@ void adns_finish(adns_state ads) {
 void adns_forallqueries_begin(adns_state ads) {
   adns__consistency(ads,0,cc_entex);
   ads->forallnext=
-    ads->timew.head ? ads->timew.head :
+    ads->udpw.head ? ads->udpw.head :
+    ads->tcpw.head ? ads->tcpw.head :
     ads->childw.head ? ads->childw.head :
     ads->output.head;
 }
@@ -609,12 +613,15 @@ adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
     if (!qu) return 0;
     if (qu->next) {
       nqu= qu->next;
-    } else if (qu == ads->timew.tail) {
-      if (ads->childw.head) {
-       nqu= ads->childw.head;
-      } else {
-       nqu= ads->output.head;
-      }
+    } else if (qu == ads->udpw.tail) {
+      nqu=
+       ads->tcpw.head ? ads->tcpw.head :
+       ads->childw.head ? ads->childw.head :
+       ads->output.head;
+    } else if (qu == ads->tcpw.tail) {
+      nqu=
+       ads->childw.head ? ads->childw.head :
+       ads->output.head;
     } else if (qu == ads->childw.tail) {
       nqu= ads->output.head;
     } else {
@@ -626,8 +633,3 @@ adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
   if (context_r) *context_r= qu->ctx.ext;
   return qu;
 }
-
-void adns__checkqueues(adns_state ads) {
-  adns_forallqueries_begin(ads);
-  while (adns_forallqueries_next(ads,0));
-}