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