]> git.ipfire.org Git - people/ms/dnsmasq.git/blame - src/dnsmasq.h
import of dnsmasq-2.26.tar.gz
[people/ms/dnsmasq.git] / src / dnsmasq.h
CommitLineData
f6b7dc47 1/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
9e4abcb5
SK
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.
6
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
11*/
12
13/* Author's email: simon@thekelleys.org.uk */
feba5c1d 14
e17fb629 15#define COPYRIGHT "Copyright (C) 2000-2006 Simon Kelley"
9e4abcb5 16
44a2a316 17#ifdef __linux__
9e4abcb5 18/* for pselect.... */
f6b7dc47 19# define _XOPEN_SOURCE 600
9e4abcb5
SK
20/* but then DNS headers don't compile without.... */
21#define _BSD_SOURCE
44a2a316
SK
22#endif
23
9e4abcb5 24/* get these before config.h for IPv6 stuff... */
44a2a316 25#include <sys/types.h>
9e4abcb5
SK
26#include <netinet/in.h>
27
28/* get this before config.h too. */
29#include <syslog.h>
f6b7dc47
SK
30#ifdef __APPLE__
31/* need this before arpa/nameser.h */
32# define BIND_8_COMPAT
33#endif
3be34541 34#include <arpa/nameser.h>
9e4abcb5 35
59353a6b
SK
36/* and this. */
37#include <getopt.h>
38
9e4abcb5 39#include "config.h"
b8187c80
SK
40
41#define gettext_noop(S) (S)
42#ifdef NO_GETTEXT
43# define _(S) (S)
44#else
45# include <libintl.h>
46# include <locale.h>
47# define _(S) gettext(S)
48#endif
49
9e4abcb5
SK
50#include <arpa/inet.h>
51#include <sys/stat.h>
52#include <sys/socket.h>
9e4abcb5
SK
53#include <sys/ioctl.h>
54#include <sys/select.h>
feba5c1d 55#include <sys/wait.h>
9e4abcb5 56#if defined(__sun) || defined(__sun__)
44a2a316 57# include <sys/sockio.h>
9e4abcb5
SK
58#endif
59#include <sys/time.h>
8a911ccc 60#include <limits.h>
9e4abcb5
SK
61#include <net/if.h>
62#include <unistd.h>
63#include <stdio.h>
64#include <string.h>
65#include <stdlib.h>
66#include <fcntl.h>
67#include <ctype.h>
68#include <signal.h>
9e4abcb5
SK
69#include <time.h>
70#include <errno.h>
71#include <pwd.h>
72#include <grp.h>
f6b7dc47 73#include <stdarg.h>
de37951c 74#if defined(__OpenBSD__) || defined(__NetBSD__)
44a2a316
SK
75# include <netinet/if_ether.h>
76#else
77# include <net/ethernet.h>
78#endif
9e4abcb5
SK
79#include <net/if_arp.h>
80#include <netinet/in_systm.h>
81#include <netinet/ip.h>
3be34541 82#include <netinet/ip_icmp.h>
9e4abcb5 83#ifdef HAVE_BPF
44a2a316
SK
84# include <net/bpf.h>
85# include <net/if_dl.h>
86#else
87# include <netpacket/packet.h>
9e4abcb5
SK
88#endif
89#include <sys/uio.h>
90
0a852541
SK
91/* Min buffer size: we check after adding each record, so there must be
92 memory for the largest packet, and the largest record so the
93 min for DNS is PACKETSZ+MAXDNAME+RRFIXEDSZ which is < 1000.
94 This might be increased is EDNS packet size if greater than the minimum.
95 The buffer is also used for NETLINK, which needs to be about 2000
96 on systems with many interfaces/addresses. */
97#ifdef HAVE_RTNETLINK
98# define DNSMASQ_PACKETSZ PACKETSZ+MAXDNAME+RRFIXEDSZ
99#else
100# define DNSMASQ_PACKETSZ 2000
101#endif
44a2a316 102
9e4abcb5
SK
103#define OPT_BOGUSPRIV 1
104#define OPT_FILTER 2
105#define OPT_LOG 4
106#define OPT_SELFMX 8
107#define OPT_NO_HOSTS 16
108#define OPT_NO_POLL 32
109#define OPT_DEBUG 64
110#define OPT_ORDER 128
111#define OPT_NO_RESOLV 256
112#define OPT_EXPAND 512
113#define OPT_LOCALMX 1024
114#define OPT_NO_NEG 2048
115#define OPT_NODOTS_LOCAL 4096
44a2a316
SK
116#define OPT_NOWILD 8192
117#define OPT_ETHERS 16384
de37951c 118#define OPT_RESOLV_DOMAIN 32768
3be34541 119#define OPT_NO_FORK 65536
fd9fa481 120#define OPT_AUTHORITATIVE 131072
f6b7dc47 121#define OPT_LOCALISE 262144
3d8df260
SK
122#define OPT_DBUS 524288
123#define OPT_BOOTP_DYNAMIC 1048576
9e4abcb5
SK
124
125struct all_addr {
126 union {
127 struct in_addr addr4;
128#ifdef HAVE_IPV6
129 struct in6_addr addr6;
130#endif
131 } addr;
132};
133
134struct bogus_addr {
135 struct in_addr addr;
136 struct bogus_addr *next;
137};
138
1cff166d
SK
139/* dns doctor param */
140struct doctor {
141 struct in_addr in, out, mask;
142 struct doctor *next;
143};
144
0a852541
SK
145struct mx_srv_record {
146 char *name, *target;
3d8df260
SK
147 int issrv, srvport, priority, weight;
148 unsigned int offset;
0a852541 149 struct mx_srv_record *next;
de37951c
SK
150};
151
0a852541
SK
152struct txt_record {
153 char *name, *txt;
154 unsigned short class, len;
155 struct txt_record *next;
f6b7dc47
SK
156};
157
9e4abcb5
SK
158union bigname {
159 char name[MAXDNAME];
160 union bigname *next; /* freelist */
161};
162
163struct crec {
164 struct crec *next, *prev, *hash_next;
165 time_t ttd; /* time to die */
fd9fa481
SK
166 int uid;
167 union {
168 struct all_addr addr;
169 struct {
170 struct crec *cache;
171 int uid;
172 } cname;
173 } addr;
9e4abcb5
SK
174 unsigned short flags;
175 union {
176 char sname[SMALLDNAME];
177 union bigname *bname;
178 char *namep;
179 } name;
180};
181
182#define F_IMMORTAL 1
fd9fa481 183#define F_CONFIG 2
9e4abcb5
SK
184#define F_REVERSE 4
185#define F_FORWARD 8
186#define F_DHCP 16
187#define F_NEG 32
188#define F_HOSTS 64
189#define F_IPV4 128
190#define F_IPV6 256
191#define F_BIGNAME 512
192#define F_UPSTREAM 1024
193#define F_SERVER 2048
194#define F_NXDOMAIN 4096
195#define F_QUERY 8192
fd9fa481 196#define F_CNAME 16384
9e4abcb5
SK
197#define F_NOERR 32768
198
199/* struct sockaddr is not large enough to hold any address,
200 and specifically not big enough to hold and IPv6 address.
201 Blech. Roll our own. */
202union mysockaddr {
203 struct sockaddr sa;
204 struct sockaddr_in in;
205#ifdef HAVE_BROKEN_SOCKADDR_IN6
206 /* early versions of glibc don't include sin6_scope_id in sockaddr_in6
207 but latest kernels _require_ it to be set. The choice is to have
208 dnsmasq fail to compile on back-level libc or fail to run
209 on latest kernels with IPv6. Or to do this: sorry that it's so gross. */
210 struct my_sockaddr_in6 {
211 sa_family_t sin6_family; /* AF_INET6 */
212 uint16_t sin6_port; /* transport layer port # */
213 uint32_t sin6_flowinfo; /* IPv6 traffic class & flow info */
214 struct in6_addr sin6_addr; /* IPv6 address */
215 uint32_t sin6_scope_id; /* set of interfaces for a scope */
216 } in6;
217#elif defined(HAVE_IPV6)
218 struct sockaddr_in6 in6;
219#endif
220};
221
0a852541
SK
222#define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */
223#define SERV_NO_ADDR 2 /* no server, this domain is local only */
224#define SERV_LITERAL_ADDRESS 4 /* addr is the answer, not the server */
225#define SERV_HAS_SOURCE 8 /* source address specified */
226#define SERV_HAS_DOMAIN 16 /* server for one domain only */
227#define SERV_FOR_NODOTS 32 /* server for names with no domain part only */
228#define SERV_WARNED_RECURSIVE 64 /* avoid warning spam */
3d8df260
SK
229#define SERV_FROM_DBUS 128 /* 1 if source is DBus */
230#define SERV_MARK 256 /* for mark-and-delete */
9e4abcb5
SK
231#define SERV_TYPE (SERV_HAS_DOMAIN | SERV_FOR_NODOTS)
232
0a852541 233
9e4abcb5
SK
234struct serverfd {
235 int fd;
236 union mysockaddr source_addr;
237 struct serverfd *next;
238};
239
240struct server {
241 union mysockaddr addr, source_addr;
242 struct serverfd *sfd; /* non-NULL if this server has its own fd bound to
243 a source port */
244 char *domain; /* set if this server only handles a domain. */
feba5c1d 245 int flags, tcpfd;
9e4abcb5
SK
246 struct server *next;
247};
248
9e4abcb5
SK
249struct irec {
250 union mysockaddr addr;
f6b7dc47 251 struct in_addr netmask; /* only valid for IPv4 */
9e4abcb5
SK
252 struct irec *next;
253};
254
44a2a316 255struct listener {
feba5c1d 256 int fd, tcpfd, family;
f6b7dc47 257 struct irec *iface; /* only valid for non-wildcard */
44a2a316
SK
258 struct listener *next;
259};
260
9e4abcb5
SK
261/* interface and address parms from command line. */
262struct iname {
263 char *name;
264 union mysockaddr addr;
de37951c 265 int isloop, used;
9e4abcb5
SK
266 struct iname *next;
267};
268
269/* resolv-file parms from command-line */
270struct resolvc {
271 struct resolvc *next;
3d8df260
SK
272 int is_default, logged;
273 time_t mtime;
9e4abcb5
SK
274 char *name;
275};
276
fd9fa481
SK
277/* adn-hosts parms from command-line */
278struct hostsfile {
279 struct hostsfile *next;
280 char *fname;
281 int index; /* matches to cache entries fro logging */
282};
283
9e4abcb5
SK
284struct frec {
285 union mysockaddr source;
44a2a316 286 struct all_addr dest;
9e4abcb5 287 struct server *sentto;
dfa666f2 288 unsigned int iface;
9e4abcb5 289 unsigned short orig_id, new_id;
0a852541 290 int fd, forwardall;
fd9fa481 291 unsigned int crc;
9e4abcb5
SK
292 time_t time;
293 struct frec *next;
294};
295
296struct dhcp_lease {
297 int clid_len; /* length of client identifier */
298 unsigned char *clid; /* clientid */
299 char *hostname, *fqdn; /* name from client-hostname option or config */
b8187c80 300 int auth_name; /* hostname came from config, not from client */
9e4abcb5
SK
301 time_t expires; /* lease expiry */
302 unsigned char hwaddr[ETHER_ADDR_LEN];
303 struct in_addr addr;
304 struct dhcp_lease *next;
305};
306
a222641c
SK
307struct dhcp_netid {
308 char *net;
309 struct dhcp_netid *next;
310};
311
26128d27
SK
312struct dhcp_netid_list {
313 struct dhcp_netid *list;
314 struct dhcp_netid_list *next;
315};
9e4abcb5 316struct dhcp_config {
33820b7e 317 unsigned int flags;
9e4abcb5
SK
318 int clid_len; /* length of client identifier */
319 unsigned char *clid; /* clientid */
320 unsigned char hwaddr[ETHER_ADDR_LEN];
a222641c
SK
321 char *hostname;
322 struct dhcp_netid netid;
9e4abcb5 323 struct in_addr addr;
0a852541 324 unsigned int lease_time, wildcard_mask;
9e4abcb5
SK
325 struct dhcp_config *next;
326};
327
0a852541
SK
328#define CONFIG_DISABLE 1
329#define CONFIG_CLID 2
330#define CONFIG_HWADDR 4
331#define CONFIG_TIME 8
332#define CONFIG_NAME 16
333#define CONFIG_ADDR 32
334#define CONFIG_NETID 64
335#define CONFIG_NOCLID 128
33820b7e 336
9e4abcb5 337struct dhcp_opt {
1ab84e2f 338 int opt, len, is_addr;
91dccd09 339 unsigned char *val, *vendor_class;
26128d27 340 struct dhcp_netid *netid;
9e4abcb5 341 struct dhcp_opt *next;
a84fa1d0
SK
342};
343
26128d27
SK
344struct dhcp_boot {
345 char *file, *sname;
346 struct in_addr next_server;
347 struct dhcp_netid *netid;
348 struct dhcp_boot *next;
349};
350
a84fa1d0 351struct dhcp_vendor {
26128d27 352 int len, is_vendor;
a222641c
SK
353 char *data;
354 struct dhcp_netid netid;
a84fa1d0
SK
355 struct dhcp_vendor *next;
356};
9e4abcb5
SK
357
358struct dhcp_context {
feba5c1d 359 unsigned int lease_time, addr_epoch;
0a852541
SK
360 struct in_addr netmask, broadcast;
361 struct in_addr local, router;
a84fa1d0 362 struct in_addr start, end; /* range of available addresses */
0a852541 363 int flags;
a222641c 364 struct dhcp_netid netid;
36717eee 365 struct dhcp_context *next, *current;
9e4abcb5
SK
366};
367
0a852541
SK
368#define CONTEXT_STATIC 1
369#define CONTEXT_FILTER 2
370#define CONTEXT_NETMASK 4
371#define CONTEXT_BRDCAST 8
372
373
9e4abcb5
SK
374typedef unsigned char u8;
375typedef unsigned short u16;
376typedef unsigned int u32;
377
378
379struct udp_dhcp_packet {
380 struct ip ip;
381 struct udphdr {
382 u16 uh_sport; /* source port */
383 u16 uh_dport; /* destination port */
384 u16 uh_ulen; /* udp length */
385 u16 uh_sum; /* udp checksum */
386 } udp;
387 struct dhcp_packet {
388 u8 op, htype, hlen, hops;
389 u32 xid;
390 u16 secs, flags;
391 struct in_addr ciaddr, yiaddr, siaddr, giaddr;
392 u8 chaddr[16], sname[64], file[128];
3be34541 393 u8 options[312];
9e4abcb5
SK
394 } data;
395};
396
3d8df260
SK
397struct ping_result {
398 struct in_addr addr;
399 time_t time;
400 struct ping_result *next;
401};
9e4abcb5 402
3be34541
SK
403struct daemon {
404 /* datastuctures representing the command-line and
405 config file arguments. All set (including defaults)
406 in option.c */
407
408 unsigned int options;
409 struct resolvc default_resolv, *resolv_files;
0a852541
SK
410 struct mx_srv_record *mxnames;
411 struct txt_record *txt;
3be34541
SK
412 char *mxtarget;
413 char *lease_file;
414 char *username, *groupname;
415 char *domain_suffix;
416 char *runfile;
3d8df260 417 struct iname *if_names, *if_addrs, *if_except, *dhcp_except;
3be34541
SK
418 struct bogus_addr *bogus_addr;
419 struct server *servers;
420 int cachesize;
421 int port, query_port;
422 unsigned long local_ttl;
fd9fa481 423 struct hostsfile *addn_hosts;
3be34541
SK
424 struct dhcp_context *dhcp;
425 struct dhcp_config *dhcp_conf;
91dccd09 426 struct dhcp_opt *dhcp_opts, *vendor_opts;
3be34541 427 struct dhcp_vendor *dhcp_vendors;
26128d27
SK
428 struct dhcp_boot *boot_config;
429 struct dhcp_netid_list *dhcp_ignore;
3be34541
SK
430 int dhcp_max;
431 unsigned int min_leasetime;
432 struct doctor *doctors;
433 unsigned short edns_pktsz;
434
435 /* globally used stuff for DNS */
436 char *packet; /* packet buffer */
0a852541 437 int packet_buff_sz; /* size of above */
3be34541
SK
438 char *namebuff; /* MAXDNAME size buffer */
439 struct serverfd *sfds;
3d8df260 440 struct irec *interfaces;
3be34541
SK
441 struct listener *listeners;
442 struct server *last_server;
443 int uptime_fd;
444
445 /* DHCP state */
446 int dhcpfd, dhcp_raw_fd, dhcp_icmp_fd, lease_fd;
0a852541
SK
447#ifdef HAVE_RTNETLINK
448 int netlinkfd;
449#endif
3be34541
SK
450 struct udp_dhcp_packet *dhcp_packet;
451 char *dhcp_buff, *dhcp_buff2;
3d8df260
SK
452 struct ping_result *ping_results;
453
454 /* DBus stuff */
455#ifdef HAVE_DBUS
456 /* void * here to avoid depending on dbus headers outside dbus.c */
457 void *dbus;
458 struct watch *watches;
459#endif
460
3be34541
SK
461};
462
9e4abcb5
SK
463/* cache.c */
464void cache_init(int cachesize, int log);
fd9fa481
SK
465void log_query(unsigned short flags, char *name, struct all_addr *addr,
466 unsigned short type, struct hostsfile *addn_hosts, int index);
9e4abcb5
SK
467struct crec *cache_find_by_addr(struct crec *crecp,
468 struct all_addr *addr, time_t now,
469 unsigned short prot);
470struct crec *cache_find_by_name(struct crec *crecp,
471 char *name, time_t now, unsigned short prot);
472void cache_end_insert(void);
473void cache_start_insert(void);
fd9fa481
SK
474struct crec *cache_insert(char *name, struct all_addr *addr,
475 time_t now, unsigned long ttl, unsigned short flags);
476void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *addn_hosts);
477void cache_add_dhcp_entry(struct daemon *daemon, char *host_name, struct in_addr *host_address, time_t ttd);
9e4abcb5 478void cache_unhash_dhcp(void);
fd9fa481 479void dump_cache(struct daemon *daemon);
9e4abcb5
SK
480char *cache_get_name(struct crec *crecp);
481
482/* rfc1035.c */
c1bb8504
SK
483unsigned short extract_request(HEADER *header, unsigned int qlen,
484 char *name, unsigned short *typep);
9e4abcb5
SK
485int setup_reply(HEADER *header, unsigned int qlen,
486 struct all_addr *addrp, unsigned short flags,
487 unsigned long local_ttl);
1cff166d 488void extract_addresses(HEADER *header, unsigned int qlen, char *namebuff,
fd9fa481 489 time_t now, struct daemon *daemon);
f6b7dc47
SK
490int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon *daemon,
491 struct in_addr local_addr, struct in_addr local_netmask, time_t now);
9e4abcb5
SK
492int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name,
493 struct bogus_addr *addr, time_t now);
36717eee
SK
494unsigned char *find_pseudoheader(HEADER *header, unsigned int plen,
495 unsigned int *len, unsigned char **p);
f6b7dc47 496int check_for_local_domain(char *name, time_t now, struct daemon *daemon);
0a852541 497unsigned int questions_crc(HEADER *header, unsigned int plen, char *buff);
36717eee
SK
498int resize_packet(HEADER *header, unsigned int plen,
499 unsigned char *pheader, unsigned int hlen);
9e4abcb5
SK
500
501/* util.c */
502unsigned short rand16(void);
503int legal_char(char c);
504int canonicalise(char *s);
3d8df260 505unsigned char *do_rfc1035_name(unsigned char *p, char *sval);
9e4abcb5 506void die(char *message, char *arg1);
0a852541
SK
507void complain(char *message, int lineno, char *file);
508void *safe_malloc(size_t size);
9e4abcb5
SK
509int sa_len(union mysockaddr *addr);
510int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2);
3d8df260 511int hostname_isequal(char *a, char *b);
44a2a316 512time_t dnsmasq_time(int fd);
a84fa1d0 513int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
fd9fa481 514int retry_send(void);
0a852541 515void prettyprint_time(char *buf, unsigned int t);
3d8df260 516int prettyprint_addr(union mysockaddr *addr, char *buf);
0a852541
SK
517int parse_hex(char *in, unsigned char *out, int maxlen,
518 unsigned int *wildcard_mask);
a84fa1d0 519
9e4abcb5 520/* option.c */
3d8df260 521struct daemon *read_opts (int argc, char **argv, char *compile_opts);
9e4abcb5
SK
522
523/* forward.c */
524void forward_init(int first);
3be34541
SK
525void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now);
526void receive_query(struct listener *listen, struct daemon *daemon, time_t now);
3d8df260
SK
527unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
528 struct in_addr local_addr, struct in_addr netmask);
3be34541 529
9e4abcb5 530/* network.c */
feba5c1d 531struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds);
3be34541 532void reload_servers(char *fname, struct daemon *daemon);
3d8df260 533void check_servers(struct daemon *daemon);
f6b7dc47
SK
534int enumerate_interfaces(struct daemon *daemon, struct irec **chainp,
535 union mysockaddr *test_addrp, struct in_addr *netmaskp);
44a2a316 536struct listener *create_wildcard_listeners(int port);
feba5c1d 537struct listener *create_bound_listeners(struct irec *interfaces, int port);
3be34541 538
9e4abcb5 539/* dhcp.c */
3be34541
SK
540void dhcp_init(struct daemon *daemon);
541void dhcp_packet(struct daemon *daemon, time_t now);
542
59353a6b
SK
543struct dhcp_context *address_available(struct dhcp_context *context, struct in_addr addr);
544struct dhcp_context *narrow_context(struct dhcp_context *context, struct in_addr taddr);
f6b7dc47 545int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool);
3be34541 546int address_allocate(struct dhcp_context *context, struct daemon *daemon,
f6b7dc47 547 struct in_addr *addrp, unsigned char *hwaddr,
3d8df260 548 struct dhcp_netid *netids, time_t now);
9e4abcb5
SK
549struct dhcp_config *find_config(struct dhcp_config *configs,
550 struct dhcp_context *context,
551 unsigned char *clid, int clid_len,
552 unsigned char *hwaddr, char *hostname);
44a2a316 553void dhcp_update_configs(struct dhcp_config *configs);
3be34541 554void dhcp_read_ethers(struct daemon *daemon);
dfa666f2 555struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
bb01cb96
SK
556char *strip_hostname(struct daemon *daemon, char *hostname);
557char *host_from_dns(struct daemon *daemon, struct in_addr addr);
0a852541
SK
558struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr local,
559 struct dhcp_context *current, struct in_addr netmask,
560 struct in_addr broadcast, struct in_addr relay,
561 struct in_addr primary);
3be34541 562
9e4abcb5 563/* lease.c */
44a2a316 564void lease_update_file(int force, time_t now);
fd9fa481 565void lease_update_dns(struct daemon *daemon);
3be34541 566void lease_init(struct daemon *daemon, time_t now);
0a852541
SK
567struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
568 int clid_len, struct in_addr addr);
569int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
570 unsigned char *clid, int clid_len);
b8187c80
SK
571void lease_set_hostname(struct dhcp_lease *lease, char *name,
572 char *suffix, int auth);
9e4abcb5 573void lease_set_expires(struct dhcp_lease *lease, time_t exp);
0a852541
SK
574struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr,
575 unsigned char *clid, int clid_len);
9e4abcb5
SK
576struct dhcp_lease *lease_find_by_addr(struct in_addr addr);
577void lease_prune(struct dhcp_lease *target, time_t now);
b8187c80 578void lease_update_from_configs(struct daemon *daemon);
a84fa1d0 579
9e4abcb5 580/* rfc2131.c */
b8187c80 581int dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name, unsigned int sz, time_t now, int unicast_dest);
3be34541
SK
582
583/* dnsmasq.c */
584int icmp_ping(struct daemon *daemon, struct in_addr addr);
3d8df260 585void clear_cache_and_reload(struct daemon *daemon, time_t now);
44a2a316 586
33820b7e
SK
587/* isc.c */
588#ifdef HAVE_ISC_READER
fd9fa481 589void load_dhcp(struct daemon *daemon, time_t now);
33820b7e 590#endif
feba5c1d 591
0a852541
SK
592/* netlink.c */
593#ifdef HAVE_RTNETLINK
594int netlink_init(void);
595int netlink_process(struct daemon *daemon, int index,
596 struct in_addr relay, struct in_addr primary,
597 struct dhcp_context **retp);
598#endif
3d8df260
SK
599
600/* dbus.c */
601#ifdef HAVE_DBUS
602char *dbus_init(struct daemon *daemon);
603void check_dbus_listeners(struct daemon *daemon,
604 fd_set *rset, fd_set *wset, fd_set *eset);
605int set_dbus_listeners(struct daemon *daemon, int maxfd,
606 fd_set *rset, fd_set *wset, fd_set *eset);
607#endif