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#define VERSION "2.51"
18
19#define FTABSIZ 150 /* max number of outstanding requests (default) */
20#define MAX_PROCS 20 /* max no children for TCP requests */
21#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
22#define EDNS_PKTSZ 1280 /* default max EDNS.0 UDP packet from RFC2671 */
23#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
24#define FORWARD_TEST 50 /* try all servers every 50 queries */
25#define FORWARD_TIME 10 /* or 10 seconds */
26#define RANDOM_SOCKS 64 /* max simultaneous random ports */
27#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
28#define CACHESIZ 150 /* default cache size */
29#define MAXLEASES 150 /* maximum number of DHCP leases */
30#define PING_WAIT 3 /* wait for ping address-in-use test */
31#define PING_CACHE_TIME 30 /* Ping test assumed to be valid this long. */
32#define DECLINE_BACKOFF 600 /* disable DECLINEd static addresses for this long */
33#define DHCP_PACKET_MAX 16384 /* hard limit on DHCP packet size */
34#define SMALLDNAME 40 /* most domain names are smaller than this */
35#define HOSTSFILE "/etc/hosts"
36#define ETHERSFILE "/etc/ethers"
37#ifdef __uClinux__
38#  define RESOLVFILE "/etc/config/resolv.conf"
39#else
40#  define RESOLVFILE "/etc/resolv.conf"
41#endif
42#define RUNFILE "/var/run/dnsmasq.pid"
43
44#ifndef LEASEFILE
45#   if defined(__FreeBSD__) || defined (__OpenBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
46#      define LEASEFILE "/var/db/dnsmasq.leases"
47#   elif defined(__sun__) || defined (__sun)
48#      define LEASEFILE "/var/cache/dnsmasq.leases"
49#   elif defined(__ANDROID__)
50#      define LEASEFILE "/data/misc/dhcp/dnsmasq.leases"
51#   else
52#      define LEASEFILE "/var/lib/misc/dnsmasq.leases"
53#   endif
54#endif
55
56#ifndef CONFFILE
57#   if defined(__FreeBSD__)
58#      define CONFFILE "/usr/local/etc/dnsmasq.conf"
59#   else
60#      define CONFFILE "/etc/dnsmasq.conf"
61#   endif
62#endif
63
64#define DEFLEASE 3600 /* default lease time, 1 hour */
65#define CHUSER "nobody"
66#define CHGRP "dip"
67#define DHCP_SERVER_PORT 67
68#define DHCP_CLIENT_PORT 68
69#define DHCP_SERVER_ALTPORT 1067
70#define DHCP_CLIENT_ALTPORT 1068
71#define LOG_MAX 5 /* log-queue length */
72#define RANDFILE "/dev/urandom"
73#define DAD_WAIT 20 /* retry binding IPv6 sockets for this long */
74
75/* A small collection of RR-types which are missing on some platforms */
76
77#ifndef T_SIG
78#  define T_SIG 24
79#endif
80
81#ifndef T_SRV
82#  define T_SRV 33
83#endif
84
85#ifndef T_OPT
86#  define T_OPT 41
87#endif
88
89#ifndef T_TKEY
90#  define T_TKEY 249
91#endif
92
93#ifndef T_TSIG
94#  define T_TSIG 250
95#endif
96
97
98/* Follows system specific switches. If you run on a
99   new system, you may want to edit these.
100   May replace this with Autoconf one day.
101
102HAVE_LINUX_NETWORK
103HAVE_BSD_NETWORK
104HAVE_SOLARIS_NETWORK
105   define exactly one of these to alter interaction with kernel networking.
106
107HAVE_BROKEN_RTC
108   define this on embedded systems which don't have an RTC
109   which keeps time over reboots. Causes dnsmasq to use uptime
110   for timing, and keep lease lengths rather than expiry times
111   in its leases file. This also make dnsmasq "flash disk friendly".
112   Normally, dnsmasq tries very hard to keep the on-disk leases file
113   up-to-date: rewriting it after every renewal.  When HAVE_BROKEN_RTC
114   is in effect, the lease file is only written when a new lease is
115   created, or an old one destroyed. (Because those are the only times
116   it changes.) This vastly reduces the number of file writes, and makes
117   it viable to keep the lease file on a flash filesystem.
118   NOTE: when enabling or disabling this, be sure to delete any old
119   leases file, otherwise dnsmasq may get very confused.
120
121HAVE_DHCP
122   define this to get dnsmasq's DHCP server.
123
124HAVE_SCRIPT
125   define this to get the ability to call scripts on lease-change
126
127HAVE_GETOPT_LONG
128   define this if you have GNU libc or GNU getopt.
129
130HAVE_ARC4RANDOM
131   define this if you have arc4random() to get better security from DNS spoofs
132   by using really random ids (OpenBSD)
133
134HAVE_SOCKADDR_SA_LEN
135   define this if struct sockaddr has sa_len field (*BSD)
136
137NOTES:
138   For Linux you should define
139      HAVE_LINUX_NETWORK
140      HAVE_GETOPT_LONG
141  you should NOT define
142      HAVE_ARC4RANDOM
143      HAVE_SOCKADDR_SA_LEN
144
145   For *BSD systems you should define
146     HAVE_BSD_NETWORK
147     HAVE_SOCKADDR_SA_LEN
148   and you MAY define
149     HAVE_ARC4RANDOM - OpenBSD and FreeBSD and NetBSD version 2.0 or later
150     HAVE_GETOPT_LONG - NetBSD, later FreeBSD
151                       (FreeBSD and OpenBSD only if you link GNU getopt)
152
153*/
154
155/* platform independent options- uncomment to enable */
156#define HAVE_DHCP
157#define HAVE_SCRIPT
158/* #define HAVE_BROKEN_RTC */
159
160/* Allow DHCP to be disabled with COPTS=-DNO_DHCP */
161#ifdef NO_DHCP
162#undef HAVE_DHCP
163#endif
164
165/* Allow scripts to be disabled with COPTS=-DNO_SCRIPT */
166#ifdef NO_SCRIPT
167#undef HAVE_SCRIPT
168#endif
169
170
171
172/* platform dependent options. */
173
174/* Must preceed __linux__ since uClinux defines __linux__ too. */
175#if defined(__uClinux__)
176#define HAVE_LINUX_NETWORK
177#define HAVE_GETOPT_LONG
178#undef HAVE_ARC4RANDOM
179#undef HAVE_SOCKADDR_SA_LEN
180/* Never use fork() on uClinux. Note that this is subtly different from the
181   --keep-in-foreground option, since it also  suppresses forking new
182   processes for TCP connections and disables the call-a-script on leasechange
183   system. It's intended for use on MMU-less kernels. */
184#define NO_FORK
185
186#elif defined(__UCLIBC__)
187#define HAVE_LINUX_NETWORK
188#if defined(__UCLIBC_HAS_GNU_GETOPT__) || \
189   ((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21))
190#    define HAVE_GETOPT_LONG
191#endif
192#undef HAVE_ARC4RANDOM
193#undef HAVE_SOCKADDR_SA_LEN
194#if !defined(__ARCH_HAS_MMU__) && !defined(__UCLIBC_HAS_MMU__)
195#  define NO_FORK
196#endif
197#if defined(__UCLIBC_HAS_IPV6__)
198#  ifndef IPV6_V6ONLY
199#    define IPV6_V6ONLY 26
200#  endif
201#endif
202
203/* This is for glibc 2.x */
204#elif defined(__linux__)
205#define HAVE_LINUX_NETWORK
206#define HAVE_GETOPT_LONG
207#undef HAVE_ARC4RANDOM
208#undef HAVE_SOCKADDR_SA_LEN
209
210#elif defined(__FreeBSD__) || \
211      defined(__OpenBSD__) || \
212      defined(__DragonFly__) || \
213      defined (__FreeBSD_kernel__)
214#define HAVE_BSD_NETWORK
215/* Later verions of FreeBSD have getopt_long() */
216#if defined(optional_argument) && defined(required_argument)
217#   define HAVE_GETOPT_LONG
218#endif
219#if !defined (__FreeBSD_kernel__)
220#   define HAVE_ARC4RANDOM
221#endif
222#define HAVE_SOCKADDR_SA_LEN
223
224#elif defined(__APPLE__)
225#define HAVE_BSD_NETWORK
226#undef HAVE_GETOPT_LONG
227#define HAVE_ARC4RANDOM
228#define HAVE_SOCKADDR_SA_LEN
229/* Define before sys/socket.h is included so we get socklen_t */
230#define _BSD_SOCKLEN_T_
231
232#elif defined(__NetBSD__)
233#define HAVE_BSD_NETWORK
234#define HAVE_GETOPT_LONG
235#undef HAVE_ARC4RANDOM
236#define HAVE_SOCKADDR_SA_LEN
237
238#elif defined(__sun) || defined(__sun__)
239#define HAVE_SOLARIS_NETWORK
240#define HAVE_GETOPT_LONG
241#undef HAVE_ARC4RANDOM
242#undef HAVE_SOCKADDR_SA_LEN
243#define _XPG4_2
244#define __EXTENSIONS__
245#define ETHER_ADDR_LEN 6
246
247#endif
248
249/* Decide if we're going to support IPv6 */
250/* IPv6 can be forced off with "make COPTS=-DNO_IPV6" */
251/* We assume that systems which don't have IPv6
252   headers don't have ntop and pton either */
253
254#if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6)
255#  define HAVE_IPV6
256#  define ADDRSTRLEN INET6_ADDRSTRLEN
257#  if defined(SOL_IPV6)
258#    define IPV6_LEVEL SOL_IPV6
259#  else
260#    define IPV6_LEVEL IPPROTO_IPV6
261#  endif
262#elif defined(INET_ADDRSTRLEN)
263#  undef HAVE_IPV6
264#  define ADDRSTRLEN INET_ADDRSTRLEN
265#else
266#  undef HAVE_IPV6
267#  define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */
268#endif
269
270/* Can't do scripts without fork */
271#ifdef NOFORK
272#  undef HAVE_SCRIPT
273#endif
274
275