chiark / gitweb /
src/setup.c, src/transmit.c: New function finds udpsocket by AF.
[adns] / src / setup.c
index a264d15ea83aa61260a1c6300b0b0beebcfc9825..fdbc6d08e23425d276acbf974d00d4dcf12f88d0 100644 (file)
@@ -60,26 +60,27 @@ static void addserver(adns_state ads, struct sockaddr *sa, int n) {
   int i;
   adns_rr_addr *ss;
   const afinfo *ai;
+  char buf[MAX_ADDRSTRLEN];
 
   ai = find_afinfo(sa->sa_family);
   if (!ai) {
     adns__diag(ads,-1,0,
               "nameserver %s for unknown address family %d ignored",
-              adns__sockaddr_ntoa(sa, n), sa->sa_family);
+              adns__sockaddr_ntoa(sa, n, buf), sa->sa_family);
   }
   
   for (i=0; i<ads->nservers; i++) {
     if (ads->servers[i].addr.sa.sa_family == sa->sa_family &&
        ai->sockaddr_equalp(sa, &ads->servers[i].addr.sa)) {
       adns__debug(ads,-1,0,"duplicate nameserver %s ignored",
-                 adns__sockaddr_ntoa(sa, n));
+                 adns__sockaddr_ntoa(sa, n, buf));
       return;
     }
   }
   
   if (ads->nservers>=MAXSERVERS) {
     adns__diag(ads,-1,0,"too many nameservers, ignoring %s",
-              adns__sockaddr_ntoa(sa, n));
+              adns__sockaddr_ntoa(sa, n, buf));
     return;
   }
 
@@ -134,6 +135,7 @@ static int nextword(const char **bufp_io, const char **word_r, int *l_r) {
 static void ccf_nameserver(adns_state ads, const char *fn,
                           int lno, const char *buf) {
   struct addrinfo *ai, ai_hint = { 0 };
+  char addrbuf[MAX_ADDRSTRLEN];
   int err;
 
   ai_hint.ai_family = AF_UNSPEC;
@@ -148,7 +150,7 @@ static void ccf_nameserver(adns_state ads, const char *fn,
   }
 
   adns__debug(ads,-1,0,"using nameserver %s",
-             adns__sockaddr_ntoa(ai->ai_addr, ai->ai_addrlen));
+             adns__sockaddr_ntoa(ai->ai_addr, ai->ai_addrlen, addrbuf));
   addserver(ads, ai->ai_addr, ai->ai_addrlen);
   freeaddrinfo(ai);
 }
@@ -616,6 +618,7 @@ static int init_finish(adns_state ads) {
     if (ads->logfn && ads->iflags & adns_if_debug)
       adns__lprintf(ads,"adns: no nameservers, using IPv4 localhost\n");
     memset(&sin, 0, sizeof(sin));
+    sin.sin_family = AF_INET;
     sin.sin_port = htons(DNS_PORT);
     sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     addserver(ads,(struct sockaddr *)&sin, sizeof(sin));
@@ -624,11 +627,8 @@ static int init_finish(adns_state ads) {
   proto= getprotobyname("udp"); if (!proto) { r= ENOPROTOOPT; goto x_free; }
   ads->nudp = 0;
   for (i = 0; i < ads->nservers; i++) {
-    for (j = 0; j < ads->nudp; j++) {
-      if (ads->udpsocket[j].ai->af == ads->servers[i].addr.sa.sa_family)
-       goto afmatch;
-    }
-
+    if (adns__udpsocket_by_af(ads, ads->servers[i].addr.sa.sa_family))
+      continue;
     assert(ads->nudp < MAXUDP);
     udp = &ads->udpsocket[ads->nudp];
     udp->ai = find_afinfo(ads->servers[i].addr.sa.sa_family);
@@ -638,8 +638,6 @@ static int init_finish(adns_state ads) {
     r= adns__setnonblock(ads,udp->fd);
     if (r) { r= errno; goto x_closeudp; }
     ads->nudp++;
-
-  afmatch:;
   }
   
   return 0;