Home | History | Annotate | Download | only in src
      1 /* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
      2 
      3    This program is free software; you can redistribute it and/or modify
      4    it under the terms of the GNU General Public License as published by
      5    the Free Software Foundation; version 2 dated June, 1991, or
      6    (at your option) version 3 dated 29 June, 2007.
      7 
      8    This program is distributed in the hope that it will be useful,
      9    but WITHOUT ANY WARRANTY; without even the implied warranty of
     10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11    GNU General Public License for more details.
     12 
     13    You should have received a copy of the GNU General Public License
     14    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15 */
     16 
     17 #include "dnsmasq.h"
     18 
     19 static const char SEPARATOR[] = "|";
     20 
     21 #ifdef HAVE_LINUX_NETWORK
     22 
     23 int indextoname(int fd, int index, char *name)
     24 {
     25   struct ifreq ifr;
     26 
     27   if (index == 0)
     28     return 0;
     29 
     30   ifr.ifr_ifindex = index;
     31   if (ioctl(fd, SIOCGIFNAME, &ifr) == -1)
     32     return 0;
     33 
     34   strncpy(name, ifr.ifr_name, IF_NAMESIZE);
     35 
     36   return 1;
     37 }
     38 
     39 #else
     40 
     41 int indextoname(int fd, int index, char *name)
     42 {
     43   if (index == 0 || !if_indextoname(index, name))
     44     return 0;
     45 
     46   return 1;
     47 }
     48 
     49 #endif
     50 
     51 int iface_check(int family, struct all_addr *addr, char *name, int *indexp)
     52 {
     53   struct iname *tmp;
     54   int ret = 1;
     55 
     56   /* Note: have to check all and not bail out early, so that we set the
     57      "used" flags. */
     58 
     59   if (indexp)
     60     {
     61       /* One form of bridging on BSD has the property that packets
     62 	 can be recieved on bridge interfaces which do not have an IP address.
     63 	 We allow these to be treated as aliases of another interface which does have
     64 	 an IP address with --dhcp-bridge=interface,alias,alias */
     65       struct dhcp_bridge *bridge, *alias;
     66       for (bridge = daemon->bridges; bridge; bridge = bridge->next)
     67 	{
     68 	  for (alias = bridge->alias; alias; alias = alias->next)
     69 	    if (strncmp(name, alias->iface, IF_NAMESIZE) == 0)
     70 	      {
     71 		int newindex;
     72 
     73 		if (!(newindex = if_nametoindex(bridge->iface)))
     74 		  {
     75 		    my_syslog(LOG_WARNING, _("unknown interface %s in bridge-interface"), name);
     76 		    return 0;
     77 		  }
     78 		else
     79 		  {
     80 		    *indexp = newindex;
     81 		    strncpy(name,  bridge->iface, IF_NAMESIZE);
     82 		    break;
     83 		  }
     84 	      }
     85 	  if (alias)
     86 	    break;
     87 	}
     88     }
     89 
     90   if (daemon->if_names || (addr && daemon->if_addrs))
     91     {
     92       ret = 0;
     93 
     94       for (tmp = daemon->if_names; tmp; tmp = tmp->next)
     95 	if (tmp->name && (strcmp(tmp->name, name) == 0))
     96 	  ret = tmp->used = 1;
     97 
     98       for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
     99 	if (addr && tmp->addr.sa.sa_family == family)
    100 	  {
    101 	    if (family == AF_INET &&
    102 		tmp->addr.in.sin_addr.s_addr == addr->addr.addr4.s_addr)
    103 	      ret = tmp->used = 1;
    104 #ifdef HAVE_IPV6
    105 	    else if (family == AF_INET6 &&
    106 		     IN6_ARE_ADDR_EQUAL(&tmp->addr.in6.sin6_addr,
    107 					&addr->addr.addr6) &&
    108 		     (!IN6_IS_ADDR_LINKLOCAL(&addr->addr.addr6) ||
    109 		      (tmp->addr.in6.sin6_scope_id == (uint32_t) *indexp)))
    110 	      ret = tmp->used = 1;
    111 #endif
    112 	  }
    113     }
    114 
    115   for (tmp = daemon->if_except; tmp; tmp = tmp->next)
    116     if (tmp->name && (strcmp(tmp->name, name) == 0))
    117       ret = 0;
    118 
    119   return ret;
    120 }
    121 
    122 static int iface_allowed(struct irec **irecp, int if_index,
    123 			 union mysockaddr *addr, struct in_addr netmask)
    124 {
    125   struct irec *iface;
    126   int fd, mtu = 0, loopback;
    127   struct ifreq ifr;
    128   int dhcp_ok = 1;
    129   struct iname *tmp;
    130 
    131   /* check whether the interface IP has been added already
    132      we call this routine multiple times. */
    133   for (iface = *irecp; iface; iface = iface->next)
    134     if (sockaddr_isequal(&iface->addr, addr))
    135       return 1;
    136 
    137   if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1 ||
    138       !indextoname(fd, if_index, ifr.ifr_name) ||
    139       ioctl(fd, SIOCGIFFLAGS, &ifr) == -1)
    140     {
    141       if (fd != -1)
    142 	{
    143 	  int errsave = errno;
    144 	  close(fd);
    145 	  errno = errsave;
    146 	}
    147       return 0;
    148     }
    149 
    150   loopback = ifr.ifr_flags & IFF_LOOPBACK;
    151 
    152   if (ioctl(fd, SIOCGIFMTU, &ifr) != -1)
    153     mtu = ifr.ifr_mtu;
    154 
    155   close(fd);
    156 
    157   /* If we are restricting the set of interfaces to use, make
    158      sure that loopback interfaces are in that set. */
    159   if (daemon->if_names && loopback)
    160     {
    161       struct iname *lo;
    162       for (lo = daemon->if_names; lo; lo = lo->next)
    163 	if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
    164 	  {
    165 	    lo->isloop = 1;
    166 	    break;
    167 	  }
    168 
    169       if (!lo &&
    170 	  (lo = whine_malloc(sizeof(struct iname))) &&
    171 	  (lo->name = whine_malloc(strlen(ifr.ifr_name)+1)))
    172 	{
    173 	  strcpy(lo->name, ifr.ifr_name);
    174 	  lo->isloop = lo->used = 1;
    175 	  lo->next = daemon->if_names;
    176 	  daemon->if_names = lo;
    177 	}
    178     }
    179 
    180   if (addr->sa.sa_family == AF_INET &&
    181       !iface_check(AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name, NULL))
    182     return 1;
    183 
    184   for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
    185     if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
    186       dhcp_ok = 0;
    187 
    188 #ifdef HAVE_IPV6
    189   int ifindex = (int) addr->in6.sin6_scope_id;
    190   if (addr->sa.sa_family == AF_INET6 &&
    191       !iface_check(AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, ifr.ifr_name, &ifindex))
    192     return 1;
    193 #endif
    194 
    195   /* add to list */
    196   if ((iface = whine_malloc(sizeof(struct irec))))
    197     {
    198       iface->addr = *addr;
    199       iface->netmask = netmask;
    200       iface->dhcp_ok = dhcp_ok;
    201       iface->mtu = mtu;
    202       iface->next = *irecp;
    203       *irecp = iface;
    204       return 1;
    205     }
    206 
    207   errno = ENOMEM;
    208   return 0;
    209 }
    210 
    211 #ifdef HAVE_IPV6
    212 static int iface_allowed_v6(struct in6_addr *local,
    213 			    int scope, int if_index, void *vparam)
    214 {
    215   union mysockaddr addr;
    216   struct in_addr netmask; /* dummy */
    217 
    218   netmask.s_addr = 0;
    219 
    220   memset(&addr, 0, sizeof(addr));
    221 #ifdef HAVE_SOCKADDR_SA_LEN
    222   addr.in6.sin6_len = sizeof(addr.in6);
    223 #endif
    224   addr.in6.sin6_family = AF_INET6;
    225   addr.in6.sin6_addr = *local;
    226   addr.in6.sin6_port = htons(daemon->port);
    227   /**
    228    * Only populate the scope ID if the address is link-local.
    229    * Scope IDs are not meaningful for global addresses. Also, we do not want to
    230    * think that two addresses are different if they differ only in scope ID,
    231    * because the kernel will treat them as if they are the same.
    232    */
    233   if (IN6_IS_ADDR_LINKLOCAL(local)) {
    234     addr.in6.sin6_scope_id = scope;
    235   }
    236 
    237   return iface_allowed((struct irec **)vparam, if_index, &addr, netmask);
    238 }
    239 #endif
    240 
    241 static int iface_allowed_v4(struct in_addr local, int if_index,
    242 			    struct in_addr netmask, struct in_addr broadcast, void *vparam)
    243 {
    244   union mysockaddr addr;
    245 
    246   memset(&addr, 0, sizeof(addr));
    247 #ifdef HAVE_SOCKADDR_SA_LEN
    248   addr.in.sin_len = sizeof(addr.in);
    249 #endif
    250   addr.in.sin_family = AF_INET;
    251   addr.in.sin_addr = broadcast; /* warning */
    252   addr.in.sin_addr = local;
    253   addr.in.sin_port = htons(daemon->port);
    254 
    255   return iface_allowed((struct irec **)vparam, if_index, &addr, netmask);
    256 }
    257 
    258 int enumerate_interfaces(void)
    259 {
    260 #ifdef HAVE_IPV6
    261   return iface_enumerate(&daemon->interfaces, iface_allowed_v4, iface_allowed_v6);
    262 #else
    263   return iface_enumerate(&daemon->interfaces, iface_allowed_v4, NULL);
    264 #endif
    265 }
    266 
    267 /* set NONBLOCK bit on fd: See Stevens 16.6 */
    268 int fix_fd(int fd)
    269 {
    270   int flags;
    271 
    272   if ((flags = fcntl(fd, F_GETFL)) == -1 ||
    273       fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
    274     return 0;
    275 
    276   return 1;
    277 }
    278 
    279 #if defined(HAVE_IPV6)
    280 static int create_ipv6_listener(struct listener **link, int port)
    281 {
    282   union mysockaddr addr;
    283   int tcpfd, fd;
    284   struct listener *l;
    285   int opt = 1;
    286 
    287   memset(&addr, 0, sizeof(addr));
    288   addr.in6.sin6_family = AF_INET6;
    289   addr.in6.sin6_addr = in6addr_any;
    290   addr.in6.sin6_port = htons(port);
    291 #ifdef HAVE_SOCKADDR_SA_LEN
    292   addr.in6.sin6_len = sizeof(addr.in6);
    293 #endif
    294 
    295   /* No error of the kernel doesn't support IPv6 */
    296   if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
    297     return (errno == EPROTONOSUPPORT ||
    298 	    errno == EAFNOSUPPORT ||
    299 	    errno == EINVAL);
    300 
    301   if ((tcpfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
    302     return 0;
    303 
    304   if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    305       setsockopt(tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    306       setsockopt(fd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
    307       setsockopt(tcpfd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
    308       !fix_fd(fd) ||
    309       !fix_fd(tcpfd) ||
    310 #ifdef IPV6_RECVPKTINFO
    311       setsockopt(fd, IPV6_LEVEL, IPV6_RECVPKTINFO, &opt, sizeof(opt)) == -1 ||
    312 #else
    313       setsockopt(fd, IPV6_LEVEL, IPV6_PKTINFO, &opt, sizeof(opt)) == -1 ||
    314 #endif
    315       bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
    316       listen(tcpfd, 5) == -1 ||
    317       bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
    318     return 0;
    319 
    320   l = safe_malloc(sizeof(struct listener));
    321   l->fd = fd;
    322   l->tcpfd = tcpfd;
    323   l->tftpfd = -1;
    324   l->family = AF_INET6;
    325   l->iface = NULL;
    326   l->next = NULL;
    327   *link = l;
    328 
    329   return 1;
    330 }
    331 #endif
    332 
    333 struct listener *create_wildcard_listeners(void)
    334 {
    335   union mysockaddr addr;
    336   int opt = 1;
    337   struct listener *l, *l6 = NULL;
    338   int tcpfd = -1, fd = -1, tftpfd = -1;
    339 
    340   memset(&addr, 0, sizeof(addr));
    341   addr.in.sin_family = AF_INET;
    342   addr.in.sin_addr.s_addr = INADDR_ANY;
    343   addr.in.sin_port = htons(daemon->port);
    344 #ifdef HAVE_SOCKADDR_SA_LEN
    345   addr.in.sin_len = sizeof(struct sockaddr_in);
    346 #endif
    347 
    348   if (daemon->port != 0)
    349     {
    350 
    351       if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ||
    352 	  (tcpfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    353 	return NULL;
    354 
    355       if (setsockopt(tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    356 	  bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
    357 	  listen(tcpfd, 5) == -1 ||
    358 	  !fix_fd(tcpfd) ||
    359 #ifdef HAVE_IPV6
    360 	  !create_ipv6_listener(&l6, daemon->port) ||
    361 #endif
    362 	  setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    363 	  !fix_fd(fd) ||
    364 #if defined(HAVE_LINUX_NETWORK)
    365 	  setsockopt(fd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt)) == -1 ||
    366 #elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
    367 	  setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)) == -1 ||
    368 	  setsockopt(fd, IPPROTO_IP, IP_RECVIF, &opt, sizeof(opt)) == -1 ||
    369 #endif
    370 	  bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
    371 	return NULL;
    372 
    373 #ifdef __ANDROID__
    374       uint32_t mark = daemon->listen_mark;
    375       if (mark != 0 &&
    376 	  (setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 ||
    377 	   setsockopt(tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 ||
    378 	   setsockopt(l6->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 ||
    379 	   setsockopt(l6->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1))
    380       {
    381 	my_syslog(LOG_WARNING, _("setsockopt(SO_MARK, 0x%x: %s"), mark, strerror(errno));
    382 	close(fd);
    383 	close(tcpfd);
    384 	close(l6->fd);
    385 	close(l6->tcpfd);
    386 	return NULL;
    387       }
    388     }
    389 #endif /* __ANDROID__ */
    390 
    391 #ifdef HAVE_TFTP
    392   if (daemon->options & OPT_TFTP)
    393     {
    394       addr.in.sin_port = htons(TFTP_PORT);
    395       if ((tftpfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    396 	return NULL;
    397 
    398       if (!fix_fd(tftpfd) ||
    399 #if defined(HAVE_LINUX_NETWORK)
    400 	  setsockopt(tftpfd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt)) == -1 ||
    401 #elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
    402 	  setsockopt(tftpfd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)) == -1 ||
    403 	  setsockopt(tftpfd, IPPROTO_IP, IP_RECVIF, &opt, sizeof(opt)) == -1 ||
    404 #endif
    405 	  bind(tftpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
    406 	return NULL;
    407     }
    408 #endif
    409 
    410   l = safe_malloc(sizeof(struct listener));
    411   l->family = AF_INET;
    412   l->fd = fd;
    413   l->tcpfd = tcpfd;
    414   l->tftpfd = tftpfd;
    415   l->iface = NULL;
    416   l->next = l6;
    417 
    418   return l;
    419 }
    420 
    421 #ifdef __ANDROID__
    422 /**
    423  * for a single given irec (interface name and address) create
    424  * a set of sockets listening.  This is a copy of the code inside the loop
    425  * of create_bound_listeners below and is added here to allow us
    426  * to create just a single new listener dynamically when our interface
    427  * list is changed.
    428  *
    429  * iface - input of the new interface details to listen on
    430  * listeners - output.  Creates a new struct listener and inserts at head of the list
    431  *
    432  * die's on errors, so don't pass bad data.
    433  */
    434 void create_bound_listener(struct listener **listeners, struct irec *iface)
    435 {
    436   int rc, opt = 1;
    437 #ifdef HAVE_IPV6
    438   static int dad_count = 0;
    439 #endif
    440 
    441   struct listener *new = safe_malloc(sizeof(struct listener));
    442   new->family = iface->addr.sa.sa_family;
    443   new->iface = iface;
    444   new->next = *listeners;
    445   new->tftpfd = -1;
    446   new->tcpfd = -1;
    447   new->fd = -1;
    448   *listeners = new;
    449 
    450   if (daemon->port != 0)
    451   {
    452     if ((new->tcpfd = socket(iface->addr.sa.sa_family, SOCK_STREAM, 0)) == -1 ||
    453         (new->fd = socket(iface->addr.sa.sa_family, SOCK_DGRAM, 0)) == -1 ||
    454         setsockopt(new->fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    455         setsockopt(new->tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    456         !fix_fd(new->tcpfd) ||
    457         !fix_fd(new->fd))
    458       die(_("failed to create listening socket: %s"), NULL, EC_BADNET);
    459 
    460 #ifdef HAVE_IPV6
    461     if (iface->addr.sa.sa_family == AF_INET6)
    462     {
    463       if (setsockopt(new->fd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
    464           setsockopt(new->tcpfd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1)
    465         die(_("failed to set IPV6 options on listening socket: %s"), NULL, EC_BADNET);\
    466     }
    467 #endif
    468 
    469     while(1)
    470     {
    471       if ((rc = bind(new->fd, &iface->addr.sa, sa_len(&iface->addr))) != -1)
    472         break;
    473 
    474 #ifdef HAVE_IPV6
    475       /* An interface may have an IPv6 address which is still undergoing DAD.
    476          If so, the bind will fail until the DAD completes, so we try over 20 seconds
    477          before failing. */
    478       /* TODO: What to do here? 20 seconds is way too long. We use optimistic addresses, so bind()
    479          will only fail if the address has already failed DAD, in which case retrying won't help. */
    480       if (iface->addr.sa.sa_family == AF_INET6 && (errno == ENODEV || errno == EADDRNOTAVAIL) &&
    481           dad_count++ < DAD_WAIT)
    482       {
    483         sleep(1);
    484         continue;
    485       }
    486 #endif
    487       break;
    488     }
    489 
    490     if (rc == -1 || bind(new->tcpfd, &iface->addr.sa, sa_len(&iface->addr)) == -1)
    491     {
    492       prettyprint_addr(&iface->addr, daemon->namebuff);
    493       die(_("failed to bind listening socket for %s: %s"), daemon->namebuff, EC_BADNET);
    494     }
    495 
    496     uint32_t mark = daemon->listen_mark;
    497     if (mark != 0 &&
    498 	(setsockopt(new->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 ||
    499 	 setsockopt(new->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1))
    500       die(_("failed to set SO_MARK on listen socket: %s"), NULL, EC_BADNET);
    501 
    502     if (listen(new->tcpfd, 5) == -1)
    503       die(_("failed to listen on socket: %s"), NULL, EC_BADNET);
    504   }
    505 
    506 #ifdef HAVE_TFTP
    507   if ((daemon->options & OPT_TFTP) && iface->addr.sa.sa_family == AF_INET && iface->dhcp_ok)
    508   {
    509     short save = iface->addr.in.sin_port;
    510     iface->addr.in.sin_port = htons(TFTP_PORT);
    511     if ((new->tftpfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ||
    512         setsockopt(new->tftpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    513         !fix_fd(new->tftpfd) ||
    514         bind(new->tftpfd, &iface->addr.sa, sa_len(&iface->addr)) == -1)
    515       die(_("failed to create TFTP socket: %s"), NULL, EC_BADNET);
    516     iface->addr.in.sin_port = save;
    517   }
    518 #endif
    519 }
    520 
    521 /**
    522  * If a listener has a struct irec pointer whose address matches the newly
    523  * malloc()d struct irec's address, update its pointer to refer to this new
    524  * struct irec instance.
    525  *
    526  * Otherwise, any listeners that are preserved across interface list changes
    527  * will point at interface structures that are free()d at the end of
    528  * set_interfaces(), and can get overwritten by subsequent memory allocations.
    529  *
    530  * See b/17475756 for further discussion.
    531  */
    532 void fixup_possible_existing_listener(struct irec *new_iface) {
    533   /* find the listener, if present */
    534   struct listener *l;
    535   for (l = daemon->listeners; l; l = l->next) {
    536     struct irec *listener_iface = l->iface;
    537     if (listener_iface) {
    538       if (sockaddr_isequal(&listener_iface->addr, &new_iface->addr)) {
    539         l->iface = new_iface;
    540         return;
    541       }
    542     }
    543   }
    544 }
    545 
    546 /**
    547  * Closes the sockets of the specified listener, deletes it from the list, and frees it.
    548  *
    549  */
    550 int delete_listener(struct listener **l)
    551 {
    552   struct listener *listener = *l;
    553   if (listener == NULL) return 0;
    554 
    555   if (listener->iface) {
    556     int port = prettyprint_addr(&listener->iface->addr, daemon->namebuff);
    557     my_syslog(LOG_INFO, _("Closing listener [%s]:%d"), daemon->namebuff, port);
    558   } else {
    559     my_syslog(LOG_INFO, _("Closing wildcard listener family=%d"), listener->family);
    560   }
    561 
    562   if (listener->tftpfd != -1)
    563   {
    564     close(listener->tftpfd);
    565     listener->tftpfd = -1;
    566   }
    567   if (listener->tcpfd != -1)
    568   {
    569     close(listener->tcpfd);
    570     listener->tcpfd = -1;
    571   }
    572   if (listener->fd != -1)
    573   {
    574     close(listener->fd);
    575     listener->fd = -1;
    576   }
    577   *l = listener->next;
    578   free(listener);
    579   return -1;
    580 }
    581 
    582 /**
    583  * Close the sockets listening on the given interface
    584  *
    585  * This new function is needed as we're dynamically changing the interfaces
    586  * we listen on.  Before they'd be opened once in create_bound_listeners and stay
    587  * until we exited.  Now, if an interface moves off the to-listen list we need to
    588  * close out the listeners and keep trucking.
    589  *
    590  * interface - input of the interface details to listen on
    591  */
    592 int close_bound_listener(struct irec *iface)
    593 {
    594   /* find the listener */
    595   int ret = 0;
    596   struct listener **l = &daemon->listeners;
    597   while (*l) {
    598     struct irec *listener_iface = (*l)->iface;
    599     struct listener **next = &((*l)->next);
    600     if (iface && listener_iface && sockaddr_isequal(&listener_iface->addr, &iface->addr)) {
    601       // Listener bound to an IP address. There can be only one of these.
    602       ret = delete_listener(l);
    603       break;
    604     }
    605     if (iface == NULL && listener_iface == NULL) {
    606       // Wildcard listener. There is one of these per address family.
    607       ret = delete_listener(l);
    608       continue;
    609     }
    610     l = next;
    611   }
    612   return ret;
    613 }
    614 #endif /* __ANDROID__ */
    615 
    616 struct listener *create_bound_listeners(void)
    617 {
    618   struct listener *listeners = NULL;
    619   struct irec *iface;
    620 #ifndef __ANDROID__
    621   int rc, opt = 1;
    622 #ifdef HAVE_IPV6
    623   static int dad_count = 0;
    624 #endif
    625 #endif
    626 
    627   for (iface = daemon->interfaces; iface; iface = iface->next)
    628     {
    629 #ifdef __ANDROID__
    630       create_bound_listener(&listeners, iface);
    631 #else
    632       struct listener *new = safe_malloc(sizeof(struct listener));
    633       new->family = iface->addr.sa.sa_family;
    634       new->iface = iface;
    635       new->next = listeners;
    636       new->tftpfd = -1;
    637       new->tcpfd = -1;
    638       new->fd = -1;
    639       listeners = new;
    640 
    641       if (daemon->port != 0)
    642 	{
    643 	  if ((new->tcpfd = socket(iface->addr.sa.sa_family, SOCK_STREAM, 0)) == -1 ||
    644 	      (new->fd = socket(iface->addr.sa.sa_family, SOCK_DGRAM, 0)) == -1 ||
    645 	      setsockopt(new->fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    646 	      setsockopt(new->tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    647 	      !fix_fd(new->tcpfd) ||
    648 	      !fix_fd(new->fd))
    649 	    die(_("failed to create listening socket: %s"), NULL, EC_BADNET);
    650 
    651 #ifdef HAVE_IPV6
    652 	  if (iface->addr.sa.sa_family == AF_INET6)
    653 	    {
    654 	      if (setsockopt(new->fd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
    655 		  setsockopt(new->tcpfd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1)
    656 		die(_("failed to set IPV6 options on listening socket: %s"), NULL, EC_BADNET);
    657 	    }
    658 #endif
    659 
    660 	  while(1)
    661 	    {
    662 	      if ((rc = bind(new->fd, &iface->addr.sa, sa_len(&iface->addr))) != -1)
    663 		break;
    664 
    665 #ifdef HAVE_IPV6
    666 	      /* An interface may have an IPv6 address which is still undergoing DAD.
    667 		 If so, the bind will fail until the DAD completes, so we try over 20 seconds
    668 		 before failing. */
    669 	      if (iface->addr.sa.sa_family == AF_INET6 && (errno == ENODEV || errno == EADDRNOTAVAIL) &&
    670 		  dad_count++ < DAD_WAIT)
    671 		{
    672 		  sleep(1);
    673 		  continue;
    674 		}
    675 #endif
    676 	      break;
    677 	    }
    678 
    679 	  if (rc == -1 || bind(new->tcpfd, &iface->addr.sa, sa_len(&iface->addr)) == -1)
    680 	    {
    681 	      prettyprint_addr(&iface->addr, daemon->namebuff);
    682 	      die(_("failed to bind listening socket for %s: %s"),
    683 		  daemon->namebuff, EC_BADNET);
    684 	    }
    685 
    686 	  if (listen(new->tcpfd, 5) == -1)
    687 	    die(_("failed to listen on socket: %s"), NULL, EC_BADNET);
    688 	}
    689 
    690 #ifdef HAVE_TFTP
    691       if ((daemon->options & OPT_TFTP) && iface->addr.sa.sa_family == AF_INET && iface->dhcp_ok)
    692 	{
    693 	  short save = iface->addr.in.sin_port;
    694 	  iface->addr.in.sin_port = htons(TFTP_PORT);
    695 	  if ((new->tftpfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ||
    696 	      setsockopt(new->tftpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
    697 	      !fix_fd(new->tftpfd) ||
    698 	      bind(new->tftpfd, &iface->addr.sa, sa_len(&iface->addr)) == -1)
    699 	    die(_("failed to create TFTP socket: %s"), NULL, EC_BADNET);
    700 	  iface->addr.in.sin_port = save;
    701 	}
    702 #endif
    703 #endif /* !__ANDROID */
    704     }
    705 
    706   return listeners;
    707 }
    708 
    709 
    710 /* return a UDP socket bound to a random port, have to cope with straying into
    711    occupied port nos and reserved ones. */
    712 int random_sock(int family)
    713 {
    714   int fd;
    715 
    716   if ((fd = socket(family, SOCK_DGRAM, 0)) != -1)
    717     {
    718       union mysockaddr addr;
    719       unsigned int ports_avail = 65536u - (unsigned short)daemon->min_port;
    720       int tries = ports_avail < 30 ? 3 * ports_avail : 100;
    721 
    722       memset(&addr, 0, sizeof(addr));
    723       addr.sa.sa_family = family;
    724 
    725       /* don't loop forever if all ports in use. */
    726 
    727       if (fix_fd(fd))
    728 	while(tries--)
    729 	  {
    730 	    unsigned short port = rand16();
    731 
    732 	    if (daemon->min_port != 0)
    733 	      port = htons(daemon->min_port + (port % ((unsigned short)ports_avail)));
    734 
    735 	    if (family == AF_INET)
    736 	      {
    737 		addr.in.sin_addr.s_addr = INADDR_ANY;
    738 		addr.in.sin_port = port;
    739 #ifdef HAVE_SOCKADDR_SA_LEN
    740 		addr.in.sin_len = sizeof(struct sockaddr_in);
    741 #endif
    742 	      }
    743 #ifdef HAVE_IPV6
    744 	    else
    745 	      {
    746 		addr.in6.sin6_addr = in6addr_any;
    747 		addr.in6.sin6_port = port;
    748 #ifdef HAVE_SOCKADDR_SA_LEN
    749 		addr.in6.sin6_len = sizeof(struct sockaddr_in6);
    750 #endif
    751 	      }
    752 #endif
    753 
    754 	    if (bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == 0)
    755 	      return fd;
    756 
    757 	    if (errno != EADDRINUSE && errno != EACCES)
    758 	      break;
    759 	  }
    760 
    761       close(fd);
    762     }
    763 
    764   return -1;
    765 }
    766 
    767 
    768 int local_bind(int fd, union mysockaddr *addr, char *intname, uint32_t mark, int is_tcp)
    769 {
    770   union mysockaddr addr_copy = *addr;
    771 
    772   /* cannot set source _port_ for TCP connections. */
    773   if (is_tcp)
    774     {
    775       if (addr_copy.sa.sa_family == AF_INET)
    776 	addr_copy.in.sin_port = 0;
    777 #ifdef HAVE_IPV6
    778       else
    779 	addr_copy.in6.sin6_port = 0;
    780 #endif
    781     }
    782 
    783   if (bind(fd, (struct sockaddr *)&addr_copy, sa_len(&addr_copy)) == -1)
    784     return 0;
    785 
    786 #if defined(SO_BINDTODEVICE)
    787   if (intname[0] != 0 &&
    788       setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, intname, strlen(intname)) == -1)
    789     return 0;
    790 #endif
    791 
    792   if (mark != 0 && setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1)
    793     return 0;
    794 
    795   return 1;
    796 }
    797 
    798 static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname, uint32_t mark)
    799 {
    800   struct serverfd *sfd;
    801   int errsave;
    802 
    803   /* when using random ports, servers which would otherwise use
    804      the INADDR_ANY/port0 socket have sfd set to NULL */
    805   if (!daemon->osport && intname[0] == 0)
    806     {
    807       errno = 0;
    808 
    809       if (addr->sa.sa_family == AF_INET &&
    810 	  addr->in.sin_addr.s_addr == INADDR_ANY &&
    811 	  addr->in.sin_port == htons(0))
    812 	return NULL;
    813 
    814 #ifdef HAVE_IPV6
    815       if (addr->sa.sa_family == AF_INET6 &&
    816 	  memcmp(&addr->in6.sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0 &&
    817 	  addr->in6.sin6_port == htons(0))
    818 	return NULL;
    819 #endif
    820     }
    821 
    822   /* may have a suitable one already */
    823   for (sfd = daemon->sfds; sfd; sfd = sfd->next )
    824     if (sockaddr_isequal(&sfd->source_addr, addr) &&
    825 	mark == sfd->mark &&
    826 	strcmp(intname, sfd->interface) == 0)
    827       return sfd;
    828 
    829   /* need to make a new one. */
    830   errno = ENOMEM; /* in case malloc fails. */
    831   if (!(sfd = whine_malloc(sizeof(struct serverfd))))
    832     return NULL;
    833 
    834   if ((sfd->fd = socket(addr->sa.sa_family, SOCK_DGRAM, 0)) == -1)
    835     {
    836       free(sfd);
    837       return NULL;
    838     }
    839 
    840   if (!local_bind(sfd->fd, addr, intname, mark, 0) || !fix_fd(sfd->fd))
    841     {
    842       errsave = errno; /* save error from bind. */
    843       close(sfd->fd);
    844       free(sfd);
    845       errno = errsave;
    846       return NULL;
    847     }
    848 
    849   strcpy(sfd->interface, intname);
    850   sfd->source_addr = *addr;
    851   sfd->mark = mark;
    852   sfd->next = daemon->sfds;
    853   daemon->sfds = sfd;
    854   return sfd;
    855 }
    856 
    857 /* create upstream sockets during startup, before root is dropped which may be needed
    858    this allows query_port to be a low port and interface binding */
    859 void pre_allocate_sfds(void)
    860 {
    861   struct server *srv;
    862 
    863   if (daemon->query_port != 0)
    864     {
    865       union  mysockaddr addr;
    866       memset(&addr, 0, sizeof(addr));
    867       addr.in.sin_family = AF_INET;
    868       addr.in.sin_addr.s_addr = INADDR_ANY;
    869       addr.in.sin_port = htons(daemon->query_port);
    870 #ifdef HAVE_SOCKADDR_SA_LEN
    871       addr.in.sin_len = sizeof(struct sockaddr_in);
    872 #endif
    873       allocate_sfd(&addr, "", 0);
    874 #ifdef HAVE_IPV6
    875       memset(&addr, 0, sizeof(addr));
    876       addr.in6.sin6_family = AF_INET6;
    877       addr.in6.sin6_addr = in6addr_any;
    878       addr.in6.sin6_port = htons(daemon->query_port);
    879 #ifdef HAVE_SOCKADDR_SA_LEN
    880       addr.in6.sin6_len = sizeof(struct sockaddr_in6);
    881 #endif
    882       allocate_sfd(&addr, "", 0);
    883 #endif
    884     }
    885 
    886   for (srv = daemon->servers; srv; srv = srv->next)
    887     if (!(srv->flags & (SERV_LITERAL_ADDRESS | SERV_NO_ADDR)) &&
    888 	!allocate_sfd(&srv->source_addr, srv->interface, srv->mark) &&
    889 	errno != 0 &&
    890 	(daemon->options & OPT_NOWILD))
    891       {
    892 	prettyprint_addr(&srv->addr, daemon->namebuff);
    893 	if (srv->interface[0] != 0)
    894 	  {
    895 	    strcat(daemon->namebuff, " ");
    896 	    strcat(daemon->namebuff, srv->interface);
    897 	  }
    898 	die(_("failed to bind server socket for %s: %s"),
    899 	    daemon->namebuff, EC_BADNET);
    900       }
    901 }
    902 
    903 
    904 void check_servers(void)
    905 {
    906   struct irec *iface;
    907   struct server *new, *tmp, *ret = NULL;
    908   int port = 0;
    909 
    910   for (new = daemon->servers; new; new = tmp)
    911     {
    912       tmp = new->next;
    913 
    914       if (!(new->flags & (SERV_LITERAL_ADDRESS | SERV_NO_ADDR)))
    915 	{
    916 	  port = prettyprint_addr(&new->addr, daemon->namebuff);
    917 
    918 	  /* 0.0.0.0 is nothing, the stack treats it like 127.0.0.1 */
    919 	  if (new->addr.sa.sa_family == AF_INET &&
    920 	      new->addr.in.sin_addr.s_addr == 0)
    921 	    {
    922 	      free(new);
    923 	      continue;
    924 	    }
    925 
    926 	  for (iface = daemon->interfaces; iface; iface = iface->next)
    927 	    if (sockaddr_isequal(&new->addr, &iface->addr))
    928 	      break;
    929 	  if (iface)
    930 	    {
    931 	      my_syslog(LOG_WARNING, _("ignoring nameserver %s - local interface"), daemon->namebuff);
    932 	      free(new);
    933 	      continue;
    934 	    }
    935 
    936 	  /* Do we need a socket set? */
    937 	  if (!new->sfd &&
    938 	      !(new->sfd = allocate_sfd(&new->source_addr, new->interface, new->mark)) &&
    939 	      errno != 0)
    940 	    {
    941 	      my_syslog(LOG_WARNING,
    942 			_("ignoring nameserver %s - cannot make/bind socket: %s"),
    943 			daemon->namebuff, strerror(errno));
    944 	      free(new);
    945 	      continue;
    946 	    }
    947 	}
    948 
    949       /* reverse order - gets it right. */
    950       new->next = ret;
    951       ret = new;
    952 
    953       if (new->flags & (SERV_HAS_DOMAIN | SERV_FOR_NODOTS))
    954 	{
    955 	  char *s1, *s2;
    956 	  if (!(new->flags & SERV_HAS_DOMAIN))
    957 	    s1 = _("unqualified"), s2 = _("names");
    958 	  else if (strlen(new->domain) == 0)
    959 	    s1 = _("default"), s2 = "";
    960 	  else
    961 	    s1 = _("domain"), s2 = new->domain;
    962 
    963 	  if (new->flags & SERV_NO_ADDR)
    964 	    my_syslog(LOG_INFO, _("using local addresses only for %s %s"), s1, s2);
    965 	  else if (!(new->flags & SERV_LITERAL_ADDRESS))
    966 	    my_syslog(LOG_INFO, _("using nameserver %s#%d for %s %s"), daemon->namebuff, port, s1, s2);
    967 	}
    968       else if (new->interface[0] != 0)
    969 	my_syslog(LOG_INFO, _("using nameserver %s#%d(via %s)"), daemon->namebuff, port, new->interface);
    970       else
    971 	my_syslog(LOG_INFO, _("using nameserver %s#%d"), daemon->namebuff, port);
    972     }
    973 
    974   daemon->servers = ret;
    975 }
    976 
    977 #if defined(__ANDROID__) && !defined(__BRILLO__)
    978 /* #define __ANDROID_DEBUG__ 1 */
    979 /*
    980  * Ingests a new list of interfaces and starts to listen on them, adding only the new
    981  * and stopping to listen to any interfaces not on the new list.
    982  *
    983  * interfaces - input in the format "bt-pan|eth0|wlan0|..>" up to 1024 bytes long
    984  */
    985 void set_interfaces(const char *interfaces)
    986 {
    987     struct iname *if_tmp;
    988     struct iname *prev_if_names;
    989     struct irec *old_iface, *new_iface, *prev_interfaces;
    990     char s[1024];
    991     char *next = s;
    992     char *interface;
    993     int was_wild = 0;
    994 
    995 #ifdef __ANDROID_DEBUG__
    996     my_syslog(LOG_DEBUG, _("set_interfaces(%s)"), interfaces);
    997 #endif
    998     prev_if_names = daemon->if_names;
    999     daemon->if_names = NULL;
   1000 
   1001     prev_interfaces = daemon->interfaces;
   1002     daemon->interfaces = NULL;
   1003 
   1004     if (strlen(interfaces) > sizeof(s)) {
   1005         die(_("interface string too long: %s"), NULL, EC_BADNET);
   1006     }
   1007     strncpy(s, interfaces, sizeof(s));
   1008     while((interface = strsep(&next, SEPARATOR))) {
   1009         if (!if_nametoindex(interface)) {
   1010             my_syslog(LOG_ERR,
   1011                     _("interface given in %s: '%s' has no ifindex; ignoring"),
   1012                     __FUNCTION__, interface);
   1013             continue;
   1014         }
   1015         if_tmp = safe_malloc(sizeof(struct iname));
   1016         memset(if_tmp, 0, sizeof(struct iname));
   1017         if ((if_tmp->name = strdup(interface)) == NULL) {
   1018             die(_("malloc failure in set_interfaces: %s"), NULL, EC_BADNET);
   1019         }
   1020         if_tmp->next = daemon->if_names;
   1021         daemon->if_names = if_tmp;
   1022     }
   1023 
   1024     /*
   1025      * Enumerate IP addresses (via RTM_GETADDR), adding IP entries to
   1026      * daemon->interfaces for interface names listed in daemon->if_names.
   1027      * The sockets are created by the create_bound_listener call below.
   1028      */
   1029     if (!enumerate_interfaces()) {
   1030         die(_("enumerate interfaces error in set_interfaces: %s"), NULL, EC_BADNET);
   1031     }
   1032 
   1033     for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next) {
   1034         if (if_tmp->name && !if_tmp->used) {
   1035             my_syslog(LOG_ERR, _("unknown interface given %s in set_interfaces()"), if_tmp->name);
   1036         }
   1037     }
   1038 
   1039     /* success! - setup to free the old */
   1040     /* check for any that have been removed */
   1041     for (old_iface = prev_interfaces; old_iface; old_iface=old_iface->next) {
   1042       int found = 0;
   1043       for (new_iface = daemon->interfaces; new_iface; new_iface = new_iface->next) {
   1044         if (sockaddr_isequal(&old_iface->addr, &new_iface->addr)) {
   1045             found = 1;
   1046             break;
   1047         }
   1048       }
   1049 
   1050       if (found) {
   1051         fixup_possible_existing_listener(new_iface);
   1052       } else {
   1053 #ifdef __ANDROID_DEBUG__
   1054         char debug_buff[MAXDNAME];
   1055         prettyprint_addr(&old_iface->addr, debug_buff);
   1056         my_syslog(LOG_DEBUG, _("closing listener for %s"), debug_buff);
   1057 #endif
   1058 
   1059         close_bound_listener(old_iface);
   1060       }
   1061     }
   1062 
   1063     /* remove wildchar listeners */
   1064     was_wild = close_bound_listener(NULL);
   1065     if (was_wild) daemon->options |= OPT_NOWILD;
   1066 
   1067     /* check for any that have been added */
   1068     for (new_iface = daemon->interfaces; new_iface; new_iface = new_iface->next) {
   1069       int found = 0;
   1070 
   1071       /* if the previous setup used a wildchar, then add any current interfaces */
   1072       if (!was_wild) {
   1073         for (old_iface = prev_interfaces; old_iface; old_iface = old_iface->next) {
   1074           if(sockaddr_isequal(&old_iface->addr, &new_iface->addr)) {
   1075             found = -1;
   1076             break;
   1077           }
   1078         }
   1079       }
   1080       if (!found) {
   1081 #ifdef __ANDROID_DEBUG__
   1082         char debug_buff[MAXDNAME];
   1083         prettyprint_addr(&new_iface->addr, debug_buff);
   1084         my_syslog(LOG_DEBUG, _("adding listener for %s"), debug_buff);
   1085 #endif
   1086         create_bound_listener(&(daemon->listeners), new_iface);
   1087       }
   1088     }
   1089 
   1090     while (prev_if_names) {
   1091       if (prev_if_names->name) free(prev_if_names->name);
   1092       if_tmp = prev_if_names->next;
   1093       free(prev_if_names);
   1094       prev_if_names = if_tmp;
   1095     }
   1096     while (prev_interfaces) {
   1097       struct irec *tmp_irec = prev_interfaces->next;
   1098       free(prev_interfaces);
   1099       prev_interfaces = tmp_irec;
   1100     }
   1101 #ifdef __ANDROID_DEBUG__
   1102     my_syslog(LOG_DEBUG, _("done with setInterfaces"));
   1103 #endif
   1104 }
   1105 
   1106 /*
   1107  * Takes a string in the format "0x100b|1.2.3.4|1.2.3.4|..." - up to 1024 bytes in length
   1108  *  - The first element is the socket mark to set on sockets that forward DNS queries.
   1109  *  - The subsequent elements are the DNS servers to forward queries to.
   1110  */
   1111 int set_servers(const char *servers)
   1112 {
   1113   char s[1024];
   1114   struct server *old_servers = NULL;
   1115   struct server *new_servers = NULL;
   1116   struct server *serv;
   1117   char *mark_string;
   1118   uint32_t mark;
   1119 
   1120   strncpy(s, servers, sizeof(s));
   1121 
   1122   /* move old servers to free list - we can reuse the memory
   1123      and not risk malloc if there are the same or fewer new servers.
   1124      Servers which were specced on the command line go to the new list. */
   1125   for (serv = daemon->servers; serv;)
   1126     {
   1127       struct server *tmp = serv->next;
   1128       if (serv->flags & SERV_FROM_RESOLV)
   1129 	{
   1130 	  serv->next = old_servers;
   1131 	  old_servers = serv;
   1132 	  /* forward table rules reference servers, so have to blow them away */
   1133 	  server_gone(serv);
   1134 	}
   1135       else
   1136 	{
   1137 	  serv->next = new_servers;
   1138 	  new_servers = serv;
   1139 	}
   1140       serv = tmp;
   1141     }
   1142 
   1143   char *next = s;
   1144   char *saddr;
   1145 
   1146   /* Parse the mark. */
   1147   mark_string = strsep(&next, SEPARATOR);
   1148   mark = strtoul(mark_string, NULL, 0);
   1149 
   1150   while ((saddr = strsep(&next, SEPARATOR))) {
   1151       union mysockaddr addr, source_addr;
   1152       memset(&addr, 0, sizeof(addr));
   1153       memset(&source_addr, 0, sizeof(source_addr));
   1154 
   1155       if (parse_addr(AF_INET, saddr, &addr) == 0)
   1156 	{
   1157 	  addr.in.sin_port = htons(NAMESERVER_PORT);
   1158 	  source_addr.in.sin_family = AF_INET;
   1159 	  source_addr.in.sin_addr.s_addr = INADDR_ANY;
   1160 	  source_addr.in.sin_port = htons(daemon->query_port);
   1161 	}
   1162 #ifdef HAVE_IPV6
   1163       else if (parse_addr(AF_INET6, saddr, &addr) == 0)
   1164 	{
   1165 	  addr.in6.sin6_port = htons(NAMESERVER_PORT);
   1166 	  source_addr.in6.sin6_family = AF_INET6;
   1167 	  source_addr.in6.sin6_addr = in6addr_any;
   1168 	  source_addr.in6.sin6_port = htons(daemon->query_port);
   1169 	}
   1170 #endif /* IPV6 */
   1171       else
   1172 	continue;
   1173 
   1174       if (old_servers)
   1175 	{
   1176 	  serv = old_servers;
   1177 	  old_servers = old_servers->next;
   1178 	}
   1179       else if (!(serv = whine_malloc(sizeof (struct server))))
   1180 	continue;
   1181 
   1182       /* this list is reverse ordered:
   1183 	 it gets reversed again in check_servers */
   1184       serv->next = new_servers;
   1185       new_servers = serv;
   1186       serv->addr = addr;
   1187       serv->source_addr = source_addr;
   1188       serv->domain = NULL;
   1189       serv->interface[0] = 0;
   1190       serv->mark = mark;
   1191       serv->sfd = NULL;
   1192       serv->flags = SERV_FROM_RESOLV;
   1193       serv->queries = serv->failed_queries = 0;
   1194     }
   1195 
   1196   /* Free any memory not used. */
   1197   while (old_servers)
   1198     {
   1199       struct server *tmp = old_servers->next;
   1200       free(old_servers);
   1201       old_servers = tmp;
   1202     }
   1203 
   1204   daemon->servers = new_servers;
   1205   return 0;
   1206 }
   1207 #endif
   1208 
   1209 /* Return zero if no servers found, in that case we keep polling.
   1210    This is a protection against an update-time/write race on resolv.conf */
   1211 int reload_servers(char *fname)
   1212 {
   1213   FILE *f;
   1214   char *line;
   1215   struct server *old_servers = NULL;
   1216   struct server *new_servers = NULL;
   1217   struct server *serv;
   1218   int gotone = 0;
   1219 
   1220   /* buff happens to be MAXDNAME long... */
   1221   if (!(f = fopen(fname, "r")))
   1222     {
   1223       my_syslog(LOG_ERR, _("failed to read %s: %s"), fname, strerror(errno));
   1224       return 0;
   1225     }
   1226 
   1227   /* move old servers to free list - we can reuse the memory
   1228      and not risk malloc if there are the same or fewer new servers.
   1229      Servers which were specced on the command line go to the new list. */
   1230   for (serv = daemon->servers; serv;)
   1231     {
   1232       struct server *tmp = serv->next;
   1233       if (serv->flags & SERV_FROM_RESOLV)
   1234 	{
   1235 	  serv->next = old_servers;
   1236 	  old_servers = serv;
   1237 	  /* forward table rules reference servers, so have to blow them away */
   1238 	  server_gone(serv);
   1239 	}
   1240       else
   1241 	{
   1242 	  serv->next = new_servers;
   1243 	  new_servers = serv;
   1244 	}
   1245       serv = tmp;
   1246     }
   1247 
   1248   while ((line = fgets(daemon->namebuff, MAXDNAME, f)))
   1249     {
   1250       union mysockaddr addr, source_addr;
   1251       char *token = strtok(line, " \t\n\r");
   1252 
   1253       if (!token)
   1254 	continue;
   1255       if (strcmp(token, "nameserver") != 0 && strcmp(token, "server") != 0)
   1256 	continue;
   1257       if (!(token = strtok(NULL, " \t\n\r")))
   1258 	continue;
   1259 
   1260       memset(&addr, 0, sizeof(addr));
   1261       memset(&source_addr, 0, sizeof(source_addr));
   1262 
   1263       if (parse_addr(AF_INET, token, &addr) == 0)
   1264 	{
   1265 	  addr.in.sin_port = htons(NAMESERVER_PORT);
   1266 	  source_addr.in.sin_family = AF_INET;
   1267 	  source_addr.in.sin_addr.s_addr = INADDR_ANY;
   1268 	  source_addr.in.sin_port = htons(daemon->query_port);
   1269 	}
   1270 #ifdef HAVE_IPV6
   1271       else if (parse_addr(AF_INET6, token, &addr) == 0)
   1272 	{
   1273 	  addr.in6.sin6_port = htons(NAMESERVER_PORT);
   1274 	  source_addr.in6.sin6_family = AF_INET6;
   1275 	  source_addr.in6.sin6_addr = in6addr_any;
   1276 	  source_addr.in6.sin6_port = htons(daemon->query_port);
   1277 	}
   1278 #endif /* IPV6 */
   1279       else
   1280 	continue;
   1281 
   1282       if (old_servers)
   1283 	{
   1284 	  serv = old_servers;
   1285 	  old_servers = old_servers->next;
   1286 	}
   1287       else if (!(serv = whine_malloc(sizeof (struct server))))
   1288 	continue;
   1289 
   1290       /* this list is reverse ordered:
   1291 	 it gets reversed again in check_servers */
   1292       serv->next = new_servers;
   1293       new_servers = serv;
   1294       serv->addr = addr;
   1295       serv->source_addr = source_addr;
   1296       serv->domain = NULL;
   1297       serv->interface[0] = 0;
   1298       serv->mark = 0;
   1299       serv->sfd = NULL;
   1300       serv->flags = SERV_FROM_RESOLV;
   1301       serv->queries = serv->failed_queries = 0;
   1302       gotone = 1;
   1303     }
   1304 
   1305   /* Free any memory not used. */
   1306   while (old_servers)
   1307     {
   1308       struct server *tmp = old_servers->next;
   1309       free(old_servers);
   1310       old_servers = tmp;
   1311     }
   1312 
   1313   daemon->servers = new_servers;
   1314   fclose(f);
   1315 
   1316   return gotone;
   1317 }
   1318 
   1319 
   1320 /* Use an IPv4 listener socket for ioctling */
   1321 struct in_addr get_ifaddr(char *intr)
   1322 {
   1323   struct listener *l;
   1324   struct ifreq ifr;
   1325 
   1326   for (l = daemon->listeners; l && l->family != AF_INET; l = l->next);
   1327 
   1328   strncpy(ifr.ifr_name, intr, IF_NAMESIZE);
   1329   ifr.ifr_addr.sa_family = AF_INET;
   1330 
   1331   if (!l || ioctl(l->fd, SIOCGIFADDR, &ifr) == -1)
   1332     ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = -1;
   1333 
   1334   return ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
   1335 }
   1336