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