• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <sys/stat.h>
20 
21 #if defined(HAVE_BSD_NETWORK)
22 #error Should not HAVE_BSD_NETWORK
23 #endif
24 
25 #if defined(HAVE_SOCKADDR_SA_LEN)
26 #error Should not HAVE_SOCKADDR_SA_LEN
27 #endif
28 
29 #if defined(HAVE_SOLARIS_NETWORK)
30 #error Should not HAVE_SOLARIS_NETWORK
31 #endif
32 
33 #if !defined(HAVE_LINUX_NETWORK)
34 #error Should HAVE_LINUX_NETWORK
35 #endif
36 
37 struct daemon* daemon;
38 
39 static char* compile_opts =
40 #ifndef HAVE_IPV6
41     "no-"
42 #endif
43     "IPv6 "
44 #ifndef HAVE_GETOPT_LONG
45     "no-"
46 #endif
47     "GNU-getopt "
48 #ifdef HAVE_BROKEN_RTC
49     "no-RTC "
50 #endif
51 #ifdef NO_FORK
52     "no-MMU "
53 #endif
54 #ifndef LOCALEDIR
55     "no-"
56 #endif
57     "I18N "
58 #ifndef HAVE_DHCP
59     "no-"
60 #endif
61     "DHCP "
62 #if defined(HAVE_DHCP) && !defined(HAVE_SCRIPT)
63     "no-scripts"
64 #endif
65     "";
66 
67 static volatile pid_t pid = 0;
68 static volatile int pipewrite;
69 
70 static int set_dns_listeners(time_t now, fd_set* set, int* maxfdp);
71 static void check_dns_listeners(fd_set* set, time_t now);
72 static void sig_handler(int sig);
73 static void async_event(int pipe, time_t now);
74 static void fatal_event(struct event_desc* ev);
75 static void poll_resolv(void);
76 #ifdef __ANDROID__
77 static int set_android_listeners(fd_set* set, int* maxfdp);
78 static int check_android_listeners(fd_set* set);
79 #endif
80 
setupSignalHandling()81 void setupSignalHandling() {
82     struct sigaction sigact;
83 
84     sigact.sa_handler = sig_handler;
85     sigact.sa_flags = 0;
86     sigemptyset(&sigact.sa_mask);
87     sigaction(SIGUSR1, &sigact, NULL);
88     sigaction(SIGUSR2, &sigact, NULL);
89     sigaction(SIGHUP, &sigact, NULL);
90     sigaction(SIGTERM, &sigact, NULL);
91     sigaction(SIGALRM, &sigact, NULL);
92     sigaction(SIGCHLD, &sigact, NULL);
93 
94     /* ignore SIGPIPE */
95     sigact.sa_handler = SIG_IGN;
96     sigaction(SIGPIPE, &sigact, NULL);
97 }
98 
closeUnwantedFileDescriptors()99 void closeUnwantedFileDescriptors() {
100     const long kMaxFd = sysconf(_SC_OPEN_MAX);
101     long i;
102     struct stat stat_buf;
103 
104     /* Close any file descriptors we inherited apart from std{in|out|err}. */
105     for (i = 0; i < kMaxFd; i++) {
106         // TODO: Evaluate just skipping STDIN, since netd does not
107         // (intentionally) pass in any other file descriptors.
108         if (i == STDOUT_FILENO || i == STDERR_FILENO || i == STDIN_FILENO) {
109             continue;
110         }
111 
112         if (fstat(i, &stat_buf) != 0) {
113             if (errno == EBADF) continue;
114             if (errno == EACCES) continue;  // Lessen the log spam.
115             my_syslog(LOG_ERR, "fstat(%d) error: %d/%s", i, errno, strerror(errno));
116         } else {
117             my_syslog(LOG_ERR, "Closing inherited file descriptor %d (%u:%u)", i, stat_buf.st_dev,
118                       stat_buf.st_ino);
119         }
120         close(i);
121     }
122 }
123 
main(int argc,char ** argv)124 int main(int argc, char** argv) {
125     int bind_fallback = 0;
126     time_t now;
127     struct iname* if_tmp;
128     int piperead, pipefd[2], err_pipe[2];
129     struct passwd* ent_pw = NULL;
130 #if defined(HAVE_DHCP) && defined(HAVE_SCRIPT)
131     uid_t script_uid = 0;
132     gid_t script_gid = 0;
133 #endif
134     struct group* gp = NULL;
135     long i, max_fd = sysconf(_SC_OPEN_MAX);
136     char* baduser = NULL;
137     int log_err;
138 #if defined(HAVE_LINUX_NETWORK)
139     cap_user_header_t hdr = NULL;
140     cap_user_data_t data = NULL;
141 #endif
142 
143 #ifdef LOCALEDIR
144     setlocale(LC_ALL, "");
145     bindtextdomain("dnsmasq", LOCALEDIR);
146     textdomain("dnsmasq");
147 #endif
148 
149     setupSignalHandling();
150 
151     umask(022); /* known umask, create leases and pid files as 0644 */
152 
153     read_opts(argc, argv, compile_opts);
154 
155     if (daemon->edns_pktsz < PACKETSZ) daemon->edns_pktsz = PACKETSZ;
156     daemon->packet_buff_sz =
157         daemon->edns_pktsz > DNSMASQ_PACKETSZ ? daemon->edns_pktsz : DNSMASQ_PACKETSZ;
158     daemon->packet = safe_malloc(daemon->packet_buff_sz);
159 
160 #ifdef HAVE_DHCP
161     if (!daemon->lease_file) {
162         if (daemon->dhcp) daemon->lease_file = LEASEFILE;
163     }
164 #endif
165 
166     closeUnwantedFileDescriptors();
167 
168 #ifdef HAVE_LINUX_NETWORK
169     netlink_init();
170 #elif !(defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR))
171     if (!(daemon->options & OPT_NOWILD)) {
172         bind_fallback = 1;
173         daemon->options |= OPT_NOWILD;
174     }
175 #endif
176 
177     rand_init();
178 
179     now = dnsmasq_time();
180 
181 #ifdef HAVE_DHCP
182     if (daemon->dhcp) {
183         /* Note that order matters here, we must call lease_init before
184        creating any file descriptors which shouldn't be leaked
185        to the lease-script init process. */
186         lease_init(now);
187         dhcp_init();
188     }
189 #endif
190 
191     if (!enumerate_interfaces()) die(_("failed to find list of interfaces: %s"), NULL, EC_MISC);
192 
193     if (daemon->options & OPT_NOWILD) {
194         daemon->listeners = create_bound_listeners();
195 
196         for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
197             if (if_tmp->name && !if_tmp->used)
198                 die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
199 
200         for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next)
201             if (!if_tmp->used) {
202                 prettyprint_addr(&if_tmp->addr, daemon->namebuff);
203                 die(_("no interface with address %s"), daemon->namebuff, EC_BADNET);
204             }
205     } else if ((daemon->port != 0 || (daemon->options & OPT_TFTP)) &&
206                !(daemon->listeners = create_wildcard_listeners()))
207         die(_("failed to create listening socket: %s"), NULL, EC_BADNET);
208 
209     if (daemon->port != 0) cache_init();
210 
211     if (daemon->port != 0) pre_allocate_sfds();
212 
213 #if defined(HAVE_DHCP) && defined(HAVE_SCRIPT)
214     /* Note getpwnam returns static storage */
215     if (daemon->dhcp && daemon->lease_change_command && daemon->scriptuser) {
216         if ((ent_pw = getpwnam(daemon->scriptuser))) {
217             script_uid = ent_pw->pw_uid;
218             script_gid = ent_pw->pw_gid;
219         } else
220             baduser = daemon->scriptuser;
221     }
222 #endif
223 
224     if (daemon->username && !(ent_pw = getpwnam(daemon->username)))
225         baduser = daemon->username;
226     else if (daemon->groupname && !(gp = getgrnam(daemon->groupname)))
227         baduser = daemon->groupname;
228 
229     if (baduser) die(_("unknown user or group: %s"), baduser, EC_BADCONF);
230 
231     /* implement group defaults, "dip" if available, or group associated with uid */
232     if (!daemon->group_set && !gp) {
233         if (!(gp = getgrnam(CHGRP)) && ent_pw) gp = getgrgid(ent_pw->pw_gid);
234 
235         /* for error message */
236         if (gp) daemon->groupname = gp->gr_name;
237     }
238 
239 #if defined(HAVE_LINUX_NETWORK)
240     /* determine capability API version here, while we can still
241        call safe_malloc */
242     if (ent_pw && ent_pw->pw_uid != 0) {
243         int capsize = 1; /* for header version 1 */
244         hdr = safe_malloc(sizeof(*hdr));
245 
246         /* find version supported by kernel */
247         memset(hdr, 0, sizeof(*hdr));
248         capget(hdr, NULL);
249 
250         if (hdr->version != LINUX_CAPABILITY_VERSION_1) {
251             /* if unknown version, use largest supported version (3) */
252             if (hdr->version != LINUX_CAPABILITY_VERSION_2)
253                 hdr->version = LINUX_CAPABILITY_VERSION_3;
254             capsize = 2;
255         }
256 
257         data = safe_malloc(sizeof(*data) * capsize);
258         memset(data, 0, sizeof(*data) * capsize);
259     }
260 #endif
261 
262     /* Use a pipe to carry signals and other events back to the event loop
263        in a race-free manner and another to carry errors to daemon-invoking process */
264     safe_pipe(pipefd, 1);
265 
266     piperead = pipefd[0];
267     pipewrite = pipefd[1];
268     /* prime the pipe to load stuff first time. */
269     send_event(pipewrite, EVENT_RELOAD, 0);
270 
271     err_pipe[1] = -1;
272 
273     if (!(daemon->options & OPT_DEBUG)) {
274 #ifndef __ANDROID__
275         int nullfd;
276 #endif
277 
278         /* The following code "daemonizes" the process.
279        See Stevens section 12.4 */
280 
281         if (chdir("/") != 0) die(_("cannot chdir to filesystem root: %s"), NULL, EC_MISC);
282 
283 #ifndef NO_FORK
284         if (!(daemon->options & OPT_NO_FORK)) {
285             pid_t pid;
286 
287             /* pipe to carry errors back to original process.
288                When startup is complete we close this and the process terminates. */
289             safe_pipe(err_pipe, 0);
290 
291             if ((pid = fork()) == -1) /* fd == -1 since we've not forked, never returns. */
292                 send_event(-1, EVENT_FORK_ERR, errno);
293 
294             if (pid != 0) {
295                 struct event_desc ev;
296 
297                 /* close our copy of write-end */
298                 close(err_pipe[1]);
299 
300                 /* check for errors after the fork */
301                 if (read_write(err_pipe[0], (unsigned char*) &ev, sizeof(ev), 1)) fatal_event(&ev);
302 
303                 _exit(EC_GOOD);
304             }
305 
306             close(err_pipe[0]);
307 
308             /* NO calls to die() from here on. */
309 
310             setsid();
311 
312             if ((pid = fork()) == -1) send_event(err_pipe[1], EVENT_FORK_ERR, errno);
313 
314             if (pid != 0) _exit(0);
315         }
316 #endif
317 
318         /* write pidfile _after_ forking ! */
319         if (daemon->runfile) {
320             FILE* pidfile;
321 
322             /* only complain if started as root */
323             if ((pidfile = fopen(daemon->runfile, "w"))) {
324                 fprintf(pidfile, "%d\n", (int) getpid());
325                 fclose(pidfile);
326             } else if (getuid() == 0) {
327                 send_event(err_pipe[1], EVENT_PIDFILE, errno);
328                 _exit(0);
329             }
330         }
331 
332 #ifndef __ANDROID__
333         /* open  stdout etc to /dev/null */
334         nullfd = open("/dev/null", O_RDWR);
335         dup2(nullfd, STDOUT_FILENO);
336         dup2(nullfd, STDERR_FILENO);
337         dup2(nullfd, STDIN_FILENO);
338         close(nullfd);
339 #endif
340     }
341 
342     log_err = log_start(ent_pw, err_pipe[1]);
343 
344     /* if we are to run scripts, we need to fork a helper before dropping root. */
345     daemon->helperfd = -1;
346 #if defined(HAVE_DHCP) && defined(HAVE_SCRIPT)
347     if (daemon->dhcp && daemon->lease_change_command)
348         daemon->helperfd = create_helper(pipewrite, err_pipe[1], script_uid, script_gid, max_fd);
349 #endif
350 
351     if (!(daemon->options & OPT_DEBUG) && getuid() == 0) {
352         int bad_capabilities = 0;
353         gid_t dummy;
354 
355         /* remove all supplimentary groups */
356         if (gp && (setgroups(0, &dummy) == -1 || setgid(gp->gr_gid) == -1)) {
357             send_event(err_pipe[1], EVENT_GROUP_ERR, errno);
358             _exit(0);
359         }
360 
361         if (ent_pw && ent_pw->pw_uid != 0) {
362 #if defined(HAVE_LINUX_NETWORK)
363             /* On linux, we keep CAP_NETADMIN (for ARP-injection) and
364                CAP_NET_RAW (for icmp) if we're doing dhcp */
365             data->effective = data->permitted = data->inheritable =
366 #ifdef __ANDROID__
367                 (1 << CAP_NET_BIND_SERVICE) |
368 #endif
369                 (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | (1 << CAP_SETUID);
370 
371             /* Tell kernel to not clear capabilities when dropping root */
372             if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1)
373                 bad_capabilities = errno;
374 
375 #endif
376 
377             if (bad_capabilities != 0) {
378                 send_event(err_pipe[1], EVENT_CAP_ERR, bad_capabilities);
379                 _exit(0);
380             }
381 
382             /* finally drop root */
383             if (setuid(ent_pw->pw_uid) == -1) {
384                 send_event(err_pipe[1], EVENT_USER_ERR, errno);
385                 _exit(0);
386             }
387 
388 #ifdef HAVE_LINUX_NETWORK
389             data->effective = data->permitted =
390 #ifdef __ANDROID__
391                 (1 << CAP_NET_BIND_SERVICE) |
392 #endif
393                 (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
394             data->inheritable = 0;
395 
396             /* lose the setuid and setgid capbilities */
397             if (capset(hdr, data) == -1) {
398                 send_event(err_pipe[1], EVENT_CAP_ERR, errno);
399                 _exit(0);
400             }
401 #endif
402         }
403     }
404 
405 #ifdef HAVE_LINUX_NETWORK
406     if (daemon->options & OPT_DEBUG) prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
407 #endif
408 
409     if (daemon->port == 0)
410         my_syslog(LOG_INFO, _("started, version %s DNS disabled"), VERSION);
411     else if (daemon->cachesize != 0)
412         my_syslog(LOG_INFO, _("started, version %s cachesize %d"), VERSION, daemon->cachesize);
413     else
414         my_syslog(LOG_INFO, _("started, version %s cache disabled"), VERSION);
415 
416     my_syslog(LOG_INFO, _("compile time options: %s"), compile_opts);
417 
418     if (log_err != 0)
419         my_syslog(LOG_WARNING, _("warning: failed to change owner of %s: %s"), daemon->log_file,
420                   strerror(log_err));
421 
422     if (bind_fallback)
423         my_syslog(LOG_WARNING, _("setting --bind-interfaces option because of OS limitations"));
424 
425     if (!(daemon->options & OPT_NOWILD))
426         for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
427             if (if_tmp->name && !if_tmp->used)
428                 my_syslog(LOG_WARNING, _("warning: interface %s does not currently exist"),
429                           if_tmp->name);
430 
431     if (daemon->port != 0 && (daemon->options & OPT_NO_RESOLV)) {
432         if (daemon->resolv_files && !daemon->resolv_files->is_default)
433             my_syslog(LOG_WARNING,
434                       _("warning: ignoring resolv-file flag because no-resolv is set"));
435         daemon->resolv_files = NULL;
436         if (!daemon->servers) my_syslog(LOG_WARNING, _("warning: no upstream servers configured"));
437     }
438 
439     if (daemon->max_logs != 0)
440         my_syslog(LOG_INFO, _("asynchronous logging enabled, queue limit is %d messages"),
441                   daemon->max_logs);
442 
443 #ifdef HAVE_DHCP
444     if (daemon->dhcp) {
445         struct dhcp_context* dhcp_tmp;
446 
447         for (dhcp_tmp = daemon->dhcp; dhcp_tmp; dhcp_tmp = dhcp_tmp->next) {
448             prettyprint_time(daemon->dhcp_buff2, dhcp_tmp->lease_time);
449             strcpy(daemon->dhcp_buff, inet_ntoa(dhcp_tmp->start));
450             my_syslog(MS_DHCP | LOG_INFO,
451                       (dhcp_tmp->flags & CONTEXT_STATIC)
452                           ? _("DHCP, static leases only on %.0s%s, lease time %s")
453                           : (dhcp_tmp->flags & CONTEXT_PROXY)
454                                 ? _("DHCP, proxy on subnet %.0s%s%.0s")
455                                 : _("DHCP, IP range %s -- %s, lease time %s"),
456                       daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2);
457         }
458     }
459 #endif
460 
461     /* finished start-up - release original process */
462     if (err_pipe[1] != -1) close(err_pipe[1]);
463 
464     if (daemon->port != 0) check_servers();
465 
466     pid = getpid();
467 
468     while (1) {
469         int maxfd = -1;
470         struct timeval t, *tp = NULL;
471         fd_set rset, wset, eset;
472 
473         FD_ZERO(&rset);
474         FD_ZERO(&wset);
475         FD_ZERO(&eset);
476 
477         /* if we are out of resources, find how long we have to wait
478        for some to come free, we'll loop around then and restart
479        listening for queries */
480         if ((t.tv_sec = set_dns_listeners(now, &rset, &maxfd)) != 0) {
481             t.tv_usec = 0;
482             tp = &t;
483         }
484 #ifdef __ANDROID__
485         set_android_listeners(&rset, &maxfd);
486 #endif
487 
488 #ifdef HAVE_DHCP
489         if (daemon->dhcp) {
490             FD_SET(daemon->dhcpfd, &rset);
491             bump_maxfd(daemon->dhcpfd, &maxfd);
492         }
493 #endif
494 
495 #ifdef HAVE_LINUX_NETWORK
496         FD_SET(daemon->netlinkfd, &rset);
497         bump_maxfd(daemon->netlinkfd, &maxfd);
498 #endif
499 
500         FD_SET(piperead, &rset);
501         bump_maxfd(piperead, &maxfd);
502 
503 #ifdef HAVE_DHCP
504 #ifdef HAVE_SCRIPT
505         while (helper_buf_empty() && do_script_run(now))
506             ;
507 
508         if (!helper_buf_empty()) {
509             FD_SET(daemon->helperfd, &wset);
510             bump_maxfd(daemon->helperfd, &maxfd);
511         }
512 #else
513         /* need this for other side-effects */
514         while (do_script_run(now))
515             ;
516 #endif
517 #endif
518 
519         /* must do this just before select(), when we know no
520        more calls to my_syslog() can occur */
521         set_log_writer(&wset, &maxfd);
522 
523         if (select(maxfd + 1, &rset, &wset, &eset, tp) < 0) {
524             /* otherwise undefined after error */
525             FD_ZERO(&rset);
526             FD_ZERO(&wset);
527             FD_ZERO(&eset);
528         }
529 
530         now = dnsmasq_time();
531 
532         check_log_writer(&wset);
533 
534         /* Check for changes to resolv files once per second max. */
535         /* Don't go silent for long periods if the clock goes backwards. */
536         if (daemon->last_resolv == 0 || difftime(now, daemon->last_resolv) > 1.0 ||
537             difftime(now, daemon->last_resolv) < -1.0) {
538             daemon->last_resolv = now;
539 
540             if (daemon->port != 0 && !(daemon->options & OPT_NO_POLL)) poll_resolv();
541         }
542 
543         if (FD_ISSET(piperead, &rset)) async_event(piperead, now);
544 
545 #ifdef HAVE_LINUX_NETWORK
546         if (FD_ISSET(daemon->netlinkfd, &rset)) netlink_multicast();
547 #endif
548 
549 #ifdef __ANDROID__
550         check_android_listeners(&rset);
551 #endif
552 
553         check_dns_listeners(&rset, now);
554 
555 #ifdef HAVE_DHCP
556         if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset)) dhcp_packet(now);
557 
558 #ifdef HAVE_SCRIPT
559         if (daemon->helperfd != -1 && FD_ISSET(daemon->helperfd, &wset)) helper_write();
560 #endif
561 #endif
562     }
563 }
564 
sig_handler(int sig)565 static void sig_handler(int sig) {
566     if (pid == 0) {
567         /* ignore anything other than TERM during startup
568            and in helper proc. (helper ignore TERM too) */
569         if (sig == SIGTERM) exit(EC_MISC);
570     } else if (pid != getpid()) {
571         /* alarm is used to kill TCP children after a fixed time. */
572         if (sig == SIGALRM) _exit(0);
573     } else {
574         /* master process */
575         const int errsave = errno;
576         int event;
577 
578         if (sig == SIGHUP)
579             event = EVENT_RELOAD;
580         else if (sig == SIGCHLD)
581             event = EVENT_CHILD;
582         else if (sig == SIGALRM)
583             event = EVENT_ALARM;
584         else if (sig == SIGTERM)
585             event = EVENT_TERM;
586         else if (sig == SIGUSR1)
587             event = EVENT_DUMP;
588         else if (sig == SIGUSR2)
589             event = EVENT_REOPEN;
590         else
591             return;
592 
593         send_event(pipewrite, event, 0);
594         errno = errsave;
595     }
596 }
597 
send_event(int fd,int event,int data)598 void send_event(int fd, int event, int data) {
599     struct event_desc ev;
600 
601     ev.event = event;
602     ev.data = data;
603 
604     /* error pipe, debug mode. */
605     if (fd == -1)
606         fatal_event(&ev);
607     else
608         /* pipe is non-blocking and struct event_desc is smaller than
609            PIPE_BUF, so this either fails or writes everything */
610         while (write(fd, &ev, sizeof(ev)) == -1 && errno == EINTR)
611             ;
612 }
613 
fatal_event(struct event_desc * ev)614 static void fatal_event(struct event_desc* ev) {
615     errno = ev->data;
616 
617     switch (ev->event) {
618         case EVENT_DIE:
619             exit(0);
620 
621         case EVENT_FORK_ERR:
622             die(_("cannot fork into background: %s"), NULL, EC_MISC);
623 
624         case EVENT_PIPE_ERR:
625             die(_("failed to create helper: %s"), NULL, EC_MISC);
626 
627         case EVENT_CAP_ERR:
628             die(_("setting capabilities failed: %s"), NULL, EC_MISC);
629 
630         case EVENT_USER_ERR:
631         case EVENT_HUSER_ERR:
632             die(_("failed to change user-id to %s: %s"),
633                 ev->event == EVENT_USER_ERR ? daemon->username : daemon->scriptuser, EC_MISC);
634 
635         case EVENT_GROUP_ERR:
636             die(_("failed to change group-id to %s: %s"), daemon->groupname, EC_MISC);
637 
638         case EVENT_PIDFILE:
639             die(_("failed to open pidfile %s: %s"), daemon->runfile, EC_FILE);
640 
641         case EVENT_LOG_ERR:
642             die(_("cannot open %s: %s"), daemon->log_file ? daemon->log_file : "log", EC_FILE);
643     }
644 }
645 
async_event(int pipe,time_t now)646 static void async_event(int pipe, time_t now) {
647     pid_t p;
648     struct event_desc ev;
649     int i;
650 
651     if (read_write(pipe, (unsigned char*) &ev, sizeof(ev), 1)) switch (ev.event) {
652             case EVENT_RELOAD:
653                 clear_cache_and_reload(now);
654                 if (daemon->port != 0 && daemon->resolv_files && (daemon->options & OPT_NO_POLL)) {
655                     reload_servers(daemon->resolv_files->name);
656                     check_servers();
657                 }
658 #ifdef HAVE_DHCP
659                 rerun_scripts();
660 #endif
661                 break;
662 
663             case EVENT_DUMP:
664                 if (daemon->port != 0) dump_cache(now);
665                 break;
666 
667             case EVENT_ALARM:
668 #ifdef HAVE_DHCP
669                 if (daemon->dhcp) {
670                     lease_prune(NULL, now);
671                     lease_update_file(now);
672                 }
673 #endif
674                 break;
675 
676             case EVENT_CHILD:
677                 /* See Stevens 5.10 */
678                 while ((p = waitpid(-1, NULL, WNOHANG)) != 0)
679                     if (p == -1) {
680                         if (errno != EINTR) break;
681                     } else
682                         for (i = 0; i < MAX_PROCS; i++)
683                             if (daemon->tcp_pids[i] == p) daemon->tcp_pids[i] = 0;
684                 break;
685 
686             case EVENT_KILLED:
687                 my_syslog(LOG_WARNING, _("child process killed by signal %d"), ev.data);
688                 break;
689 
690             case EVENT_EXITED:
691                 my_syslog(LOG_WARNING, _("child process exited with status %d"), ev.data);
692                 break;
693 
694             case EVENT_EXEC_ERR:
695                 my_syslog(LOG_ERR, _("failed to execute %s: %s"), daemon->lease_change_command,
696                           strerror(ev.data));
697                 break;
698 
699                 /* necessary for fatal errors in helper */
700             case EVENT_HUSER_ERR:
701             case EVENT_DIE:
702                 fatal_event(&ev);
703                 break;
704 
705             case EVENT_REOPEN:
706                 /* Note: this may leave TCP-handling processes with the old file still open.
707                    Since any such process will die in CHILD_LIFETIME or probably much sooner,
708                    we leave them logging to the old file. */
709                 if (daemon->log_file != NULL) log_reopen(daemon->log_file);
710                 break;
711 
712             case EVENT_TERM:
713                 /* Knock all our children on the head. */
714                 for (i = 0; i < MAX_PROCS; i++)
715                     if (daemon->tcp_pids[i] != 0) kill(daemon->tcp_pids[i], SIGALRM);
716 
717 #if defined(HAVE_DHCP) && defined(HAVE_SCRIPT)
718                 /* handle pending lease transitions */
719                 if (daemon->helperfd != -1) {
720                     /* block in writes until all done */
721                     if ((i = fcntl(daemon->helperfd, F_GETFL)) != -1)
722                         fcntl(daemon->helperfd, F_SETFL, i & ~O_NONBLOCK);
723                     do {
724                         helper_write();
725                     } while (!helper_buf_empty() || do_script_run(now));
726                     close(daemon->helperfd);
727                 }
728 #endif
729 
730                 if (daemon->lease_stream) fclose(daemon->lease_stream);
731 
732                 if (daemon->runfile) unlink(daemon->runfile);
733 
734                 my_syslog(LOG_INFO, _("exiting on receipt of SIGTERM"));
735                 flush_log();
736                 exit(EC_GOOD);
737         }
738 }
739 
poll_resolv()740 static void poll_resolv() {
741     struct resolvc *res, *latest;
742     struct stat statbuf;
743     time_t last_change = 0;
744     /* There may be more than one possible file.
745        Go through and find the one which changed _last_.
746        Warn of any which can't be read. */
747     for (latest = NULL, res = daemon->resolv_files; res; res = res->next)
748         if (stat(res->name, &statbuf) == -1) {
749             if (!res->logged)
750                 my_syslog(LOG_WARNING, _("failed to access %s: %s"), res->name, strerror(errno));
751             res->logged = 1;
752         } else {
753             res->logged = 0;
754             if (statbuf.st_mtime != res->mtime) {
755                 res->mtime = statbuf.st_mtime;
756                 if (difftime(statbuf.st_mtime, last_change) > 0.0) {
757                     last_change = statbuf.st_mtime;
758                     latest = res;
759                 }
760             }
761         }
762 
763     if (latest) {
764         static int warned = 0;
765         if (reload_servers(latest->name)) {
766             my_syslog(LOG_INFO, _("reading %s"), latest->name);
767             warned = 0;
768             check_servers();
769             if (daemon->options & OPT_RELOAD) cache_reload();
770         } else {
771             latest->mtime = 0;
772             if (!warned) {
773                 my_syslog(LOG_WARNING, _("no servers found in %s, will retry"), latest->name);
774                 warned = 1;
775             }
776         }
777     }
778 }
779 
clear_cache_and_reload(time_t now)780 void clear_cache_and_reload(time_t now) {
781     if (daemon->port != 0) cache_reload();
782 
783 #ifdef HAVE_DHCP
784     if (daemon->dhcp) {
785         reread_dhcp();
786         dhcp_update_configs(daemon->dhcp_conf);
787         check_dhcp_hosts(0);
788         lease_update_from_configs();
789         lease_update_file(now);
790         lease_update_dns();
791     }
792 #endif
793 }
794 
795 #ifdef __ANDROID__
796 
set_android_listeners(fd_set * set,int * maxfdp)797 static int set_android_listeners(fd_set* set, int* maxfdp) {
798     FD_SET(STDIN_FILENO, set);
799     bump_maxfd(STDIN_FILENO, maxfdp);
800     return 0;
801 }
802 
check_android_listeners(fd_set * set)803 static int check_android_listeners(fd_set* set) {
804     int retcode = 0;
805     if (FD_ISSET(STDIN_FILENO, set)) {
806         char buffer[1024];
807         int rc;
808         int consumed = 0;
809 
810         if ((rc = read(STDIN_FILENO, buffer, sizeof(buffer) - 1)) < 0) {
811             my_syslog(LOG_ERR, _("Error reading from stdin (%s)"), strerror(errno));
812             return -1;
813         }
814         buffer[rc] = '\0';
815         while (consumed < rc) {
816             char* cmd;
817             char* current_cmd = &buffer[consumed];
818             char* params = current_cmd;
819             int len = strlen(current_cmd);
820 
821             cmd = strsep(&params, "|");
822             if (!strcmp(cmd, "update_dns")) {
823                 if (params != NULL) {
824                     set_servers(params);
825                     check_servers();
826                 } else {
827                     my_syslog(LOG_ERR, _("Misformatted msg '%s'"), current_cmd);
828                     retcode = -1;
829                 }
830             } else if (!strcmp(cmd, "update_ifaces")) {
831                 if (params != NULL) {
832                     set_interfaces(params);
833                 } else {
834                     my_syslog(LOG_ERR, _("Misformatted msg '%s'"), current_cmd);
835                     retcode = -1;
836                 }
837             } else {
838                 my_syslog(LOG_ERR, _("Unknown cmd '%s'"), cmd);
839                 retcode = -1;
840             }
841             consumed += len + 1;
842         }
843     }
844     return retcode;
845 }
846 #endif
847 
set_dns_listeners(time_t now,fd_set * set,int * maxfdp)848 static int set_dns_listeners(time_t now, fd_set* set, int* maxfdp) {
849     struct serverfd* serverfdp;
850     struct listener* listener;
851     int wait = 0, i;
852 
853     /* will we be able to get memory? */
854     if (daemon->port != 0) get_new_frec(now, &wait);
855 
856     for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next) {
857         FD_SET(serverfdp->fd, set);
858         bump_maxfd(serverfdp->fd, maxfdp);
859     }
860 
861     if (daemon->port != 0 && !daemon->osport)
862         for (i = 0; i < RANDOM_SOCKS; i++)
863             if (daemon->randomsocks[i].refcount != 0) {
864                 FD_SET(daemon->randomsocks[i].fd, set);
865                 bump_maxfd(daemon->randomsocks[i].fd, maxfdp);
866             }
867 
868     for (listener = daemon->listeners; listener; listener = listener->next) {
869         /* only listen for queries if we have resources */
870         if (listener->fd != -1 && wait == 0) {
871             FD_SET(listener->fd, set);
872             bump_maxfd(listener->fd, maxfdp);
873         }
874 
875         /* death of a child goes through the select loop, so
876        we don't need to explicitly arrange to wake up here */
877         if (listener->tcpfd != -1)
878             for (i = 0; i < MAX_PROCS; i++)
879                 if (daemon->tcp_pids[i] == 0) {
880                     FD_SET(listener->tcpfd, set);
881                     bump_maxfd(listener->tcpfd, maxfdp);
882                     break;
883                 }
884     }
885 
886     return wait;
887 }
888 
check_dns_listeners(fd_set * set,time_t now)889 static void check_dns_listeners(fd_set* set, time_t now) {
890     struct serverfd* serverfdp;
891     struct listener* listener;
892     int i;
893 
894     for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
895         if (FD_ISSET(serverfdp->fd, set))
896             reply_query(serverfdp->fd, serverfdp->source_addr.sa.sa_family, now);
897 
898     if (daemon->port != 0 && !daemon->osport)
899         for (i = 0; i < RANDOM_SOCKS; i++)
900             if (daemon->randomsocks[i].refcount != 0 && FD_ISSET(daemon->randomsocks[i].fd, set))
901                 reply_query(daemon->randomsocks[i].fd, daemon->randomsocks[i].family, now);
902 
903     for (listener = daemon->listeners; listener; listener = listener->next) {
904         if (listener->fd != -1 && FD_ISSET(listener->fd, set)) receive_query(listener, now);
905 
906         if (listener->tcpfd != -1 && FD_ISSET(listener->tcpfd, set)) {
907             int confd;
908             struct irec* iface = NULL;
909             pid_t p;
910 
911             while ((confd = accept(listener->tcpfd, NULL, NULL)) == -1 && errno == EINTR)
912                 ;
913 
914             if (confd == -1) continue;
915 
916             if (daemon->options & OPT_NOWILD)
917                 iface = listener->iface;
918             else {
919                 union mysockaddr tcp_addr;
920                 socklen_t tcp_len = sizeof(union mysockaddr);
921                 /* Check for allowed interfaces when binding the wildcard address:
922                we do this by looking for an interface with the same address as
923                the local address of the TCP connection, then looking to see if that's
924                an allowed interface. As a side effect, we get the netmask of the
925                interface too, for localisation. */
926 
927                 /* interface may be new since startup */
928                 if (enumerate_interfaces() &&
929                     getsockname(confd, (struct sockaddr*) &tcp_addr, &tcp_len) != -1)
930                     for (iface = daemon->interfaces; iface; iface = iface->next)
931                         if (sockaddr_isequal(&iface->addr, &tcp_addr)) break;
932             }
933 
934             if (!iface) {
935                 shutdown(confd, SHUT_RDWR);
936                 close(confd);
937             }
938 #ifndef NO_FORK
939             else if (!(daemon->options & OPT_DEBUG) && (p = fork()) != 0) {
940                 if (p != -1) {
941                     int i;
942                     for (i = 0; i < MAX_PROCS; i++)
943                         if (daemon->tcp_pids[i] == 0) {
944                             daemon->tcp_pids[i] = p;
945                             break;
946                         }
947                 }
948                 close(confd);
949             }
950 #endif
951             else {
952                 unsigned char* buff;
953                 struct server* s;
954                 int flags;
955                 struct in_addr dst_addr_4;
956 
957                 dst_addr_4.s_addr = 0;
958 
959                 /* Arrange for SIGALARM after CHILD_LIFETIME seconds to
960                terminate the process. */
961                 if (!(daemon->options & OPT_DEBUG)) alarm(CHILD_LIFETIME);
962 
963                 /* start with no upstream connections. */
964                 for (s = daemon->servers; s; s = s->next) s->tcpfd = -1;
965 
966                 /* The connected socket inherits non-blocking
967                attribute from the listening socket.
968                Reset that here. */
969                 if ((flags = fcntl(confd, F_GETFL, 0)) != -1)
970                     fcntl(confd, F_SETFL, flags & ~O_NONBLOCK);
971 
972                 if (listener->family == AF_INET) dst_addr_4 = iface->addr.in.sin_addr;
973 
974                 buff = tcp_request(confd, now, dst_addr_4, iface->netmask);
975 
976                 shutdown(confd, SHUT_RDWR);
977                 close(confd);
978 
979                 if (buff) free(buff);
980 
981                 for (s = daemon->servers; s; s = s->next)
982                     if (s->tcpfd != -1) {
983                         shutdown(s->tcpfd, SHUT_RDWR);
984                         close(s->tcpfd);
985                     }
986 #ifndef NO_FORK
987                 if (!(daemon->options & OPT_DEBUG)) {
988                     flush_log();
989                     _exit(0);
990                 }
991 #endif
992             }
993         }
994     }
995 }
996 
997 #ifdef HAVE_DHCP
make_icmp_sock(void)998 int make_icmp_sock(void) {
999     int fd;
1000     int zeroopt = 0;
1001 
1002     if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) != -1) {
1003         if (!fix_fd(fd) ||
1004             setsockopt(fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1) {
1005             close(fd);
1006             fd = -1;
1007         }
1008     }
1009 
1010     return fd;
1011 }
1012 
icmp_ping(struct in_addr addr)1013 int icmp_ping(struct in_addr addr) {
1014     /* Try and get an ICMP echo from a machine. */
1015 
1016     /* Note that whilst in the three second wait, we check for
1017        (and service) events on the DNS sockets, (so doing that
1018        better not use any resources our caller has in use...)
1019        but we remain deaf to signals or further DHCP packets. */
1020 
1021     int fd;
1022     struct sockaddr_in saddr;
1023     struct {
1024         struct ip ip;
1025         struct icmp icmp;
1026     } packet;
1027     unsigned short id = rand16();
1028     unsigned int i, j;
1029     int gotreply = 0;
1030     time_t start, now;
1031 
1032 #if defined(HAVE_LINUX_NETWORK)
1033     if ((fd = make_icmp_sock()) == -1) return 0;
1034 #else
1035     int opt = 2000;
1036     fd = daemon->dhcp_icmp_fd;
1037     setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
1038 #endif
1039 
1040     saddr.sin_family = AF_INET;
1041     saddr.sin_port = 0;
1042     saddr.sin_addr = addr;
1043 
1044     memset(&packet.icmp, 0, sizeof(packet.icmp));
1045     packet.icmp.icmp_type = ICMP_ECHO;
1046     packet.icmp.icmp_id = id;
1047     for (j = 0, i = 0; i < sizeof(struct icmp) / 2; i++) j += ((u16*) &packet.icmp)[i];
1048     while (j >> 16) j = (j & 0xffff) + (j >> 16);
1049     packet.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;
1050 
1051     while (sendto(fd, (char*) &packet.icmp, sizeof(struct icmp), 0, (struct sockaddr*) &saddr,
1052                   sizeof(saddr)) == -1 &&
1053            retry_send())
1054         ;
1055 
1056     for (now = start = dnsmasq_time(); difftime(now, start) < (float) PING_WAIT;) {
1057         struct timeval tv;
1058         fd_set rset, wset;
1059         struct sockaddr_in faddr;
1060         int maxfd = fd;
1061         socklen_t len = sizeof(faddr);
1062 
1063         tv.tv_usec = 250000;
1064         tv.tv_sec = 0;
1065 
1066         FD_ZERO(&rset);
1067         FD_ZERO(&wset);
1068         FD_SET(fd, &rset);
1069         set_dns_listeners(now, &rset, &maxfd);
1070         set_log_writer(&wset, &maxfd);
1071 
1072         if (select(maxfd + 1, &rset, &wset, NULL, &tv) < 0) {
1073             FD_ZERO(&rset);
1074             FD_ZERO(&wset);
1075         }
1076 
1077         now = dnsmasq_time();
1078 
1079         check_log_writer(&wset);
1080         check_dns_listeners(&rset, now);
1081 
1082         if (FD_ISSET(fd, &rset) &&
1083             recvfrom(fd, &packet, sizeof(packet), 0, (struct sockaddr*) &faddr, &len) ==
1084                 sizeof(packet) &&
1085             saddr.sin_addr.s_addr == faddr.sin_addr.s_addr &&
1086             packet.icmp.icmp_type == ICMP_ECHOREPLY && packet.icmp.icmp_seq == 0 &&
1087             packet.icmp.icmp_id == id) {
1088             gotreply = 1;
1089             break;
1090         }
1091     }
1092 
1093 #if defined(HAVE_LINUX_NETWORK)
1094     close(fd);
1095 #else
1096     opt = 1;
1097     setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
1098 #endif
1099 
1100     return gotreply;
1101 }
1102 #endif
1103