1 /* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
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.
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.
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/>.
20 #include <asm/unistd.h>
21 _syscall5(int, prctl
, int, a
, int, b
, int, c
, int, d
, int, e
);
23 struct daemon
*daemon
;
25 static char *compile_opts
=
30 #ifndef HAVE_GETOPT_LONG
34 #ifdef HAVE_BROKEN_RTC
57 static volatile pid_t pid
= 0;
58 static volatile int pipewrite
;
60 static int set_dns_listeners(time_t now
, fd_set
*set
, int *maxfdp
);
61 static void check_dns_listeners(fd_set
*set
, time_t now
);
62 static void sig_handler(int sig
);
63 static void async_event(int pipe
, time_t now
);
64 static void fatal_event(struct event_desc
*ev
);
65 static void poll_resolv(void);
67 void tomato_helper(time_t now
); // zzz
68 void flush_lease_file(time_t now
); // zzz
70 int main (int argc
, char **argv
)
72 int bind_fallback
= 0;
74 struct sigaction sigact
;
76 int piperead
, pipefd
[2], err_pipe
[2];
77 struct passwd
*ent_pw
= NULL
;
82 struct group
*gp
= NULL
;
83 long i
, max_fd
= sysconf(_SC_OPEN_MAX
);
86 #if defined(HAVE_LINUX_NETWORK)
87 cap_user_header_t hdr
= NULL
;
88 cap_user_data_t data
= NULL
;
92 setlocale(LC_ALL
, "");
93 bindtextdomain("dnsmasq", LOCALEDIR
);
94 textdomain("dnsmasq");
97 sigact
.sa_handler
= sig_handler
;
99 sigemptyset(&sigact
.sa_mask
);
100 sigaction(SIGUSR1
, &sigact
, NULL
);
101 sigaction(SIGUSR2
, &sigact
, NULL
);
102 sigaction(SIGHUP
, &sigact
, NULL
);
103 sigaction(SIGTERM
, &sigact
, NULL
);
104 sigaction(SIGALRM
, &sigact
, NULL
);
105 sigaction(SIGCHLD
, &sigact
, NULL
);
108 sigact
.sa_handler
= SIG_IGN
;
109 sigaction(SIGPIPE
, &sigact
, NULL
);
111 umask(022); /* known umask, create leases and pid files as 0644 */
113 read_opts(argc
, argv
, compile_opts
);
115 if (daemon
->edns_pktsz
< PACKETSZ
)
116 daemon
->edns_pktsz
= PACKETSZ
;
117 daemon
->packet_buff_sz
= daemon
->edns_pktsz
> DNSMASQ_PACKETSZ
?
118 daemon
->edns_pktsz
: DNSMASQ_PACKETSZ
;
119 daemon
->packet
= safe_malloc(daemon
->packet_buff_sz
);
122 if (!daemon
->lease_file
)
125 daemon
->lease_file
= LEASEFILE
;
129 /* Close any file descriptors we inherited apart from std{in|out|err} */
130 for (i
= 0; i
< max_fd
; i
++)
131 if (i
!= STDOUT_FILENO
&& i
!= STDERR_FILENO
&& i
!= STDIN_FILENO
)
134 #ifdef HAVE_LINUX_NETWORK
136 #elif !(defined(IP_RECVDSTADDR) && \
137 defined(IP_RECVIF) && \
138 defined(IP_SENDSRCADDR))
139 if (!(daemon
->options
& OPT_NOWILD
))
142 daemon
->options
|= OPT_NOWILD
;
147 if (daemon
->options
& OPT_TFTP
)
148 die(_("TFTP server not available: set HAVE_TFTP in src/config.h"), NULL
, EC_BADCONF
);
151 #ifdef HAVE_SOLARIS_NETWORK
152 if (daemon
->max_logs
!= 0)
153 die(_("asychronous logging is not available under Solaris"), NULL
, EC_BADCONF
);
158 now
= dnsmasq_time();
163 /* Note that order matters here, we must call lease_init before
164 creating any file descriptors which shouldn't be leaked
165 to the lease-script init process. */
171 if (!enumerate_interfaces())
172 die(_("failed to find list of interfaces: %s"), NULL
, EC_MISC
);
174 if (daemon
->options
& OPT_NOWILD
)
176 daemon
->listeners
= create_bound_listeners();
178 for (if_tmp
= daemon
->if_names
; if_tmp
; if_tmp
= if_tmp
->next
)
179 if (if_tmp
->name
&& !if_tmp
->used
)
180 die(_("unknown interface %s"), if_tmp
->name
, EC_BADNET
);
182 for (if_tmp
= daemon
->if_addrs
; if_tmp
; if_tmp
= if_tmp
->next
)
185 prettyprint_addr(&if_tmp
->addr
, daemon
->namebuff
);
186 die(_("no interface with address %s"), daemon
->namebuff
, EC_BADNET
);
189 else if ((daemon
->port
!= 0 || (daemon
->options
& OPT_TFTP
)) &&
190 !(daemon
->listeners
= create_wildcard_listeners()))
191 die(_("failed to create listening socket: %s"), NULL
, EC_BADNET
);
193 if (daemon
->port
!= 0)
196 if (daemon
->options
& OPT_DBUS
)
201 daemon
->watches
= NULL
;
202 if ((err
= dbus_init()))
203 die(_("DBus error: %s"), err
, EC_MISC
);
206 die(_("DBus not available: set HAVE_DBUS in src/config.h"), NULL
, EC_BADCONF
);
209 if (daemon
->port
!= 0)
213 /* Note getpwnam returns static storage */
214 if (daemon
->dhcp
&& daemon
->lease_change_command
&& daemon
->scriptuser
)
216 if ((ent_pw
= getpwnam(daemon
->scriptuser
)))
218 script_uid
= ent_pw
->pw_uid
;
219 script_gid
= ent_pw
->pw_gid
;
222 baduser
= daemon
->scriptuser
;
226 if (daemon
->username
&& !(ent_pw
= getpwnam(daemon
->username
)))
227 baduser
= daemon
->username
;
228 else if (daemon
->groupname
&& !(gp
= getgrnam(daemon
->groupname
)))
229 baduser
= daemon
->groupname
;
232 die(_("unknown user or group: %s"), baduser
, EC_BADCONF
);
234 /* implement group defaults, "dip" if available, or group associated with uid */
235 if (!daemon
->group_set
&& !gp
)
237 if (!(gp
= getgrnam(CHGRP
)) && ent_pw
)
238 gp
= getgrgid(ent_pw
->pw_gid
);
240 /* for error message */
242 daemon
->groupname
= gp
->gr_name
;
245 #if defined(HAVE_LINUX_NETWORK)
246 /* determine capability API version here, while we can still
248 if (ent_pw
&& ent_pw
->pw_uid
!= 0)
250 int capsize
= 1; /* for header version 1 */
251 hdr
= safe_malloc(sizeof(*hdr
));
253 /* find version supported by kernel */
254 memset(hdr
, 0, sizeof(*hdr
));
257 if (hdr
->version
!= LINUX_CAPABILITY_VERSION_1
)
259 /* if unknown version, use largest supported version (3) */
260 if (hdr
->version
!= LINUX_CAPABILITY_VERSION_2
)
261 hdr
->version
= LINUX_CAPABILITY_VERSION_3
;
265 data
= safe_malloc(sizeof(*data
) * capsize
);
266 memset(data
, 0, sizeof(*data
) * capsize
);
270 /* Use a pipe to carry signals and other events back to the event loop
271 in a race-free manner and another to carry errors to daemon-invoking process */
272 safe_pipe(pipefd
, 1);
274 piperead
= pipefd
[0];
275 pipewrite
= pipefd
[1];
276 /* prime the pipe to load stuff first time. */
277 send_event(pipewrite
, EVENT_RELOAD
, 0);
281 if (!(daemon
->options
& OPT_DEBUG
))
285 /* The following code "daemonizes" the process.
286 See Stevens section 12.4 */
289 die(_("cannot chdir to filesystem root: %s"), NULL
, EC_MISC
);
292 if (!(daemon
->options
& OPT_NO_FORK
))
296 /* pipe to carry errors back to original process.
297 When startup is complete we close this and the process terminates. */
298 safe_pipe(err_pipe
, 0);
300 if ((pid
= fork()) == -1)
301 /* fd == -1 since we've not forked, never returns. */
302 send_event(-1, EVENT_FORK_ERR
, errno
);
306 struct event_desc ev
;
308 /* close our copy of write-end */
311 /* check for errors after the fork */
312 if (read_write(err_pipe
[0], (unsigned char *)&ev
, sizeof(ev
), 1))
320 /* NO calls to die() from here on. */
324 if ((pid
= fork()) == -1)
325 send_event(err_pipe
[1], EVENT_FORK_ERR
, errno
);
332 /* write pidfile _after_ forking ! */
337 /* only complain if started as root */
338 if ((pidfile
= fopen(daemon
->runfile
, "w")))
340 fprintf(pidfile
, "%d\n", (int) getpid());
343 else if (getuid() == 0)
345 send_event(err_pipe
[1], EVENT_PIDFILE
, errno
);
350 /* open stdout etc to /dev/null */
351 nullfd
= open("/dev/null", O_RDWR
);
352 dup2(nullfd
, STDOUT_FILENO
);
353 dup2(nullfd
, STDERR_FILENO
);
354 dup2(nullfd
, STDIN_FILENO
);
358 log_err
= log_start(ent_pw
, err_pipe
[1]);
360 /* if we are to run scripts, we need to fork a helper before dropping root. */
361 daemon
->helperfd
= -1;
362 #if defined(HAVE_DHCP) && !defined(NO_FORK)
363 if (daemon
->dhcp
&& daemon
->lease_change_command
)
364 daemon
->helperfd
= create_helper(pipewrite
, err_pipe
[1], script_uid
, script_gid
, max_fd
);
367 if (!(daemon
->options
& OPT_DEBUG
) && getuid() == 0)
369 int bad_capabilities
= 0;
372 /* remove all supplimentary groups */
374 (setgroups(0, &dummy
) == -1 ||
375 setgid(gp
->gr_gid
) == -1))
377 send_event(err_pipe
[1], EVENT_GROUP_ERR
, errno
);
381 if (ent_pw
&& ent_pw
->pw_uid
!= 0)
383 #if defined(HAVE_LINUX_NETWORK)
384 /* On linux, we keep CAP_NETADMIN (for ARP-injection) and
385 CAP_NET_RAW (for icmp) if we're doing dhcp */
386 data
->effective
= data
->permitted
= data
->inheritable
=
387 (1 << CAP_NET_ADMIN
) | (1 << CAP_NET_RAW
) | (1 << CAP_SETUID
);
389 /* Tell kernel to not clear capabilities when dropping root */
390 if (capset(hdr
, data
) == -1 || prctl(PR_SET_KEEPCAPS
, 1, 0, 0, 0) == -1)
391 bad_capabilities
= errno
;
393 #elif defined(HAVE_SOLARIS_NETWORK)
394 /* http://developers.sun.com/solaris/articles/program_privileges.html */
395 priv_set_t
*priv_set
;
397 if (!(priv_set
= priv_str_to_set("basic", ",", NULL
)) ||
398 priv_addset(priv_set
, PRIV_NET_ICMPACCESS
) == -1 ||
399 priv_addset(priv_set
, PRIV_SYS_NET_CONFIG
) == -1)
400 bad_capabilities
= errno
;
402 if (priv_set
&& bad_capabilities
== 0)
404 priv_inverse(priv_set
);
406 if (setppriv(PRIV_OFF
, PRIV_LIMIT
, priv_set
) == -1)
407 bad_capabilities
= errno
;
411 priv_freeset(priv_set
);
415 if (bad_capabilities
!= 0)
417 send_event(err_pipe
[1], EVENT_CAP_ERR
, bad_capabilities
);
421 /* finally drop root */
422 if (setuid(ent_pw
->pw_uid
) == -1)
424 send_event(err_pipe
[1], EVENT_USER_ERR
, errno
);
428 #ifdef HAVE_LINUX_NETWORK
429 data
->effective
= data
->permitted
=
430 (1 << CAP_NET_ADMIN
) | (1 << CAP_NET_RAW
);
431 data
->inheritable
= 0;
433 /* lose the setuid and setgid capbilities */
434 if (capset(hdr
, data
) == -1)
436 send_event(err_pipe
[1], EVENT_CAP_ERR
, errno
);
444 #ifdef HAVE_LINUX_NETWORK
445 if (daemon
->options
& OPT_DEBUG
)
446 prctl(PR_SET_DUMPABLE
, 1, 0, 0, 0);
449 if (daemon
->port
== 0)
450 my_syslog(LOG_INFO
, _("started, version %s DNS disabled"), VERSION
);
451 else if (daemon
->cachesize
!= 0)
452 my_syslog(LOG_INFO
, _("started, version %s cachesize %d"), VERSION
, daemon
->cachesize
);
454 my_syslog(LOG_INFO
, _("started, version %s cache disabled"), VERSION
);
456 my_syslog(LOG_INFO
, _("compile time options: %s"), compile_opts
);
459 if (daemon
->options
& OPT_DBUS
)
462 my_syslog(LOG_INFO
, _("DBus support enabled: connected to system bus"));
464 my_syslog(LOG_INFO
, _("DBus support enabled: bus connection pending"));
469 my_syslog(LOG_WARNING
, _("warning: failed to change owner of %s: %s"),
470 daemon
->log_file
, strerror(log_err
));
473 my_syslog(LOG_WARNING
, _("setting --bind-interfaces option because of OS limitations"));
475 if (!(daemon
->options
& OPT_NOWILD
))
476 for (if_tmp
= daemon
->if_names
; if_tmp
; if_tmp
= if_tmp
->next
)
477 if (if_tmp
->name
&& !if_tmp
->used
)
478 my_syslog(LOG_WARNING
, _("warning: interface %s does not currently exist"), if_tmp
->name
);
480 if (daemon
->port
!= 0 && (daemon
->options
& OPT_NO_RESOLV
))
482 if (daemon
->resolv_files
&& !daemon
->resolv_files
->is_default
)
483 my_syslog(LOG_WARNING
, _("warning: ignoring resolv-file flag because no-resolv is set"));
484 daemon
->resolv_files
= NULL
;
485 if (!daemon
->servers
)
486 my_syslog(LOG_WARNING
, _("warning: no upstream servers configured"));
489 if (daemon
->max_logs
!= 0)
490 my_syslog(LOG_INFO
, _("asynchronous logging enabled, queue limit is %d messages"), daemon
->max_logs
);
495 struct dhcp_context
*dhcp_tmp
;
497 for (dhcp_tmp
= daemon
->dhcp
; dhcp_tmp
; dhcp_tmp
= dhcp_tmp
->next
)
499 prettyprint_time(daemon
->dhcp_buff2
, dhcp_tmp
->lease_time
);
500 strcpy(daemon
->dhcp_buff
, inet_ntoa(dhcp_tmp
->start
));
501 my_syslog(MS_DHCP
| LOG_INFO
,
502 (dhcp_tmp
->flags
& CONTEXT_STATIC
) ?
503 _("DHCP, static leases only on %.0s%s, lease time %s") :
504 (dhcp_tmp
->flags
& CONTEXT_PROXY
) ?
505 _("DHCP, proxy on subnet %.0s%s%.0s") :
506 _("DHCP, IP range %s -- %s, lease time %s"),
507 daemon
->dhcp_buff
, inet_ntoa(dhcp_tmp
->end
), daemon
->dhcp_buff2
);
513 if (daemon
->options
& OPT_TFTP
)
516 if (FD_SETSIZE
< (unsigned)max_fd
)
520 my_syslog(MS_TFTP
| LOG_INFO
, "TFTP %s%s %s",
521 daemon
->tftp_prefix
? _("root is ") : _("enabled"),
522 daemon
->tftp_prefix
? daemon
->tftp_prefix
: "",
523 daemon
->options
& OPT_TFTP_SECURE
? _("secure mode") : "");
525 /* This is a guess, it assumes that for small limits,
526 disjoint files might be served, but for large limits,
527 a single file will be sent to may clients (the file only needs
530 max_fd
-= 30; /* use other than TFTP */
534 else if (max_fd
< 100)
537 max_fd
= max_fd
- 20;
539 /* if we have to use a limited range of ports,
540 that will limit the number of transfers */
541 if (daemon
->start_tftp_port
!= 0 &&
542 daemon
->end_tftp_port
- daemon
->start_tftp_port
+ 1 < max_fd
)
543 max_fd
= daemon
->end_tftp_port
- daemon
->start_tftp_port
+ 1;
545 if (daemon
->tftp_max
> max_fd
)
547 daemon
->tftp_max
= max_fd
;
548 my_syslog(MS_TFTP
| LOG_WARNING
,
549 _("restricting maximum simultaneous TFTP transfers to %d"),
555 /* finished start-up - release original process */
556 if (err_pipe
[1] != -1)
559 if (daemon
->port
!= 0)
567 struct timeval t
, *tp
= NULL
;
568 fd_set rset
, wset
, eset
;
574 /* if we are out of resources, find how long we have to wait
575 for some to come free, we'll loop around then and restart
576 listening for queries */
577 if ((t
.tv_sec
= set_dns_listeners(now
, &rset
, &maxfd
)) != 0)
583 /* Whilst polling for the dbus, or doing a tftp transfer, wake every quarter second */
584 if (daemon
->tftp_trans
||
585 ((daemon
->options
& OPT_DBUS
) && !daemon
->dbus
))
593 set_dbus_listeners(&maxfd
, &rset
, &wset
, &eset
);
599 FD_SET(daemon
->dhcpfd
, &rset
);
600 bump_maxfd(daemon
->dhcpfd
, &maxfd
);
604 #ifdef HAVE_LINUX_NETWORK
605 FD_SET(daemon
->netlinkfd
, &rset
);
606 bump_maxfd(daemon
->netlinkfd
, &maxfd
);
609 FD_SET(piperead
, &rset
);
610 bump_maxfd(piperead
, &maxfd
);
614 while (helper_buf_empty() && do_script_run(now
));
616 if (!helper_buf_empty())
618 FD_SET(daemon
->helperfd
, &wset
);
619 bump_maxfd(daemon
->helperfd
, &maxfd
);
622 /* need this for other side-effects */
623 while (do_script_run(now
));
627 /* must do this just before select(), when we know no
628 more calls to my_syslog() can occur */
629 set_log_writer(&wset
, &maxfd
);
631 if (select(maxfd
+1, &rset
, &wset
, &eset
, tp
) < 0)
633 /* otherwise undefined after error */
634 FD_ZERO(&rset
); FD_ZERO(&wset
); FD_ZERO(&eset
);
637 now
= dnsmasq_time();
639 check_log_writer(&wset
);
641 /* Check for changes to resolv files once per second max. */
642 /* Don't go silent for long periods if the clock goes backwards. */
643 if (daemon
->last_resolv
== 0 ||
644 difftime(now
, daemon
->last_resolv
) > 1.0 ||
645 difftime(now
, daemon
->last_resolv
) < -1.0)
647 daemon
->last_resolv
= now
;
649 if (daemon
->port
!= 0 && !(daemon
->options
& OPT_NO_POLL
))
653 if (FD_ISSET(piperead
, &rset
))
654 async_event(piperead
, now
);
656 #ifdef HAVE_LINUX_NETWORK
657 if (FD_ISSET(daemon
->netlinkfd
, &rset
))
662 /* if we didn't create a DBus connection, retry now. */
663 if ((daemon
->options
& OPT_DBUS
) && !daemon
->dbus
)
666 if ((err
= dbus_init()))
667 my_syslog(LOG_WARNING
, _("DBus error: %s"), err
);
669 my_syslog(LOG_INFO
, _("connected to system DBus"));
671 check_dbus_listeners(&rset
, &wset
, &eset
);
674 check_dns_listeners(&rset
, now
);
677 check_tftp_listeners(&rset
, now
);
681 if (daemon
->dhcp
&& FD_ISSET(daemon
->dhcpfd
, &rset
))
685 if (daemon
->helperfd
!= -1 && FD_ISSET(daemon
->helperfd
, &wset
))
693 static void sig_handler(int sig
)
697 /* ignore anything other than TERM during startup
698 and in helper proc. (helper ignore TERM too) */
702 else if (pid
!= getpid())
704 /* alarm is used to kill TCP children after a fixed time. */
711 int event
, errsave
= errno
;
714 event
= EVENT_RELOAD
;
715 else if (sig
== SIGCHLD
)
717 else if (sig
== SIGALRM
)
719 else if (sig
== SIGTERM
)
721 else if (sig
== SIGUSR1
)
723 else if (sig
== SIGUSR2
)
724 event
= EVENT_REOPEN
;
728 send_event(pipewrite
, event
, 0);
733 void send_event(int fd
, int event
, int data
)
735 struct event_desc ev
;
740 /* error pipe, debug mode. */
744 /* pipe is non-blocking and struct event_desc is smaller than
745 PIPE_BUF, so this either fails or writes everything */
746 while (write(fd
, &ev
, sizeof(ev
)) == -1 && errno
== EINTR
);
749 static void fatal_event(struct event_desc
*ev
)
759 die(_("cannot fork into background: %s"), NULL
, EC_MISC
);
762 die(_("failed to create helper: %s"), NULL
, EC_MISC
);
765 die(_("setting capabilities failed: %s"), NULL
, EC_MISC
);
768 case EVENT_HUSER_ERR
:
769 die(_("failed to change user-id to %s: %s"),
770 ev
->event
== EVENT_USER_ERR
? daemon
->username
: daemon
->scriptuser
,
773 case EVENT_GROUP_ERR
:
774 die(_("failed to change group-id to %s: %s"), daemon
->groupname
, EC_MISC
);
777 die(_("failed to open pidfile %s: %s"), daemon
->runfile
, EC_FILE
);
780 die(_("cannot open %s: %s"), daemon
->log_file
? daemon
->log_file
: "log", EC_FILE
);
784 static void async_event(int pipe
, time_t now
)
787 struct event_desc ev
;
790 if (read_write(pipe
, (unsigned char *)&ev
, sizeof(ev
), 1))
794 clear_cache_and_reload(now
);
795 if (daemon
->port
!= 0 && daemon
->resolv_files
&& (daemon
->options
& OPT_NO_POLL
))
797 reload_servers(daemon
->resolv_files
->name
);
806 if (daemon
->port
!= 0)
814 lease_prune(NULL
, now
);
815 lease_update_file(now
);
821 /* See Stevens 5.10 */
822 while ((p
= waitpid(-1, NULL
, WNOHANG
)) != 0)
829 for (i
= 0 ; i
< MAX_PROCS
; i
++)
830 if (daemon
->tcp_pids
[i
] == p
)
831 daemon
->tcp_pids
[i
] = 0;
835 my_syslog(LOG_WARNING
, _("child process killed by signal %d"), ev
.data
);
839 my_syslog(LOG_WARNING
, _("child process exited with status %d"), ev
.data
);
843 my_syslog(LOG_ERR
, _("failed to execute %s: %s"),
844 daemon
->lease_change_command
, strerror(ev
.data
));
847 /* necessary for fatal errors in helper */
848 case EVENT_HUSER_ERR
:
854 tomato_helper(now
); // zzz
856 /* Note: this may leave TCP-handling processes with the old file still open.
857 Since any such process will die in CHILD_LIFETIME or probably much sooner,
858 we leave them logging to the old file. */
859 if (daemon
->log_file
!= NULL
)
860 log_reopen(daemon
->log_file
);
864 /* Knock all our children on the head. */
865 for (i
= 0; i
< MAX_PROCS
; i
++)
866 if (daemon
->tcp_pids
[i
] != 0)
867 kill(daemon
->tcp_pids
[i
], SIGALRM
);
869 #if defined(HAVE_DHCP) && !defined(NO_FORK)
870 /* handle pending lease transitions */
871 if (daemon
->helperfd
!= -1)
873 /* block in writes until all done */
874 if ((i
= fcntl(daemon
->helperfd
, F_GETFL
)) != -1)
875 fcntl(daemon
->helperfd
, F_SETFL
, i
& ~O_NONBLOCK
);
878 } while (!helper_buf_empty() || do_script_run(now
));
879 close(daemon
->helperfd
);
883 flush_lease_file(now
); // zzz
885 if (daemon
->lease_stream
)
886 fclose(daemon
->lease_stream
);
889 unlink(daemon
->runfile
);
891 my_syslog(LOG_INFO
, _("exiting on receipt of SIGTERM"));
897 static void poll_resolv()
899 struct resolvc
*res
, *latest
;
901 time_t last_change
= 0;
902 /* There may be more than one possible file.
903 Go through and find the one which changed _last_.
904 Warn of any which can't be read. */
905 for (latest
= NULL
, res
= daemon
->resolv_files
; res
; res
= res
->next
)
906 if (stat(res
->name
, &statbuf
) == -1)
909 my_syslog(LOG_WARNING
, _("failed to access %s: %s"), res
->name
, strerror(errno
));
915 if (statbuf
.st_mtime
!= res
->mtime
)
917 res
->mtime
= statbuf
.st_mtime
;
918 if (difftime(statbuf
.st_mtime
, last_change
) > 0.0)
920 last_change
= statbuf
.st_mtime
;
922 break; // zzz - (~0 time?)
929 static int warned
= 0;
930 if (reload_servers(latest
->name
))
932 my_syslog(LOG_INFO
, _("reading %s"), latest
->name
);
935 if (daemon
->options
& OPT_RELOAD
)
943 my_syslog(LOG_WARNING
, _("no servers found in %s, will retry"), latest
->name
);
950 void clear_cache_and_reload(time_t now
)
952 if (daemon
->port
!= 0)
958 if (daemon
->options
& OPT_ETHERS
)
961 dhcp_update_configs(daemon
->dhcp_conf
);
963 lease_update_from_configs();
964 lease_update_file(now
);
970 static int set_dns_listeners(time_t now
, fd_set
*set
, int *maxfdp
)
972 struct serverfd
*serverfdp
;
973 struct listener
*listener
;
978 struct tftp_transfer
*transfer
;
979 for (transfer
= daemon
->tftp_trans
; transfer
; transfer
= transfer
->next
)
982 FD_SET(transfer
->sockfd
, set
);
983 bump_maxfd(transfer
->sockfd
, maxfdp
);
987 /* will we be able to get memory? */
988 if (daemon
->port
!= 0)
989 get_new_frec(now
, &wait
);
991 for (serverfdp
= daemon
->sfds
; serverfdp
; serverfdp
= serverfdp
->next
)
993 FD_SET(serverfdp
->fd
, set
);
994 bump_maxfd(serverfdp
->fd
, maxfdp
);
997 if (daemon
->port
!= 0 && !daemon
->osport
)
998 for (i
= 0; i
< RANDOM_SOCKS
; i
++)
999 if (daemon
->randomsocks
[i
].refcount
!= 0)
1001 FD_SET(daemon
->randomsocks
[i
].fd
, set
);
1002 bump_maxfd(daemon
->randomsocks
[i
].fd
, maxfdp
);
1005 for (listener
= daemon
->listeners
; listener
; listener
= listener
->next
)
1007 /* only listen for queries if we have resources */
1008 if (listener
->fd
!= -1 && wait
== 0)
1010 FD_SET(listener
->fd
, set
);
1011 bump_maxfd(listener
->fd
, maxfdp
);
1014 /* death of a child goes through the select loop, so
1015 we don't need to explicitly arrange to wake up here */
1016 if (listener
->tcpfd
!= -1)
1017 for (i
= 0; i
< MAX_PROCS
; i
++)
1018 if (daemon
->tcp_pids
[i
] == 0)
1020 FD_SET(listener
->tcpfd
, set
);
1021 bump_maxfd(listener
->tcpfd
, maxfdp
);
1026 if (tftp
<= daemon
->tftp_max
&& listener
->tftpfd
!= -1)
1028 FD_SET(listener
->tftpfd
, set
);
1029 bump_maxfd(listener
->tftpfd
, maxfdp
);
1038 static void check_dns_listeners(fd_set
*set
, time_t now
)
1040 struct serverfd
*serverfdp
;
1041 struct listener
*listener
;
1044 for (serverfdp
= daemon
->sfds
; serverfdp
; serverfdp
= serverfdp
->next
)
1045 if (FD_ISSET(serverfdp
->fd
, set
))
1046 reply_query(serverfdp
->fd
, serverfdp
->source_addr
.sa
.sa_family
, now
);
1048 if (daemon
->port
!= 0 && !daemon
->osport
)
1049 for (i
= 0; i
< RANDOM_SOCKS
; i
++)
1050 if (daemon
->randomsocks
[i
].refcount
!= 0 &&
1051 FD_ISSET(daemon
->randomsocks
[i
].fd
, set
))
1052 reply_query(daemon
->randomsocks
[i
].fd
, daemon
->randomsocks
[i
].family
, now
);
1054 for (listener
= daemon
->listeners
; listener
; listener
= listener
->next
)
1056 if (listener
->fd
!= -1 && FD_ISSET(listener
->fd
, set
))
1057 receive_query(listener
, now
);
1060 if (listener
->tftpfd
!= -1 && FD_ISSET(listener
->tftpfd
, set
))
1061 tftp_request(listener
, now
);
1064 if (listener
->tcpfd
!= -1 && FD_ISSET(listener
->tcpfd
, set
))
1067 struct irec
*iface
= NULL
;
1070 while((confd
= accept(listener
->tcpfd
, NULL
, NULL
)) == -1 && errno
== EINTR
);
1075 if (daemon
->options
& OPT_NOWILD
)
1076 iface
= listener
->iface
;
1079 union mysockaddr tcp_addr
;
1080 socklen_t tcp_len
= sizeof(union mysockaddr
);
1081 /* Check for allowed interfaces when binding the wildcard address:
1082 we do this by looking for an interface with the same address as
1083 the local address of the TCP connection, then looking to see if that's
1084 an allowed interface. As a side effect, we get the netmask of the
1085 interface too, for localisation. */
1087 /* interface may be new since startup */
1088 if (enumerate_interfaces() &&
1089 getsockname(confd
, (struct sockaddr
*)&tcp_addr
, &tcp_len
) != -1)
1090 for (iface
= daemon
->interfaces
; iface
; iface
= iface
->next
)
1091 if (sockaddr_isequal(&iface
->addr
, &tcp_addr
))
1097 shutdown(confd
, SHUT_RDWR
);
1101 else if (!(daemon
->options
& OPT_DEBUG
) && (p
= fork()) != 0)
1106 for (i
= 0; i
< MAX_PROCS
; i
++)
1107 if (daemon
->tcp_pids
[i
] == 0)
1109 daemon
->tcp_pids
[i
] = p
;
1118 unsigned char *buff
;
1121 struct in_addr dst_addr_4
;
1123 dst_addr_4
.s_addr
= 0;
1125 /* Arrange for SIGALARM after CHILD_LIFETIME seconds to
1126 terminate the process. */
1127 if (!(daemon
->options
& OPT_DEBUG
))
1128 alarm(CHILD_LIFETIME
);
1130 /* start with no upstream connections. */
1131 for (s
= daemon
->servers
; s
; s
= s
->next
)
1134 /* The connected socket inherits non-blocking
1135 attribute from the listening socket.
1137 if ((flags
= fcntl(confd
, F_GETFL
, 0)) != -1)
1138 fcntl(confd
, F_SETFL
, flags
& ~O_NONBLOCK
);
1140 if (listener
->family
== AF_INET
)
1141 dst_addr_4
= iface
->addr
.in
.sin_addr
;
1143 buff
= tcp_request(confd
, now
, dst_addr_4
, iface
->netmask
);
1145 shutdown(confd
, SHUT_RDWR
);
1151 for (s
= daemon
->servers
; s
; s
= s
->next
)
1154 shutdown(s
->tcpfd
, SHUT_RDWR
);
1158 if (!(daemon
->options
& OPT_DEBUG
))
1170 int make_icmp_sock(void)
1175 if ((fd
= socket (AF_INET
, SOCK_RAW
, IPPROTO_ICMP
)) != -1)
1178 setsockopt(fd
, SOL_SOCKET
, SO_DONTROUTE
, &zeroopt
, sizeof(zeroopt
)) == -1)
1188 int icmp_ping(struct in_addr addr
)
1190 /* Try and get an ICMP echo from a machine. */
1192 /* Note that whilst in the three second wait, we check for
1193 (and service) events on the DNS and TFTP sockets, (so doing that
1194 better not use any resources our caller has in use...)
1195 but we remain deaf to signals or further DHCP packets. */
1198 struct sockaddr_in saddr
;
1203 unsigned short id
= rand16();
1208 #if defined(HAVE_LINUX_NETWORK) || defined (HAVE_SOLARIS_NETWORK)
1209 if ((fd
= make_icmp_sock()) == -1)
1213 fd
= daemon
->dhcp_icmp_fd
;
1214 setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &opt
, sizeof(opt
));
1217 saddr
.sin_family
= AF_INET
;
1219 saddr
.sin_addr
= addr
;
1220 #ifdef HAVE_SOCKADDR_SA_LEN
1221 saddr
.sin_len
= sizeof(struct sockaddr_in
);
1224 memset(&packet
.icmp
, 0, sizeof(packet
.icmp
));
1225 packet
.icmp
.icmp_type
= ICMP_ECHO
;
1226 packet
.icmp
.icmp_id
= id
;
1227 for (j
= 0, i
= 0; i
< sizeof(struct icmp
) / 2; i
++)
1228 j
+= ((u16
*)&packet
.icmp
)[i
];
1230 j
= (j
& 0xffff) + (j
>> 16);
1231 packet
.icmp
.icmp_cksum
= (j
== 0xffff) ? j
: ~j
;
1233 while (sendto(fd
, (char *)&packet
.icmp
, sizeof(struct icmp
), 0,
1234 (struct sockaddr
*)&saddr
, sizeof(saddr
)) == -1 &&
1237 for (now
= start
= dnsmasq_time();
1238 difftime(now
, start
) < (float)PING_WAIT
;)
1242 struct sockaddr_in faddr
;
1244 socklen_t len
= sizeof(faddr
);
1246 tv
.tv_usec
= 250000;
1252 set_dns_listeners(now
, &rset
, &maxfd
);
1253 set_log_writer(&wset
, &maxfd
);
1255 if (select(maxfd
+1, &rset
, &wset
, NULL
, &tv
) < 0)
1261 now
= dnsmasq_time();
1263 check_log_writer(&wset
);
1264 check_dns_listeners(&rset
, now
);
1267 check_tftp_listeners(&rset
, now
);
1270 if (FD_ISSET(fd
, &rset
) &&
1271 recvfrom(fd
, &packet
, sizeof(packet
), 0,
1272 (struct sockaddr
*)&faddr
, &len
) == sizeof(packet
) &&
1273 saddr
.sin_addr
.s_addr
== faddr
.sin_addr
.s_addr
&&
1274 packet
.icmp
.icmp_type
== ICMP_ECHOREPLY
&&
1275 packet
.icmp
.icmp_seq
== 0 &&
1276 packet
.icmp
.icmp_id
== id
)
1283 #if defined(HAVE_LINUX_NETWORK) || defined(HAVE_SOLARIS_NETWORK)
1287 setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &opt
, sizeof(opt
));