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 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 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 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 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 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 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 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 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 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 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 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(¶ms, "|"); 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 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 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 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 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