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