dnsmasq.h revision 5658bcb797978c3472335d93554405aba8236f66
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; 324ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 325ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 326ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct randfd { 327ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int fd; 328ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned short refcount, family; 329ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 330ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 331ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct server { 332ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat union mysockaddr addr, source_addr; 333ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char interface[IF_NAMESIZE+1]; 334ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct serverfd *sfd; 335ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *domain; /* set if this server only handles a domain. */ 336ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int flags, tcpfd; 337ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int queries, failed_queries; 338ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct server *next; 339ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 340ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 341ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct irec { 342ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat union mysockaddr addr; 343ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr netmask; /* only valid for IPv4 */ 344ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int dhcp_ok, mtu; 345ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct irec *next; 346ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 347ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 348ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener { 349ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int fd, tcpfd, tftpfd, family; 350ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct irec *iface; /* only valid for non-wildcard */ 351ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct listener *next; 352ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 353ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 354ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* interface and address parms from command line. */ 355ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct iname { 356ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *name; 357ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat union mysockaddr addr; 358ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int isloop, used; 359ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct iname *next; 360ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 361ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 362ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* resolv-file parms from command-line */ 363ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct resolvc { 364ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct resolvc *next; 365ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int is_default, logged; 366ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t mtime; 367ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *name; 368ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 369ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 370ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* adn-hosts parms from command-line */ 371ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define AH_DIR 1 372ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define AH_INACTIVE 2 373ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct hostsfile { 374ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct hostsfile *next; 375ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int flags; 376ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *fname; 377ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int index; /* matches to cache entries for logging */ 378ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 379ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 380ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct frec { 381ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat union mysockaddr source; 382ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct all_addr dest; 383ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct server *sentto; /* NULL means free */ 384ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct randfd *rfd4; 385ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_IPV6 386ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct randfd *rfd6; 387ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 388ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int iface; 389ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned short orig_id, new_id; 390ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int fd, forwardall; 391ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int crc; 392ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t time; 393ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct frec *next; 394ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 395ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 396ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* actions in the daemon->helper RPC */ 397ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_DEL 1 398ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_OLD_HOSTNAME 2 399ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_OLD 3 400ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define ACTION_ADD 4 401ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 402ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHCP_CHADDR_MAX 16 403ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 404ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease { 405ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int clid_len; /* length of client identifier */ 406ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *clid; /* clientid */ 407ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *hostname, *fqdn; /* name from client-hostname option or config */ 408ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *old_hostname; /* hostname before it moved to another lease */ 409ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char auth_name; /* hostname came from config, not from client */ 410ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char new; /* newly created */ 411ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char changed; /* modified */ 412ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char aux_changed; /* CLID or expiry changed */ 413ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t expires; /* lease expiry */ 414ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_BROKEN_RTC 415ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int length; 416ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 417ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int hwaddr_len, hwaddr_type; 418ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char hwaddr[DHCP_CHADDR_MAX]; 419ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr addr, override, giaddr; 420ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *vendorclass, *userclass, *supplied_hostname; 421ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int vendorclass_len, userclass_len, supplied_hostname_len; 422ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int last_interface; 423ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_lease *next; 424ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 425ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 426ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_netid { 427ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *net; 428ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *next; 429ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 430ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 431ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_netid_list { 432ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *list; 433ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid_list *next; 434ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 435ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 436ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct hwaddr_config { 437ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int hwaddr_len, hwaddr_type; 438ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char hwaddr[DHCP_CHADDR_MAX]; 439ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int wildcard_mask; 440ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct hwaddr_config *next; 441ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 442ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 443ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config { 444ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int flags; 445ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int clid_len; /* length of client identifier */ 446ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *clid; /* clientid */ 447ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *hostname, *domain; 448ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid netid; 449ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr addr; 450ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t decline_time; 451ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int lease_time; 452ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct hwaddr_config *hwaddr; 453ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_config *next; 454ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 455ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 456ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_DISABLE 1 457ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_CLID 2 458ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_TIME 8 459ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NAME 16 460ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_ADDR 32 461ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NETID 64 462ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_NOCLID 128 463ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_FROM_ETHERS 256 /* entry created by /etc/ethers */ 464ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_ADDR_HOSTS 512 /* address added by from /etc/hosts */ 465ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_DECLINED 1024 /* address declined by client */ 466ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONFIG_BANK 2048 /* from dhcp hosts file */ 467ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 468ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_opt { 469ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int opt, len, flags; 470ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat union { 471ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int encap; 472ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int wildcard_mask; 473ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *vendor_class; 474ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat } u; 475ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *val; 476ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netid; 477ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_opt *next; 478ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 479ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 480ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ADDR 1 481ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_STRING 2 482ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAPSULATE 4 483ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAP_MATCH 8 484ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_FORCE 16 485ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_BANK 32 486ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_ENCAP_DONE 64 487ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_MATCH 128 488ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_VENDOR 256 489ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_HEX 512 490ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define DHOPT_VENDOR_MATCH 1024 491ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 492ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_boot { 493ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *file, *sname; 494ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr next_server; 495ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netid; 496ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_boot *next; 497ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 498ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 499ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct pxe_service { 500ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned short CSA, type; 501ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *menu, *basename; 502ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr server; 503ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netid; 504ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct pxe_service *next; 505ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 506ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 507ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_VENDOR 1 508ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_USER 2 509ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_CIRCUIT 3 510ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_REMOTE 4 511ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define MATCH_SUBSCRIBER 5 512ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 513ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* vendorclass, userclass, remote-id or cicuit-id */ 514ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_vendor { 515ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int len, match_type, option; 516ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *data; 517ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid netid; 518ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_vendor *next; 519ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 520ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 521ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_mac { 522ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int mask; 523ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int hwaddr_len, hwaddr_type; 524ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char hwaddr[DHCP_CHADDR_MAX]; 525ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid netid; 526ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_mac *next; 527ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 528ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 529ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_bridge { 530ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char iface[IF_NAMESIZE]; 531ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_bridge *alias, *next; 532ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 533ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 534ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct cond_domain { 535ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *domain; 536ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr start, end; 537ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct cond_domain *next; 538ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 539ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 540ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context { 541ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int lease_time, addr_epoch; 542ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr netmask, broadcast; 543ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr local, router; 544ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr start, end; /* range of available addresses */ 545ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int flags; 546ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid netid, *filter; 547ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_context *next, *current; 548ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 549ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 550ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_STATIC 1 551ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_NETMASK 2 552ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_BRDCAST 4 553ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#define CONTEXT_PROXY 8 554ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 555ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 556ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned char u8; 557ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned short u16; 558ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattypedef unsigned int u32; 559ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 560ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 561ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_packet { 562ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat u8 op, htype, hlen, hops; 563ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat u32 xid; 564ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat u16 secs, flags; 565ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr ciaddr, yiaddr, siaddr, giaddr; 566ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat u8 chaddr[DHCP_CHADDR_MAX], sname[64], file[128]; 567ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat u8 options[312]; 568ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 569ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 570ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct ping_result { 571ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr addr; 572ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t time; 573ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct ping_result *next; 574ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 575ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 576ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct tftp_file { 577ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int refcount, fd; 578ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat off_t size; 579ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat dev_t dev; 580ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat ino_t inode; 581ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char filename[]; 582ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 583ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 584ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct tftp_transfer { 585ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int sockfd; 586ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t timeout; 587ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int backoff; 588ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int block, blocksize, expansion; 589ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat off_t offset; 590ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct sockaddr_in peer; 591ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char opt_blocksize, opt_transize, netascii, carrylf; 592ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct tftp_file *file; 593ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct tftp_transfer *next; 594ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat}; 595ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 596ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatextern struct daemon { 597ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* datastuctures representing the command-line and 598ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat config file arguments. All set (including defaults) 599ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat in option.c */ 600ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 601ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int options; 602ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct resolvc default_resolv, *resolv_files; 603ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t last_resolv; 604ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct mx_srv_record *mxnames; 605ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct naptr *naptr; 606ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct txt_record *txt; 607ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct ptr_record *ptr; 608ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct cname *cnames; 609ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct interface_name *int_names; 610ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *mxtarget; 611ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *lease_file; 612ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *username, *groupname, *scriptuser; 613ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int group_set, osport; 614ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *domain_suffix; 615ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct cond_domain *cond_domain; 616ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *runfile; 617ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *lease_change_command; 618ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct iname *if_names, *if_addrs, *if_except, *dhcp_except; 619ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct bogus_addr *bogus_addr; 620ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct server *servers; 621ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int log_fac; /* log facility */ 622ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *log_file; /* optional log file */ 623ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int max_logs; /* queue limit */ 624ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int cachesize, ftabsize; 625ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int port, query_port, min_port; 626ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned long local_ttl, neg_ttl; 627ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct hostsfile *addn_hosts; 628ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_context *dhcp; 629ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_config *dhcp_conf; 630ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_opt *dhcp_opts, *dhcp_match; 631ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_vendor *dhcp_vendors; 632ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_mac *dhcp_macs; 633ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_boot *boot_config; 634ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct pxe_service *pxe_services; 635ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int enable_pxe; 636ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *force_broadcast, *bootp_dynamic; 637ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *dhcp_hosts_file, *dhcp_opts_file; 638ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int dhcp_max, tftp_max; 639ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int dhcp_server_port, dhcp_client_port; 640ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int start_tftp_port, end_tftp_port; 641ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int min_leasetime; 642ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct doctor *doctors; 643ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned short edns_pktsz; 644ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *tftp_prefix; 645ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 646ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* globally used stuff for DNS */ 647ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *packet; /* packet buffer */ 648ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int packet_buff_sz; /* size of above */ 649ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *namebuff; /* MAXDNAME size buffer */ 650ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int local_answer, queries_forwarded; 651ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct frec *frec_list; 652ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct serverfd *sfds; 653ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct irec *interfaces; 654ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct listener *listeners; 655ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct server *last_server; 656ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t forwardtime; 657ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int forwardcount; 658ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct server *srv_save; /* Used for resend on DoD */ 659ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat size_t packet_len; /* " " */ 660ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct randfd *rfd_save; /* " " */ 661ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat pid_t tcp_pids[MAX_PROCS]; 662ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct randfd randomsocks[RANDOM_SOCKS]; 663ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 664ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* DHCP state */ 665ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int dhcpfd, helperfd; 666ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_LINUX_NETWORK) 667ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int netlinkfd; 668ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#elif defined(HAVE_BSD_NETWORK) 669ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int dhcp_raw_fd, dhcp_icmp_fd; 670ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 671ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct iovec dhcp_packet; 672ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *dhcp_buff, *dhcp_buff2; 673ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct ping_result *ping_results; 674ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat FILE *lease_stream; 675ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_bridge *bridges; 676ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 677ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* DBus stuff */ 678ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* void * here to avoid depending on dbus headers outside dbus.c */ 679ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat void *dbus; 680ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DBUS 681ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct watch *watches; 682ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 683ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 684ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat /* TFTP stuff */ 685ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct tftp_transfer *tftp_trans; 686ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 687ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat} *daemon; 688ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 689ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* cache.c */ 690ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_init(void); 691ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid log_query(unsigned short flags, char *name, struct all_addr *addr, char *arg); 692ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *record_source(int index); 693ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid querystr(char *str, unsigned short type); 694ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_find_by_addr(struct crec *crecp, 695ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct all_addr *addr, time_t now, 696ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned short prot); 697ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_find_by_name(struct crec *crecp, 698ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *name, time_t now, unsigned short prot); 699ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_end_insert(void); 700ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_start_insert(void); 701ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct crec *cache_insert(char *name, struct all_addr *addr, 702ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat time_t now, unsigned long ttl, unsigned short flags); 703ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_reload(void); 704ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t ttd); 705ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid cache_unhash_dhcp(void); 706ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dump_cache(time_t now); 707ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *cache_get_name(struct crec *crecp); 708ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *get_domain(struct in_addr addr); 709ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 710ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* rfc1035.c */ 711ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned short extract_request(HEADER *header, size_t qlen, 712ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *name, unsigned short *typep); 713ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t setup_reply(HEADER *header, size_t qlen, 714ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct all_addr *addrp, unsigned short flags, 715ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned long local_ttl); 716ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint extract_addresses(HEADER *header, size_t qlen, char *namebuff, time_t now); 717ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t answer_request(HEADER *header, char *limit, size_t qlen, 718ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr local_addr, struct in_addr local_netmask, time_t now); 719ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name, 720ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct bogus_addr *addr, time_t now); 721ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *find_pseudoheader(HEADER *header, size_t plen, 722ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat size_t *len, unsigned char **p, int *is_sign); 723ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint check_for_local_domain(char *name, time_t now); 724ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned int questions_crc(HEADER *header, size_t plen, char *buff); 725ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t resize_packet(HEADER *header, size_t plen, 726ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *pheader, size_t hlen); 727ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 728ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* util.c */ 729ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid rand_init(void); 730ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned short rand16(void); 731ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint legal_hostname(char *c); 732ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *canonicalise(char *s, int *nomem); 733ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *do_rfc1035_name(unsigned char *p, char *sval); 734ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid *safe_malloc(size_t size); 735ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid safe_pipe(int *fd, int read_noblock); 736ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid *whine_malloc(size_t size); 737ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint sa_len(union mysockaddr *addr); 738ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2); 739ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint hostname_isequal(char *a, char *b); 740ffd68729961f7383f2e35494a03ccdef20f86c98San Mehattime_t dnsmasq_time(void); 741ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask); 742ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint retry_send(void); 743ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid prettyprint_time(char *buf, unsigned int t); 744ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint prettyprint_addr(union mysockaddr *addr, char *buf); 745ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint parse_hex(char *in, unsigned char *out, int maxlen, 746ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int *wildcard_mask, int *mac_type); 747ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint memcmp_masked(unsigned char *a, unsigned char *b, int len, 748ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned int mask); 749ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint expand_buf(struct iovec *iov, size_t size); 750ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *print_mac(char *buff, unsigned char *mac, int len); 751ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid bump_maxfd(int fd, int *max); 752ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint read_write(int fd, unsigned char *packet, int size, int rw); 753ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 754ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* log.c */ 755ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid die(char *message, char *arg1, int exit_code); 756ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint log_start(struct passwd *ent_pw, int errfd); 757ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint log_reopen(char *log_file); 758ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid my_syslog(int priority, const char *format, ...); 759ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid set_log_writer(fd_set *set, int *maxfdp); 760ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_log_writer(fd_set *set); 761ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid flush_log(void); 762ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 763ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* option.c */ 764ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid read_opts (int argc, char **argv, char *compile_opts); 765ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *option_string(unsigned char opt, int *is_ip, int *is_name); 766ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid reread_dhcp(void); 767ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 768ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* forward.c */ 769ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid reply_query(int fd, int family, time_t now); 770ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid receive_query(struct listener *listen, time_t now); 771ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *tcp_request(int confd, time_t now, 772ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr local_addr, struct in_addr netmask); 773ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid server_gone(struct server *server); 774ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct frec *get_new_frec(time_t now, int *wait); 775ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 776ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* network.c */ 777ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint indextoname(int fd, int index, char *name); 778ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp); 779ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint random_sock(int family); 780ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid pre_allocate_sfds(void); 781ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint reload_servers(char *fname); 782ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_servers(void); 783ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint enumerate_interfaces(); 784ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener *create_wildcard_listeners(void); 785ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct listener *create_bound_listeners(void); 786ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint iface_check(int family, struct all_addr *addr, char *name, int *indexp); 787ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint fix_fd(int fd); 788ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct in_addr get_ifaddr(char *intr); 789ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 790ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dhcp.c */ 791ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP 792ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_init(void); 793ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_packet(time_t now); 794ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context *address_available(struct dhcp_context *context, 795ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr addr, 796ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netids); 797ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_context *narrow_context(struct dhcp_context *context, 798ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr taddr, 799ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netids); 800ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly);int address_allocate(struct dhcp_context *context, 801ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr *addrp, unsigned char *hwaddr, int hw_len, 802ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_netid *netids, time_t now); 803ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type); 804ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config *find_config(struct dhcp_config *configs, 805ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct dhcp_context *context, 806ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *clid, int clid_len, 807ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *hwaddr, int hw_len, 808ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int hw_type, char *hostname); 809ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_update_configs(struct dhcp_config *configs); 810ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid dhcp_read_ethers(void); 811ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_dhcp_hosts(int fatal); 812ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr); 813ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *strip_hostname(char *hostname); 814ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *host_from_dns(struct in_addr addr); 815ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *get_domain(struct in_addr addr); 816ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 817ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 818ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* lease.c */ 819ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP 820ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_file(time_t now); 821ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_dns(); 822ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_init(time_t now); 823ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_allocate(struct in_addr addr); 824ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, 825ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *clid, int hw_len, int hw_type, int clid_len); 826ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_hostname(struct dhcp_lease *lease, char *name, int auth); 827ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now); 828ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_set_interface(struct dhcp_lease *lease, int interface); 829ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type, 830ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat unsigned char *clid, int clid_len); 831ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatstruct dhcp_lease *lease_find_by_addr(struct in_addr addr); 832ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_prune(struct dhcp_lease *target, time_t now); 833ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid lease_update_from_configs(void); 834ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint do_script_run(time_t now); 835ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid rerun_scripts(void); 836ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 837ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 838ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* rfc2131.c */ 839ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP 840ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatsize_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, 841ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat size_t sz, time_t now, int unicast_dest, int *is_inform); 842ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatunsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr, 843ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat int clid_len, unsigned char *clid, int *len_out); 844ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 845ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 846ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dnsmasq.c */ 847ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DHCP 848ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint make_icmp_sock(void); 849ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint icmp_ping(struct in_addr addr); 850ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 851ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid send_event(int fd, int event, int data); 852ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid clear_cache_and_reload(time_t now); 853ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 854ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* netlink.c */ 855ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_LINUX_NETWORK 856ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid netlink_init(void); 857ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid netlink_multicast(void); 858ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 859ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 860ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* bpf.c */ 861ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_BSD_NETWORK 862ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid init_bpf(void); 863ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid send_via_bpf(struct dhcp_packet *mess, size_t len, 864ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat struct in_addr iface_addr, struct ifreq *ifr); 865ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 866ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 867ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* bpf.c or netlink.c */ 868ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint iface_enumerate(void *parm, int (*ipv4_callback)(), int (*ipv6_callback)()); 869ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 870ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* dbus.c */ 871ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_DBUS 872ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatchar *dbus_init(void); 873ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset); 874ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid set_dbus_listeners(int *maxfdp, fd_set *rset, fd_set *wset, fd_set *eset); 875ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname); 876ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 877ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 878ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* helper.c */ 879ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#if defined(HAVE_DHCP) && !defined(NO_FORK) 880ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd); 881ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid helper_write(void); 882ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid queue_script(int action, struct dhcp_lease *lease, 883ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat char *hostname, time_t now); 884ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatint helper_buf_empty(void); 885ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 886ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat 887ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat/* tftp.c */ 888ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#ifdef HAVE_TFTP 889ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid tftp_request(struct listener *listen, time_t now); 890ffd68729961f7383f2e35494a03ccdef20f86c98San Mehatvoid check_tftp_listeners(fd_set *rset, time_t now); 891ffd68729961f7383f2e35494a03ccdef20f86c98San Mehat#endif 892