1ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
2ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
3ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   This program is free software; you can redistribute it and/or modify
4ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   it under the terms of the GNU General Public License as published by
5ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   the Free Software Foundation; version 2 dated June, 1991, or
6ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   (at your option) version 3 dated 29 June, 2007.
7ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
8ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   This program is distributed in the hope that it will be useful,
9ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   but WITHOUT ANY WARRANTY; without even the implied warranty of
10ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   GNU General Public License for more details.
12ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
13ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   You should have received a copy of the GNU General Public License
14ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   along with this program.  If not, see <http://www.gnu.org/licenses/>.
15ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat*/
16ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
17ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define COPYRIGHT "Copyright (C) 2000-2009 Simon Kelley"
18ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
19ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifndef NO_LARGEFILE
20ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* Ensure we can use files >2GB (log files may grow this big) */
21ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  define _LARGEFILE_SOURCE 1
22ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  define _FILE_OFFSET_BITS 64
23ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
24ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
25ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* Get linux C library versions. */
26ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef __linux__
275658bcb797978c3472335d93554405aba8236f66San Mehat#  ifndef __ANDROID__
285658bcb797978c3472335d93554405aba8236f66San Mehat#      define _GNU_SOURCE
295658bcb797978c3472335d93554405aba8236f66San Mehat#  endif
30ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <features.h>
31ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
32ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
33ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* get these before config.h  for IPv6 stuff... */
34ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/types.h>
35ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/socket.h>
36ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <netinet/in.h>
37ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
38ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef __APPLE__
39ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <nameser.h>
40ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <arpa/nameser_compat.h>
41ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#else
425658bcb797978c3472335d93554405aba8236f66San Mehat#  ifdef __ANDROID__
435658bcb797978c3472335d93554405aba8236f66San Mehat#    include "nameser.h"
445658bcb797978c3472335d93554405aba8236f66San Mehat#  else
455658bcb797978c3472335d93554405aba8236f66San Mehat#    include <arpa/nameser.h>
465658bcb797978c3472335d93554405aba8236f66San Mehat#  endif
47ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
48ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
49ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* and this. */
50ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <getopt.h>
51ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
52ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include "config.h"
53ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
54ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define gettext_noop(S) (S)
55ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifndef LOCALEDIR
56ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  define _(S) (S)
57ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#else
58ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <libintl.h>
59ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <locale.h>
60ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  define _(S) gettext(S)
61ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
62ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
63ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <arpa/inet.h>
64ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/stat.h>
65ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/ioctl.h>
66ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_SOLARIS_NETWORK)
67ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/sockio.h>
68ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
69ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/select.h>
70ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/wait.h>
71ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/time.h>
72ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/un.h>
73ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <limits.h>
74ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <net/if.h>
75ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <unistd.h>
76ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <stdio.h>
77ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <string.h>
78ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <stdlib.h>
79ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <fcntl.h>
80ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <ctype.h>
81ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <signal.h>
82ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <stddef.h>
83ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <time.h>
84ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <errno.h>
85ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <pwd.h>
86ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <grp.h>
87ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <stdarg.h>
885658bcb797978c3472335d93554405aba8236f66San Mehat#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__sun__) || defined (__sun) || defined (__ANDROID__)
89ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <netinet/if_ether.h>
90ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#else
91ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <net/ethernet.h>
92ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
93ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <net/if_arp.h>
94ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <netinet/in_systm.h>
95ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <netinet/ip.h>
96ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <netinet/ip_icmp.h>
97ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/uio.h>
98ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <syslog.h>
99ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <dirent.h>
100ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifndef HAVE_LINUX_NETWORK
101ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#  include <net/if_dl.h>
102ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
103ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
104ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_LINUX_NETWORK)
105ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <linux/capability.h>
106ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* There doesn't seem to be a universally-available
107ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   userpace header for these. */
108ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatextern int capset(cap_user_header_t header, cap_user_data_t data);
109ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatextern int capget(cap_user_header_t header, cap_user_data_t data);
110ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define LINUX_CAPABILITY_VERSION_1  0x19980330
111ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define LINUX_CAPABILITY_VERSION_2  0x20071026
112ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define LINUX_CAPABILITY_VERSION_3  0x20080522
113ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
114ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <sys/prctl.h>
115ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#elif defined(HAVE_SOLARIS_NETWORK)
116ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#include <priv.h>
117ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
118ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
119ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* daemon is function in the C library.... */
120ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define daemon dnsmasq_daemon
121ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
122ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* Async event queue */
123ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct event_desc {
124ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int event, data;
125ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
126ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
127ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_RELOAD    1
128ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_DUMP      2
129ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_ALARM     3
130ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_TERM      4
131ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_CHILD     5
132ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_REOPEN    6
133ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_EXITED    7
134ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_KILLED    8
135ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_EXEC_ERR  9
136ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_PIPE_ERR  10
137ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_USER_ERR  11
138ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_CAP_ERR   12
139ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_PIDFILE   13
140ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_HUSER_ERR 14
141ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_GROUP_ERR 15
142ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_DIE       16
143ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_LOG_ERR   17
144ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EVENT_FORK_ERR  18
145ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
146ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* Exit codes. */
147ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_GOOD        0
148ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_BADCONF     1
149ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_BADNET      2
150ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_FILE        3
151ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_NOMEM       4
152ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_MISC        5
153ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define EC_INIT_OFFSET 10
154ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
155ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* Min buffer size: we check after adding each record, so there must be
156ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   memory for the largest packet, and the largest record so the
157ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   min for DNS is PACKETSZ+MAXDNAME+RRFIXEDSZ which is < 1000.
158ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   This might be increased is EDNS packet size if greater than the minimum.
159ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat*/
160ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DNSMASQ_PACKETSZ PACKETSZ+MAXDNAME+RRFIXEDSZ
161ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
162ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_BOGUSPRIV      (1u<<0)
163ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_FILTER         (1u<<1)
164ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_LOG            (1u<<2)
165ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_SELFMX         (1u<<3)
166ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_HOSTS       (1u<<4)
167ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_POLL        (1u<<5)
168ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_DEBUG          (1u<<6)
169ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_ORDER          (1u<<7)
170ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_RESOLV      (1u<<8)
171ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_EXPAND         (1u<<9)
172ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_LOCALMX        (1u<<10)
173ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_NEG         (1u<<11)
174ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NODOTS_LOCAL   (1u<<12)
175ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NOWILD         (1u<<13)
176ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_ETHERS         (1u<<14)
177ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_RESOLV_DOMAIN  (1u<<15)
178ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_FORK        (1u<<16)
179ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_AUTHORITATIVE  (1u<<17)
180ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_LOCALISE       (1u<<18)
181ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_DBUS           (1u<<19)
182ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_DHCP_FQDN      (1u<<20)
183ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_PING        (1u<<21)
184ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_LEASE_RO       (1u<<22)
185ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_ALL_SERVERS    (1u<<23)
186ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_RELOAD         (1u<<24)
187ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_TFTP           (1u<<25)
188ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_TFTP_SECURE    (1u<<26)
189ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_TFTP_NOBLOCK   (1u<<27)
190ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_LOG_OPTS       (1u<<28)
191ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_TFTP_APREF     (1u<<29)
192ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_OVERRIDE    (1u<<30)
193ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define OPT_NO_REBIND      (1u<<31)
194ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
195ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* extra flags for my_syslog, we use a couple of facilities since they are known
196ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   not to occupy the same bits as priorities, no matter how syslog.h is set up. */
197ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MS_TFTP LOG_USER
198ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MS_DHCP LOG_DAEMON
199ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
200ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct all_addr {
201ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union {
202ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    struct in_addr addr4;
203ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_IPV6
204ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    struct in6_addr addr6;
205ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
206ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  } addr;
207ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
208ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
209ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct bogus_addr {
210ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr addr;
211ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct bogus_addr *next;
212ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
213ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
214ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dns doctor param */
215ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct doctor {
216ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr in, end, out, mask;
217ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct doctor *next;
218ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
219ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
220ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct mx_srv_record {
221ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name, *target;
222ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int issrv, srvport, priority, weight;
223ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int offset;
224ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct mx_srv_record *next;
225ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
226ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
227ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct naptr {
228ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name, *replace, *regexp, *services, *flags;
229ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int order, pref;
230ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct naptr *next;
231ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
232ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
233ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct txt_record {
234ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name, *txt;
235ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short class, len;
236ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct txt_record *next;
237ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
238ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
239ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct ptr_record {
240ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name, *ptr;
241ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct ptr_record *next;
242ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
243ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
244ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct cname {
245ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *alias, *target;
246ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct cname *next;
247ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
248ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
249ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct interface_name {
250ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name; /* domain name */
251ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *intr; /* interface name */
252ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct interface_name *next;
253ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
254ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
255ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunion bigname {
256ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char name[MAXDNAME];
257ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union bigname *next; /* freelist */
258ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
259ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
260ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec {
261ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct crec *next, *prev, *hash_next;
262ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t ttd; /* time to die */
263ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int uid;
264ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union {
265ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    struct all_addr addr;
266ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    struct {
267ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat      struct crec *cache;
268ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat      int uid;
269ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    } cname;
270ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  } addr;
271ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short flags;
272ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union {
273ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    char sname[SMALLDNAME];
274ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    union bigname *bname;
275ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    char *namep;
276ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  } name;
277ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
278ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
279ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_IMMORTAL  1
280ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_CONFIG    2
281ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_REVERSE   4
282ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_FORWARD   8
283ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_DHCP      16
284ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_NEG       32
285ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_HOSTS     64
286ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_IPV4      128
287ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_IPV6      256
288ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_BIGNAME   512
289ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_UPSTREAM  1024
290ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_SERVER    2048
291ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_NXDOMAIN  4096
292ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_QUERY     8192
293ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_CNAME     16384
294ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define F_NOERR     32768
295ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
296ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* struct sockaddr is not large enough to hold any address,
297ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   and specifically not big enough to hold an IPv6 address.
298ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat   Blech. Roll our own. */
299ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunion mysockaddr {
300ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct sockaddr sa;
301ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct sockaddr_in in;
302ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_IPV6)
303ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct sockaddr_in6 in6;
304ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
305ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
306ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
307ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_FROM_RESOLV       1  /* 1 for servers from resolv, 0 for command line. */
308ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_NO_ADDR           2  /* no server, this domain is local only */
309ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_LITERAL_ADDRESS   4  /* addr is the answer, not the server */
310ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_HAS_DOMAIN        8  /* server for one domain only */
311ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_HAS_SOURCE       16  /* source address defined */
312ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_FOR_NODOTS       32  /* server for names with no domain part only */
313ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_WARNED_RECURSIVE 64  /* avoid warning spam */
314ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_FROM_DBUS       128  /* 1 if source is DBus */
315ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_MARK            256  /* for mark-and-delete */
316ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_TYPE    (SERV_HAS_DOMAIN | SERV_FOR_NODOTS)
317ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define SERV_COUNTED         512  /* workspace for log code */
318ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
319ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct serverfd {
320ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int fd;
321ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union mysockaddr source_addr;
322ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char interface[IF_NAMESIZE+1];
323ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct serverfd *next;
32468eff53e7ed9df06f194478930f39b31c7a32458Lorenzo Colitti  uint32_t mark;
325ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
326ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
327ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct randfd {
328ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int fd;
329ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short refcount, family;
330ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
331ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
332ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct server {
333ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union mysockaddr addr, source_addr;
334ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char interface[IF_NAMESIZE+1];
335ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct serverfd *sfd;
336ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *domain; /* set if this server only handles a domain. */
337ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int flags, tcpfd;
338ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int queries, failed_queries;
33968eff53e7ed9df06f194478930f39b31c7a32458Lorenzo Colitti  uint32_t mark;
340ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct server *next;
341ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
342ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
343ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct irec {
344ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union mysockaddr addr;
345ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr netmask; /* only valid for IPv4 */
346ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int dhcp_ok, mtu;
347ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct irec *next;
348ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
349ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
350ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener {
351ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int fd, tcpfd, tftpfd, family;
352ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct irec *iface; /* only valid for non-wildcard */
353ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct listener *next;
354ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
355ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
356ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* interface and address parms from command line. */
357ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct iname {
358ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name;
359ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union mysockaddr addr;
360ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int isloop, used;
361ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct iname *next;
362ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
363ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
364ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* resolv-file parms from command-line */
365ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct resolvc {
366ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct resolvc *next;
367ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int is_default, logged;
368ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t mtime;
369ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *name;
370ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
371ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
372ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* adn-hosts parms from command-line */
373ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define AH_DIR      1
374ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define AH_INACTIVE 2
375ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct hostsfile {
376ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct hostsfile *next;
377ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int flags;
378ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *fname;
379ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int index; /* matches to cache entries for logging */
380ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
381ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
382ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct frec {
383ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union mysockaddr source;
384ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct all_addr dest;
385ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct server *sentto; /* NULL means free */
386ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct randfd *rfd4;
387ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_IPV6
388ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct randfd *rfd6;
389ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
390ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int iface;
391ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short orig_id, new_id;
392ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int fd, forwardall;
393ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int crc;
394ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t time;
395ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct frec *next;
396ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
397ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
398ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* actions in the daemon->helper RPC */
399ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_DEL           1
400ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_OLD_HOSTNAME  2
401ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_OLD           3
402ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_ADD           4
403ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
404ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHCP_CHADDR_MAX 16
405ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
406ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease {
407ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int clid_len;          /* length of client identifier */
408ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char *clid;   /* clientid */
409ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *hostname, *fqdn; /* name from client-hostname option or config */
410ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *old_hostname;    /* hostname before it moved to another lease */
411ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char auth_name;        /* hostname came from config, not from client */
412ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char new;              /* newly created */
413ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char changed;          /* modified */
414ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char aux_changed;      /* CLID or expiry changed */
415ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t expires;        /* lease expiry */
416ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_BROKEN_RTC
417ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int length;
418ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
419ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int hwaddr_len, hwaddr_type;
420ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char hwaddr[DHCP_CHADDR_MAX];
421ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr addr, override, giaddr;
422ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char *vendorclass, *userclass, *supplied_hostname;
423ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int vendorclass_len, userclass_len, supplied_hostname_len;
424ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int last_interface;
425ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_lease *next;
426ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
427ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
428ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_netid {
429ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *net;
430ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid *next;
431ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
432ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
433ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_netid_list {
434ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid *list;
435ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid_list *next;
436ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
437ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
438ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct hwaddr_config {
439ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int hwaddr_len, hwaddr_type;
440ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char hwaddr[DHCP_CHADDR_MAX];
441ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int wildcard_mask;
442ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct hwaddr_config *next;
443ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
444ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
445ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config {
446ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int flags;
447ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int clid_len;          /* length of client identifier */
448ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char *clid;   /* clientid */
449ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *hostname, *domain;
450ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid netid;
451ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr addr;
452ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t decline_time;
453ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int lease_time;
454ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct hwaddr_config *hwaddr;
455ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_config *next;
456ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
457ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
458ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_DISABLE           1
459ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_CLID              2
460ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_TIME              8
461ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NAME             16
462ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_ADDR             32
463ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NETID            64
464ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NOCLID          128
465ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_FROM_ETHERS     256    /* entry created by /etc/ethers */
466ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_ADDR_HOSTS      512    /* address added by from /etc/hosts */
467ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_DECLINED       1024    /* address declined by client */
468ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_BANK           2048    /* from dhcp hosts file */
469ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
470ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_opt {
471ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int opt, len, flags;
472ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  union {
473ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    int encap;
474ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    unsigned int wildcard_mask;
475ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat    unsigned char *vendor_class;
476ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  } u;
477ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char *val;
478ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid *netid;
479ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_opt *next;
480ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
481ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
482ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ADDR               1
483ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_STRING             2
484ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAPSULATE        4
485ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAP_MATCH        8
486ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_FORCE             16
487ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_BANK              32
488ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAP_DONE        64
489ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_MATCH            128
490ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_VENDOR           256
491ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_HEX              512
492ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_VENDOR_MATCH    1024
493ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
494ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_boot {
495ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *file, *sname;
496ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr next_server;
497ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid *netid;
498ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_boot *next;
499ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
500ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
501ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct pxe_service {
502ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short CSA, type;
503ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *menu, *basename;
504ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr server;
505ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid *netid;
506ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct pxe_service *next;
507ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
508ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
509ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_VENDOR     1
510ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_USER       2
511ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_CIRCUIT    3
512ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_REMOTE     4
513ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_SUBSCRIBER 5
514ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
515ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* vendorclass, userclass, remote-id or cicuit-id */
516ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_vendor {
517ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int len, match_type, option;
518ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *data;
519ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid netid;
520ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_vendor *next;
521ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
522ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
523ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_mac {
524ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int mask;
525ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int hwaddr_len, hwaddr_type;
526ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned char hwaddr[DHCP_CHADDR_MAX];
527ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid netid;
528ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_mac *next;
529ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
530ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
531ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_bridge {
532ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char iface[IF_NAMESIZE];
533ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_bridge *alias, *next;
534ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
535ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
536ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct cond_domain {
537ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *domain;
538ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr start, end;
539ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct cond_domain *next;
540ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
541ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
542ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context {
543ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int lease_time, addr_epoch;
544ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr netmask, broadcast;
545ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr local, router;
546ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr start, end; /* range of available addresses */
547ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int flags;
548ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid netid, *filter;
549ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_context *next, *current;
550ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
551ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
552ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_STATIC    1
553ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_NETMASK   2
554ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_BRDCAST   4
555ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_PROXY     8
556ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
557ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
558ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned char u8;
559ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned short u16;
560ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned int u32;
561ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
562ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
563ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_packet {
564ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  u8 op, htype, hlen, hops;
565ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  u32 xid;
566ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  u16 secs, flags;
567ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr ciaddr, yiaddr, siaddr, giaddr;
568ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  u8 chaddr[DHCP_CHADDR_MAX], sname[64], file[128];
569ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  u8 options[312];
570ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
571ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
572ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct ping_result {
573ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct in_addr addr;
574ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t time;
575ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct ping_result *next;
576ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
577ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
578ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct tftp_file {
579ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int refcount, fd;
580ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  off_t size;
581ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  dev_t dev;
582ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  ino_t inode;
583ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char filename[];
584ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
585ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
586ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct tftp_transfer {
587ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int sockfd;
588ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t timeout;
589ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int backoff;
590ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int block, blocksize, expansion;
591ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  off_t offset;
592ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct sockaddr_in peer;
593ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char opt_blocksize, opt_transize, netascii, carrylf;
594ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct tftp_file *file;
595ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct tftp_transfer *next;
596ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat};
597ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
598ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatextern struct daemon {
599ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* datastuctures representing the command-line and
600ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat     config file arguments. All set (including defaults)
601ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat     in option.c */
602ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
603ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int options;
604ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct resolvc default_resolv, *resolv_files;
605ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t last_resolv;
606ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct mx_srv_record *mxnames;
607ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct naptr *naptr;
608ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct txt_record *txt;
609ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct ptr_record *ptr;
610ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct cname *cnames;
611ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct interface_name *int_names;
612ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *mxtarget;
613ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *lease_file;
614ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *username, *groupname, *scriptuser;
615ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int group_set, osport;
616ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *domain_suffix;
617ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct cond_domain *cond_domain;
618ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *runfile;
619ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *lease_change_command;
620ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct iname *if_names, *if_addrs, *if_except, *dhcp_except;
621ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct bogus_addr *bogus_addr;
622ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct server *servers;
623ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int log_fac; /* log facility */
624ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *log_file; /* optional log file */
625ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int max_logs;  /* queue limit */
626ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int cachesize, ftabsize;
627ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int port, query_port, min_port;
628ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned long local_ttl, neg_ttl;
629ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct hostsfile *addn_hosts;
630ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_context *dhcp;
631ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_config *dhcp_conf;
632ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_opt *dhcp_opts, *dhcp_match;
633ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_vendor *dhcp_vendors;
634ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_mac *dhcp_macs;
635ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_boot *boot_config;
636ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct pxe_service *pxe_services;
637ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int enable_pxe;
638ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *force_broadcast, *bootp_dynamic;
639ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *dhcp_hosts_file, *dhcp_opts_file;
640ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int dhcp_max, tftp_max;
641ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int dhcp_server_port, dhcp_client_port;
642ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int start_tftp_port, end_tftp_port;
643ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int min_leasetime;
644ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct doctor *doctors;
645ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned short edns_pktsz;
646ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *tftp_prefix;
647ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
648ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* globally used stuff for DNS */
649ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *packet; /* packet buffer */
650ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int packet_buff_sz; /* size of above */
651ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *namebuff; /* MAXDNAME size buffer */
652ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  unsigned int local_answer, queries_forwarded;
653ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct frec *frec_list;
654ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct serverfd *sfds;
655ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct irec *interfaces;
656ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct listener *listeners;
657ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct server *last_server;
658ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  time_t forwardtime;
659ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int forwardcount;
660ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct server *srv_save; /* Used for resend on DoD */
661ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  size_t packet_len;       /*      "        "        */
662ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct randfd *rfd_save; /*      "        "        */
663ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  pid_t tcp_pids[MAX_PROCS];
664ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct randfd randomsocks[RANDOM_SOCKS];
665ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
666ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* DHCP state */
667ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int dhcpfd, helperfd;
668ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_LINUX_NETWORK)
669ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int netlinkfd;
670ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#elif defined(HAVE_BSD_NETWORK)
671ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  int dhcp_raw_fd, dhcp_icmp_fd;
672ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
673ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct iovec dhcp_packet;
674ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  char *dhcp_buff, *dhcp_buff2;
675ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct ping_result *ping_results;
676ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  FILE *lease_stream;
677ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct dhcp_bridge *bridges;
678ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
679ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* DBus stuff */
680ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* void * here to avoid depending on dbus headers outside dbus.c */
681ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  void *dbus;
682ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DBUS
683ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct watch *watches;
684ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
685ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
686ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  /* TFTP stuff */
687ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat  struct tftp_transfer *tftp_trans;
688ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
689ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat} *daemon;
690ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
691ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* cache.c */
692ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_init(void);
693ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid log_query(unsigned short flags, char *name, struct all_addr *addr, char *arg);
694ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *record_source(int index);
695ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid querystr(char *str, unsigned short type);
696ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_find_by_addr(struct crec *crecp,
697ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				struct all_addr *addr, time_t now,
698ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				unsigned short prot);
699ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_find_by_name(struct crec *crecp,
700ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				char *name, time_t now, unsigned short  prot);
701ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_end_insert(void);
702ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_start_insert(void);
703ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_insert(char *name, struct all_addr *addr,
704ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat			  time_t now, unsigned long ttl, unsigned short flags);
705ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_reload(void);
706ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t ttd);
707ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_unhash_dhcp(void);
708ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dump_cache(time_t now);
709ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *cache_get_name(struct crec *crecp);
710ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *get_domain(struct in_addr addr);
711ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
712ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* rfc1035.c */
713ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned short extract_request(HEADER *header, size_t qlen,
714ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat			       char *name, unsigned short *typep);
715ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t setup_reply(HEADER *header, size_t  qlen,
716ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		   struct all_addr *addrp, unsigned short flags,
717ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		   unsigned long local_ttl);
718ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint extract_addresses(HEADER *header, size_t qlen, char *namebuff, time_t now);
719ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t answer_request(HEADER *header, char *limit, size_t qlen,
720ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		   struct in_addr local_addr, struct in_addr local_netmask, time_t now);
721ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name,
722ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat			     struct bogus_addr *addr, time_t now);
723ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *find_pseudoheader(HEADER *header, size_t plen,
724ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				 size_t *len, unsigned char **p, int *is_sign);
725ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint check_for_local_domain(char *name, time_t now);
726ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned int questions_crc(HEADER *header, size_t plen, char *buff);
727ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t resize_packet(HEADER *header, size_t plen,
728ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		  unsigned char *pheader, size_t hlen);
729ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
730ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* util.c */
731ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid rand_init(void);
732ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned short rand16(void);
733ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint legal_hostname(char *c);
734ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *canonicalise(char *s, int *nomem);
735ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *do_rfc1035_name(unsigned char *p, char *sval);
736ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid *safe_malloc(size_t size);
737ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid safe_pipe(int *fd, int read_noblock);
738ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid *whine_malloc(size_t size);
739ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint sa_len(union mysockaddr *addr);
740ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2);
741ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint hostname_isequal(char *a, char *b);
742ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattime_t dnsmasq_time(void);
743ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
744ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint retry_send(void);
745ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid prettyprint_time(char *buf, unsigned int t);
746ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint prettyprint_addr(union mysockaddr *addr, char *buf);
747ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint parse_hex(char *in, unsigned char *out, int maxlen,
748ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat	      unsigned int *wildcard_mask, int *mac_type);
749ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint memcmp_masked(unsigned char *a, unsigned char *b, int len,
750ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		  unsigned int mask);
751ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint expand_buf(struct iovec *iov, size_t size);
752ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *print_mac(char *buff, unsigned char *mac, int len);
753ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid bump_maxfd(int fd, int *max);
754ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint read_write(int fd, unsigned char *packet, int size, int rw);
755ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
756ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* log.c */
757ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid die(char *message, char *arg1, int exit_code);
758ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint log_start(struct passwd *ent_pw, int errfd);
759ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint log_reopen(char *log_file);
760ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid my_syslog(int priority, const char *format, ...);
761ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid set_log_writer(fd_set *set, int *maxfdp);
762ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_log_writer(fd_set *set);
763ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid flush_log(void);
764ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
765ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* option.c */
766ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid read_opts (int argc, char **argv, char *compile_opts);
767ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *option_string(unsigned char opt, int *is_ip, int *is_name);
768ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid reread_dhcp(void);
769ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
770ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* forward.c */
771ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid reply_query(int fd, int family, time_t now);
772ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid receive_query(struct listener *listen, time_t now);
773ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *tcp_request(int confd, time_t now,
774ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat			   struct in_addr local_addr, struct in_addr netmask);
775ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid server_gone(struct server *server);
776ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct frec *get_new_frec(time_t now, int *wait);
777ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
778ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* network.c */
779ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint indextoname(int fd, int index, char *name);
78068eff53e7ed9df06f194478930f39b31c7a32458Lorenzo Colittiint local_bind(int fd, union mysockaddr *addr, char *intname, uint32_t mark, int is_tcp);
781ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint random_sock(int family);
782ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid pre_allocate_sfds(void);
783ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint reload_servers(char *fname);
78433b344454b95ed99bad7d3fe4d493870923deaf6San Mehat#ifdef __ANDROID__
78533b344454b95ed99bad7d3fe4d493870923deaf6San Mehatint set_servers(const char *servers);
78641cd7ed80eb5e97ef9893633d05f0877da7d6d0cRobert Greenwaltvoid set_interfaces(const char *interfaces);
78733b344454b95ed99bad7d3fe4d493870923deaf6San Mehat#endif
788ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_servers(void);
789ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint enumerate_interfaces();
790ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener *create_wildcard_listeners(void);
791ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener *create_bound_listeners(void);
792ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint iface_check(int family, struct all_addr *addr, char *name, int *indexp);
793ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint fix_fd(int fd);
794ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct in_addr get_ifaddr(char *intr);
795ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
796ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dhcp.c */
797ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP
798ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_init(void);
799ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_packet(time_t now);
800ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context *address_available(struct dhcp_context *context,
801ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				       struct in_addr addr,
802ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				       struct dhcp_netid *netids);
803ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context *narrow_context(struct dhcp_context *context,
804ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				    struct in_addr taddr,
805ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				    struct dhcp_netid *netids);
806ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly);int address_allocate(struct dhcp_context *context,
807ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		     struct in_addr *addrp, unsigned char *hwaddr, int hw_len,
808ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		     struct dhcp_netid *netids, time_t now);
809ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type);
810ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config *find_config(struct dhcp_config *configs,
811ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				struct dhcp_context *context,
812ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				unsigned char *clid, int clid_len,
813ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				unsigned char *hwaddr, int hw_len,
814ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat				int hw_type, char *hostname);
815ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_update_configs(struct dhcp_config *configs);
816ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_read_ethers(void);
817ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_dhcp_hosts(int fatal);
818ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
819ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *strip_hostname(char *hostname);
820ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *host_from_dns(struct in_addr addr);
821ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *get_domain(struct in_addr addr);
822ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
823ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
824ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* lease.c */
825ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP
826ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_file(time_t now);
827ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_dns();
828ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_init(time_t now);
829ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_allocate(struct in_addr addr);
830ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
831ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		      unsigned char *clid, int hw_len, int hw_type, int clid_len);
832ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_hostname(struct dhcp_lease *lease, char *name, int auth);
833ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
834ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_interface(struct dhcp_lease *lease, int interface);
835ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
836ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat					unsigned char *clid, int clid_len);
837ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_find_by_addr(struct in_addr addr);
838ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_prune(struct dhcp_lease *target, time_t now);
839ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_from_configs(void);
840ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint do_script_run(time_t now);
841ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid rerun_scripts(void);
842ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
843ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
844ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* rfc2131.c */
845ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP
846ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
847ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		  size_t sz, time_t now, int unicast_dest, int *is_inform);
848ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
849ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat			       int clid_len, unsigned char *clid, int *len_out);
850ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
851ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
852ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dnsmasq.c */
853ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP
854ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint make_icmp_sock(void);
855ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint icmp_ping(struct in_addr addr);
856ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
857ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid send_event(int fd, int event, int data);
858ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid clear_cache_and_reload(time_t now);
859ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
860ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* netlink.c */
861ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_LINUX_NETWORK
862ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid netlink_init(void);
863ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid netlink_multicast(void);
864ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
865ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
866ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* bpf.c */
867ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_BSD_NETWORK
868ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid init_bpf(void);
869ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid send_via_bpf(struct dhcp_packet *mess, size_t len,
870ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		  struct in_addr iface_addr, struct ifreq *ifr);
871ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
872ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
873ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* bpf.c or netlink.c */
874ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint iface_enumerate(void *parm, int (*ipv4_callback)(), int (*ipv6_callback)());
875ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
876ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dbus.c */
877ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DBUS
878ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *dbus_init(void);
879ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset);
880ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid set_dbus_listeners(int *maxfdp, fd_set *rset, fd_set *wset, fd_set *eset);
881ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname);
882ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
883ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
884ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* helper.c */
885ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_DHCP) && !defined(NO_FORK)
886ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd);
887ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid helper_write(void);
888ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid queue_script(int action, struct dhcp_lease *lease,
889ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat		  char *hostname, time_t now);
890ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint helper_buf_empty(void);
891ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
892ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat
893ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* tftp.c */
894ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_TFTP
895ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid tftp_request(struct listener *listen, time_t now);
896ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_tftp_listeners(fd_set *rset, time_t now);
897ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif
898