chiark / gitweb /
+ * Many memory leaks fixed.
[adns.git] / src / setup.c
index 6ef2d120eeed53d85b4aab2718fdb16be639b18c..e19a70536b2753a62debb6268492010e8c9b0551 100644 (file)
@@ -4,7 +4,12 @@
  * - management of global state
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ *  This file is
+ *    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999 Tony Finch <dot@dotat.at>
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -57,6 +62,11 @@ static void addserver(adns_state ads, struct in_addr addr) {
   ads->nservers++;
 }
 
+static void freesearchlist(adns_state ads) {
+  if (ads->nsearchlist) free(*ads->searchlist);
+  free(ads->searchlist);
+}
+
 static void saveerr(adns_state ads, int en) {
   if (!ads->configerrno) ads->configerrno= en;
 }
@@ -128,7 +138,7 @@ static void ccf_search(adns_state ads, const char *fn, int lno, const char *buf)
     *newchars++ = 0;
   }
 
-  free(ads->searchlist);
+  freesearchlist(ads);
   ads->nsearchlist= count;
   ads->searchlist= newptrs;
 }
@@ -456,7 +466,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;
@@ -464,6 +475,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;
@@ -574,7 +586,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;
@@ -583,13 +596,15 @@ void adns_finish(adns_state ads) {
   if (ads->tcpsocket >= 0) close(ads->tcpsocket);
   adns__vbuf_free(&ads->tcpsend);
   adns__vbuf_free(&ads->tcprecv);
+  freesearchlist(ads);
   free(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;
 }
@@ -604,12 +619,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 {
@@ -621,8 +639,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));
-}