summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcvs2git <source@isc.org>1996-05-22 11:33:00 +0000
committercvs2git <source@isc.org>1996-05-22 11:33:00 +0000
commit87bace8beecec53c9bc430e5711ad76c7f55d5ad (patch)
treeaa6289ced8cf60f64f1b464b4efea67a1aa75b31
parent3823ccf22d30ef8a29e4cf5b59a40f1faf9596a3 (diff)
downloadisc-dhcp-BETA-2.tar.gz
This commit was manufactured by cvs2git to create tag 'BETA-2'.BETA-2
-rw-r--r--client/dhclient.c427
-rw-r--r--common/alloc.c227
-rw-r--r--common/bpf.c369
-rw-r--r--common/conflex.c369
-rw-r--r--common/convert.c118
-rw-r--r--common/dispatch.c454
-rw-r--r--common/errwarn.c223
-rw-r--r--common/hash.c173
-rw-r--r--common/inet.c154
-rw-r--r--common/memory.c676
-rw-r--r--common/nit.c324
-rw-r--r--common/options.c520
-rw-r--r--common/packet.c309
-rw-r--r--common/print.c184
-rw-r--r--common/raw.c130
-rw-r--r--common/socket.c185
-rw-r--r--common/tables.c671
-rw-r--r--common/tree.c407
-rw-r--r--includes/cdefs.h55
-rw-r--r--includes/cf/alphaosf.h88
-rw-r--r--includes/cf/bsdos.h76
-rw-r--r--includes/cf/freebsd.h78
-rw-r--r--includes/cf/linux.h88
-rw-r--r--includes/cf/netbsd.h76
-rw-r--r--includes/cf/sample.h292
-rw-r--r--includes/cf/sco.h112
-rw-r--r--includes/cf/sunos4.h134
-rw-r--r--includes/cf/sunos5-5.h122
-rw-r--r--includes/cf/ultrix.h107
-rw-r--r--includes/dhcp.h160
-rw-r--r--includes/dhcpd.h520
-rw-r--r--includes/dhctoken.h86
-rw-r--r--includes/hash.h55
-rw-r--r--includes/inet.h47
-rw-r--r--includes/osdep.h177
-rw-r--r--includes/site.h96
-rw-r--r--includes/tree.h104
-rw-r--r--server/bootp.c251
-rw-r--r--server/confpars.c1536
-rw-r--r--server/db.c137
-rw-r--r--server/dhcp.c934
-rw-r--r--server/dhcpd.8266
-rw-r--r--server/dhcpd.c182
-rw-r--r--server/dhcpd.cat8182
-rw-r--r--server/dhcpd.conf27
-rw-r--r--server/dhcpd.conf.5712
-rw-r--r--server/dhcpd.conf.cat5437
47 files changed, 0 insertions, 13057 deletions
diff --git a/client/dhclient.c b/client/dhclient.c
deleted file mode 100644
index 362b4c33..00000000
--- a/client/dhclient.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/* dhcp.c
-
- DHCP Client (really lame DHCP client). */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-TIME cur_time;
-TIME default_lease_time = 43200; /* 12 hours... */
-TIME max_lease_time = 86400; /* 24 hours... */
-struct tree_cache *global_options [256];
-
-struct iaddr server_identifier;
-int server_identifier_matched;
-
-#ifdef USE_FALLBACK
-struct interface_info fallback_interface;
-#endif
-
-u_int16_t server_port;
-int log_priority;
-
-int tline, tlpos;
-
-static void usage PROTO ((void));
-
-int main (argc, argv, envp)
- int argc;
- char **argv, **envp;
-{
- struct in_addr addr;
- int port = 0;
- int i;
- struct sockaddr_in name;
- u_int32_t *addrlist = (u_int32_t *)0;
- int addrcount = 0;
- struct tree *addrtree = (struct tree *)0;
- struct servent *ent;
- int sock;
- int pid;
- int result;
- int flag;
- struct interface_info *interface;
-
-#ifdef SYSLOG_4_2
- openlog ("dhclient", LOG_NDELAY);
- log_facility = LOG_DAEMON;
-#else
- openlog ("dhclient", LOG_NDELAY, LOG_DAEMON);
-#endif
-
-#ifndef NO_PUTENV
- /* ensure mktime() calls are processed in UTC */
- putenv("TZ=GMT0");
-#endif /* !NO_PUTENV */
-
-#ifndef DEBUG
- setlogmask (LOG_UPTO (LOG_INFO));
-#endif
-
- for (i = 1; i < argc; i++) {
- if (!strcmp (argv [i], "-p")) {
- if (++i == argc)
- usage ();
- server_port = htons (atoi (argv [i]));
- debug ("binding to user-specified port %d",
- ntohs (server_port));
-#if 0
- } else if (!strcmp (argv [i], "-a")) {
- if (++i == argc)
- usage ();
- if (inet_aton (argv [i], &addr)) {
- addrtree =
- tree_concat (addrtree,
- tree_const
- ((unsigned char *)&addr,
- sizeof addr));
- } else {
- addrtree = tree_concat (addrtree,
- tree_host_lookup
- (argv [i]));
- }
-#endif
- } else
- usage ();
- }
-
- /* Default to the DHCP/BOOTP port. */
- if (!server_port)
- {
- ent = getservbyname ("dhcpc", "udp");
- if (!ent)
- server_port = htons (68);
- else
- server_port = ent -> s_port;
- endservent ();
- }
-
- /* Get the current time... */
- GET_TIME (&cur_time);
-
- /* Discover all the network interfaces and initialize them. */
- discover_interfaces ();
-
- for (interface = interfaces; interface; interface = interface -> next)
- send_discover (interface);
-
- /* Receive packets and dispatch them... */
- dispatch ();
-
- /* Not reached */
- return 0;
-}
-
-static void usage ()
-{
- error ("Usage: dhclient [-p <port>]");
-}
-
-void cleanup ()
-{
-}
-
-int commit_leases ()
-{
- return 0;
-}
-
-int write_lease (lease)
- struct lease *lease;
-{
- return 0;
-}
-
-void db_startup ()
-{
-}
-
-void bootp (packet)
- struct packet *packet;
-{
- note ("BOOTREPLY from %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-}
-
-void dhcp (packet)
- struct packet *packet;
-{
-note ("got a dhcp packet: %d", packet -> packet_type);
- switch (packet -> packet_type) {
- case DHCPOFFER:
- dhcpoffer (packet);
- break;
-
- case DHCPNAK:
- dhcpnak (packet);
- break;
-
- case DHCPACK:
- dhcpack (packet);
- break;
-
- default:
- break;
- }
-}
-
-void dhcpoffer (packet)
- struct packet *packet;
-{
- note ("DHCPOFFER from %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- dump_packet (packet);
- send_request (packet);
-}
-
-void dhcpack (packet)
- struct packet *packet;
-{
- note ("DHCPACK from %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
- dump_packet (packet);
-}
-
-void dhcpnak (packet)
- struct packet *packet;
-{
- note ("DHCPNAK from %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-}
-
-static u_int8_t requested_options [] = {
- DHO_DHCP_REQUESTED_ADDRESS,
- DHO_SUBNET_MASK,
- DHO_ROUTERS,
- DHO_DOMAIN_NAME_SERVERS,
- DHO_HOST_NAME,
- DHO_DOMAIN_NAME,
- DHO_BROADCAST_ADDRESS };
-
-void send_discover (interface)
- struct interface_info *interface;
-{
- struct sockaddr_in to;
- int result;
- struct dhcp_packet raw;
- unsigned char discover = DHCPDISCOVER;
- struct packet outgoing;
-
- struct tree_cache *options [256];
- struct tree_cache dhcpdiscover_tree;
- struct tree_cache dhcprqo_tree;
-
- memset (options, 0, sizeof options);
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Set DHCP_MESSAGE_TYPE to DHCPNAK */
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcpdiscover_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &discover;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof discover;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof discover;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- /* Set DHCP_MESSAGE to whatever the message is */
- options [DHO_DHCP_MESSAGE] = &dhcprqo_tree;
- options [DHO_DHCP_MESSAGE] -> value = requested_options;
- options [DHO_DHCP_MESSAGE] -> len = sizeof requested_options;
- options [DHO_DHCP_MESSAGE] -> buf_size = sizeof requested_options;
- options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0;
-
- /* Set up the option buffer... */
- cons_options ((struct packet *)0, &outgoing, options, 0);
-
- memset (&raw.ciaddr, 0, sizeof raw.ciaddr);
- memset (&raw.siaddr, 0, sizeof raw.siaddr);
- memset (&raw.giaddr, 0, sizeof raw.giaddr);
- memcpy (raw.chaddr,
- interface -> hw_address.haddr, interface -> hw_address.hlen);
- raw.hlen = interface -> hw_address.hlen;
- raw.htype = interface -> hw_address.htype;
-
- raw.xid = random ();
- raw.secs = 1;
- raw.flags = htons (BOOTP_BROADCAST);
- raw.hops = 0;
- raw.op = BOOTREQUEST;
-
- /* Report what we're sending... */
- note ("DHCPDISCOVER to %s", interface -> name);
-
-#ifdef DEBUG_PACKET
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- /* Set up the common stuff... */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = htons (ntohs (server_port) - 1); /* XXX */
-
- errno = 0;
- result = send_packet (interface, (struct packet *)0,
- &raw, outgoing.packet_length,
- raw.siaddr, &to, (struct hardware *)0);
- if (result < 0)
- warn ("send_packet: %m");
-}
-
-void send_request (packet)
- struct packet *packet;
-{
- struct sockaddr_in to;
- int result;
- struct dhcp_packet raw;
- unsigned char request = DHCPREQUEST;
- struct packet outgoing;
-
- struct tree_cache *options [256];
- struct tree_cache dhcprequest_tree;
- struct tree_cache dhcprqo_tree;
- struct tree_cache dhcprqa_tree;
- struct tree_cache dhcpsid_tree;
-
- memset (options, 0, sizeof options);
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Set DHCP_MESSAGE_TYPE to DHCPNAK */
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcprequest_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &request;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof request;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof request;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- /* Set DHCP_MESSAGE to whatever the message is */
- options [DHO_DHCP_MESSAGE] = &dhcprqo_tree;
- options [DHO_DHCP_MESSAGE] -> value = requested_options;
- options [DHO_DHCP_MESSAGE] -> len = sizeof requested_options;
- options [DHO_DHCP_MESSAGE] -> buf_size = sizeof requested_options;
- options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0;
-
- /* Request the address we were offered... */
- options [DHO_DHCP_REQUESTED_ADDRESS] = &dhcprqa_tree;
- options [DHO_DHCP_REQUESTED_ADDRESS] -> value =
- (unsigned char *)&packet -> raw -> yiaddr;
- options [DHO_DHCP_REQUESTED_ADDRESS] -> len = 4;
- options [DHO_DHCP_REQUESTED_ADDRESS] -> buf_size = 4;
- options [DHO_DHCP_REQUESTED_ADDRESS] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_REQUESTED_ADDRESS] -> tree = (struct tree *)0;
-
- /* Send back the server identifier... */
- options [DHO_DHCP_SERVER_IDENTIFIER] = &dhcpsid_tree;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> value =
- packet -> options [DHO_DHCP_SERVER_IDENTIFIER].data;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> len =
- packet -> options [DHO_DHCP_SERVER_IDENTIFIER].len;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> buf_size =
- packet -> options [DHO_DHCP_SERVER_IDENTIFIER].len;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> tree = (struct tree *)0;
-
- /* Set up the option buffer... */
- cons_options ((struct packet *)0, &outgoing, options, 0);
-
- memset (&raw.ciaddr, 0, sizeof raw.ciaddr);
- raw.siaddr = packet -> raw -> siaddr;
- raw.giaddr = packet -> raw -> giaddr;
- memcpy (raw.chaddr,
- packet -> interface -> hw_address.haddr,
- packet -> interface -> hw_address.hlen);
- raw.hlen = packet -> interface -> hw_address.hlen;
- raw.htype = packet -> interface -> hw_address.htype;
-
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = htons (BOOTP_BROADCAST);
- raw.hops = packet -> raw -> hops;
- raw.op = BOOTREQUEST;
-
- /* Report what we're sending... */
- note ("DHCPREQUEST to %s", packet -> interface -> name);
-
-#ifdef DEBUG_PACKET
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- /* Set up the common stuff... */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = htons (ntohs (server_port) - 1); /* XXX */
-
- errno = 0;
- result = send_packet (packet -> interface, (struct packet *)0,
- &raw, outgoing.packet_length,
- raw.siaddr, &to, (struct hardware *)0);
- if (result < 0)
- warn ("send_packet: %m");
-}
diff --git a/common/alloc.c b/common/alloc.c
deleted file mode 100644
index a8ab1a62..00000000
--- a/common/alloc.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* alloc.c
-
- Memory allocation... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-struct dhcp_packet *dhcp_free_list;
-struct packet *packet_free_list;
-
-VOIDPTR dmalloc (size, name)
- int size;
- char *name;
-{
- VOIDPTR foo = (VOIDPTR)malloc (size);
- if (!foo)
- warn ("No memory for %s.", name);
- return foo;
-}
-
-void dfree (ptr, name)
- VOIDPTR ptr;
- char *name;
-{
- free (ptr);
-}
-
-struct packet *new_packet (name)
- char *name;
-{
- struct packet *rval;
- rval = (struct packet *)dmalloc (sizeof (struct packet), name);
- return rval;
-}
-
-struct dhcp_packet *new_dhcp_packet (name)
- char *name;
-{
- struct dhcp_packet *rval;
- rval = (struct dhcp_packet *)dmalloc (sizeof (struct dhcp_packet),
- name);
- return rval;
-}
-
-struct tree *new_tree (name)
- char *name;
-{
- struct tree *rval = dmalloc (sizeof (struct tree), name);
- return rval;
-}
-
-struct tree_cache *new_tree_cache (name)
- char *name;
-{
- struct tree_cache *rval = dmalloc (sizeof (struct tree_cache), name);
- return rval;
-}
-
-struct hash_table *new_hash_table (count, name)
- int count;
- char *name;
-{
- struct hash_table *rval = dmalloc (sizeof (struct hash_table)
- - (DEFAULT_HASH_SIZE
- * sizeof (struct hash_bucket *))
- + (count
- * sizeof (struct hash_bucket *)),
- name);
- rval -> hash_count = count;
- return rval;
-}
-
-struct hash_bucket *new_hash_bucket (name)
- char *name;
-{
- struct hash_bucket *rval = dmalloc (sizeof (struct hash_bucket), name);
- return rval;
-}
-
-struct lease *new_leases (n, name)
- int n;
- char *name;
-{
- struct lease *rval = dmalloc (n * sizeof (struct lease), name);
- return rval;
-}
-
-struct lease *new_lease (name)
- char *name;
-{
- struct lease *rval = dmalloc (sizeof (struct lease), name);
- return rval;
-}
-
-struct subnet *new_subnet (name)
- char *name;
-{
- struct subnet *rval = dmalloc (sizeof (struct subnet), name);
- return rval;
-}
-
-struct class *new_class (name)
- char *name;
-{
- struct class *rval = dmalloc (sizeof (struct class), name);
- return rval;
-}
-
-struct shared_network *new_shared_network (name)
- char *name;
-{
- struct shared_network *rval =
- dmalloc (sizeof (struct shared_network), name);
- return rval;
-}
-
-void free_shared_network (ptr, name)
- struct shared_network *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_class (ptr, name)
- struct class *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_subnet (ptr, name)
- struct subnet *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_lease (ptr, name)
- struct lease *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_hash_bucket (ptr, name)
- struct hash_bucket *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_hash_table (ptr, name)
- struct hash_table *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_tree_cache (ptr, name)
- struct tree_cache *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_packet (ptr, name)
- struct packet *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_dhcp_packet (ptr, name)
- struct dhcp_packet *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
-
-void free_tree (ptr, name)
- struct tree *ptr;
- char *name;
-{
- dfree ((VOIDPTR)ptr, name);
-}
diff --git a/common/bpf.c b/common/bpf.c
deleted file mode 100644
index 526fed08..00000000
--- a/common/bpf.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/* bpf.c
-
- BPF socket interface code, originally contributed by Archie Cobbs. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#if defined (USE_BPF_SEND) || defined (USE_BPF_RECEIVE)
-#include <sys/ioctl.h>
-#include <sys/uio.h>
-
-#include <net/bpf.h>
-#ifdef NEED_OSF_PFILT_HACKS
-#include <net/pfilt.h>
-#endif
-#include <netinet/in_systm.h>
-#include "includes/netinet/ip.h"
-#include "includes/netinet/udp.h"
-#include "includes/netinet/if_ether.h"
-
-/* Called by get_interface_list for each interface that's discovered.
- Opens a packet filter for each interface and adds it to the select
- mask. */
-
-int if_register_bpf (info, ifp)
- struct interface_info *info;
- struct ifreq *ifp;
-{
- int sock;
- char filename[50];
- int b;
-
- /* Open a BPF device */
- for (b = 0; 1; b++) {
-#ifndef NO_SNPRINTF
- snprintf(filename, sizeof(filename), BPF_FORMAT, b);
-#else
- sprintf(filename, BPF_FORMAT, b);
-#endif
- sock = open (filename, O_RDWR, 0);
- if (sock < 0) {
- if (errno == EBUSY) {
- continue;
- } else {
- error ("Can't find free bpf: %m");
- }
- } else {
- break;
- }
- }
-
- /* Set the BPF device to point at this interface. */
- if (ioctl (sock, BIOCSETIF, ifp) < 0)
- error ("Can't attach interface to bpf device: %m");
-
- return sock;
-}
-#endif /* USE_BPF_SEND || USE_BPF_RECEIVE */
-
-#ifdef USE_BPF_SEND
-void if_register_send (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- /* If we're using the bpf API for sending and receiving,
- we don't need to register this interface twice. */
-#ifndef USE_BPF_RECEIVE
- info -> wfdesc = if_register_bpf (info, interface);
-#else
- info -> wfdesc = info -> rfdesc;
-#endif
- note ("Sending on BPF/%s/%s/%s",
- info -> name,
- print_hw_addr (info -> hw_address.htype,
- info -> hw_address.hlen,
- info -> hw_address.haddr),
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-#endif /* USE_BPF_SEND */
-
-#ifdef USE_BPF_RECEIVE
-/* Packet filter program...
- XXX Changes to the filter program may require changes to the constant
- offsets used in if_register_send to patch the BPF program! XXX */
-
-struct bpf_insn filter [] = {
- /* Make sure this is an IP packet... */
- BPF_STMT (BPF_LD + BPF_H + BPF_ABS, 12),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 8),
-
- /* Make sure it's a UDP packet... */
- BPF_STMT (BPF_LD + BPF_B + BPF_ABS, 23),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
-
- /* Make sure this isn't a fragment... */
- BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 20),
- BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
-
- /* Get the IP header length... */
- BPF_STMT (BPF_LDX + BPF_B + BPF_MSH, 14),
-
- /* Make sure it's to the right port... */
- BPF_STMT (BPF_LD + BPF_H + BPF_IND, 16),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1), /* patch */
-
- /* If we passed all the tests, ask for the whole packet. */
- BPF_STMT(BPF_RET+BPF_K, (u_int)-1),
-
- /* Otherwise, drop it. */
- BPF_STMT(BPF_RET+BPF_K, 0),
-};
-
-void if_register_receive (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- int flag = 1;
- struct bpf_version v;
- u_int32_t addr;
- struct bpf_program p;
- u_int32_t bits;
-
- /* Open a BPF device and hang it on this interface... */
- info -> rfdesc = if_register_bpf (info, interface);
-
- /* Make sure the BPF version is in range... */
- if (ioctl (info -> rfdesc, BIOCVERSION, &v) < 0)
- error ("Can't get BPF version: %m");
-
- if (v.bv_major != BPF_MAJOR_VERSION ||
- v.bv_minor < BPF_MINOR_VERSION)
- error ("Kernel BPF version out of range - recompile dhcpd!");
-
- /* Set immediate mode so that reads return as soon as a packet
- comes in, rather than waiting for the input buffer to fill with
- packets. */
- if (ioctl (info -> rfdesc, BIOCIMMEDIATE, &flag) < 0)
- error ("Can't set immediate mode on bpf device: %m");
-
-#ifdef NEED_OSF_PFILT_HACKS
- /* Allow the copyall flag to be set... */
- if (ioctl(info -> rfdesc, EIOCALLOWCOPYALL, &flag) < 0)
- error ("Can't set ALLOWCOPYALL: %m");
-
- /* Clear all the packet filter mode bits first... */
- bits = 0;
- if (ioctl (info -> rfdesc, EIOCMBIS, &bits) < 0)
- error ("Can't clear pfilt bits: %m");
-
- /* Set the ENBATCH, ENCOPYALL, ENBPFHDR bits... */
- bits = ENBATCH | ENCOPYALL | ENBPFHDR;
- if (ioctl (info -> rfdesc, EIOCMBIS, &bits) < 0)
- error ("Can't set ENBATCH|ENCOPYALL|ENBPFHDR: %m");
-#endif
- /* Get the required BPF buffer length from the kernel. */
- if (ioctl (info -> rfdesc, BIOCGBLEN, &info -> rbuf_max) < 0)
- error ("Can't get bpf buffer length: %m");
- info -> rbuf = malloc (info -> rbuf_max);
- if (!info -> rbuf)
- error ("Can't allocate %d bytes for bpf input buffer.");
- info -> rbuf_offset = 0;
- info -> rbuf_len = 0;
-
- /* Set up the bpf filter program structure. */
- p.bf_len = sizeof filter / sizeof (struct bpf_insn);
- p.bf_insns = filter;
-
- /* Patch the server port into the BPF program...
- XXX changes to filter program may require changes
- to the insn number(s) used below! XXX */
- filter [8].k = ntohs (server_port);
-
- if (ioctl (info -> rfdesc, BIOCSETF, &p) < 0)
- error ("Can't install packet filter program: %m");
- note ("Listening on BPF/%s/%s/%s",
- info -> name,
- print_hw_addr (info -> hw_address.htype,
- info -> hw_address.hlen,
- info -> hw_address.haddr),
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-#endif /* USE_BPF_RECEIVE */
-
-#ifdef USE_BPF_SEND
-size_t send_packet (interface, packet, raw, len, from, to, hto)
- struct interface_info *interface;
- struct packet *packet;
- struct dhcp_packet *raw;
- size_t len;
- struct in_addr from;
- struct sockaddr_in *to;
- struct hardware *hto;
-{
- int bufp = 0;
- unsigned char buf [256];
- struct iovec iov [2];
-
- /* Assemble the headers... */
- assemble_hw_header (interface, buf, &bufp, hto);
- assemble_udp_ip_header (interface, buf, &bufp, from.s_addr,
- to -> sin_addr.s_addr, to -> sin_port,
- (unsigned char *)raw, len);
-
- /* Fire it off */
- iov [0].iov_base = (char *)buf;
- iov [0].iov_len = bufp;
- iov [1].iov_base = (char *)raw;
- iov [1].iov_len = len;
-
- return writev(interface -> wfdesc, iov, 2);
-}
-#endif /* USE_BPF_SEND */
-
-#ifdef USE_BPF_RECEIVE
-size_t receive_packet (interface, buf, len, from, hfrom)
- struct interface_info *interface;
- unsigned char *buf;
- size_t len;
- struct sockaddr_in *from;
- struct hardware *hfrom;
-{
- int length = 0;
- int offset = 0;
- struct bpf_hdr hdr;
-
- /* All this complexity is because BPF doesn't guarantee
- that only one packet will be returned at a time. We're
- getting what we deserve, though - this is a terrible abuse
- of the BPF interface. Sigh. */
-
- /* Process packets until we get one we can return or until we've
- done a read and gotten nothing we can return... */
-
- do {
- /* If the buffer is empty, fill it. */
- if (interface -> rbuf_offset == interface -> rbuf_len) {
- length = read (interface -> rfdesc,
- interface -> rbuf,
- interface -> rbuf_max);
- if (length <= 0)
- return length;
- interface -> rbuf_offset = 0;
- interface -> rbuf_len = length;
- }
-
- /* If there isn't room for a whole bpf header, something went
- wrong, but we'll ignore it and hope it goes away... XXX */
- if (interface -> rbuf_len -
- interface -> rbuf_offset < sizeof hdr) {
- interface -> rbuf_offset = interface -> rbuf_len;
- continue;
- }
-
- /* Copy out a bpf header... */
- memcpy (&hdr, &interface -> rbuf [interface -> rbuf_offset],
- sizeof hdr);
-
- /* If the bpf header plus data doesn't fit in what's left
- of the buffer, stick head in sand yet again... */
- if (interface -> rbuf_offset +
- hdr.bh_hdrlen + hdr.bh_caplen > interface -> rbuf_len) {
- interface -> rbuf_offset = interface -> rbuf_len;
- continue;
- }
-
- /* If the captured data wasn't the whole packet, or if
- the packet won't fit in the input buffer, all we
- can do is drop it. */
- if (hdr.bh_caplen != hdr.bh_datalen) {
- interface -> rbuf_offset +=
- hdr.bh_hdrlen = hdr.bh_caplen;
- continue;
- }
-
- /* Skip over the BPF header... */
- interface -> rbuf_offset += hdr.bh_hdrlen;
-
- /* Decode the physical header... */
- offset = decode_hw_header (interface,
- interface -> rbuf,
- interface -> rbuf_offset,
- hfrom);
-
- /* If a physical layer checksum failed (dunno of any
- physical layer that supports this, but WTH), skip this
- packet. */
- if (offset < 0) {
- interface -> rbuf_offset += hdr.bh_caplen;
- continue;
- }
- interface -> rbuf_offset += offset;
- hdr.bh_caplen -= offset;
-
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header (interface,
- interface -> rbuf,
- interface -> rbuf_offset,
- from,
- (unsigned char *)0,
- hdr.bh_caplen);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0) {
- interface -> rbuf_offset += hdr.bh_caplen;
- continue;
- }
- interface -> rbuf_offset += offset;
- hdr.bh_caplen -= offset;
-
- /* If there's not enough room to stash the packet data,
- we have to skip it (this shouldn't happen in real
- life, though). */
- if (hdr.bh_caplen > len) {
- interface -> rbuf_offset += hdr.bh_caplen;
- continue;
- }
-
- /* Copy out the data in the packet... */
- memcpy (buf, interface -> rbuf + interface -> rbuf_offset,
- hdr.bh_caplen);
- interface -> rbuf_offset += hdr.bh_caplen;
- return hdr.bh_caplen;
- } while (!length);
- return 0;
-}
-#endif
diff --git a/common/conflex.c b/common/conflex.c
deleted file mode 100644
index 461c2169..00000000
--- a/common/conflex.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/* conflex.c
-
- Lexical scanner for dhcpd config file... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include "dhctoken.h"
-#include <ctype.h>
-
-static int line;
-static int lpos;
-int tlpos;
-int tline;
-static int token;
-static int ugflag;
-static char *tval;
-static char tokbuf [1500];
-
-static int get_char PROTO ((FILE *));
-static int get_token PROTO ((FILE *));
-static void skip_to_eol PROTO ((FILE *));
-static int read_string PROTO ((FILE *));
-static int read_number PROTO ((int, FILE *));
-static int read_num_or_atom PROTO ((int, FILE *));
-static int intern PROTO ((char *, int));
-
-static int get_char (cfile)
- FILE *cfile;
-{
- int c = getc (cfile);
- if (!ugflag) {
- if (c == EOL) {
- line++;
- lpos = 1;
- } else {
- lpos++;
- }
- } else
- ugflag = 0;
- return c;
-}
-
-static int get_token (cfile)
- FILE *cfile;
-{
- int c;
- int i;
- int ttok;
-#ifdef DEBUG_TOKENS
- static char tb [2];
-#endif
-
- do {
- c = get_char (cfile);
- if (isascii (c) && isspace (c))
- continue;
- if (c == '#') {
- skip_to_eol (cfile);
- continue;
- }
- tlpos = lpos;
- tline = line;
- if (c == '"') {
- ttok = read_string (cfile);
- break;
- }
- if ((isascii (c) && isdigit (c)) || c == '-') {
- ttok = read_number (c, cfile);
- break;
- } else if (isascii (c) && isalpha (c)) {
- ttok = read_num_or_atom (c, cfile);
- break;
- } else {
-#ifdef DEBUG_TOKENS
- tb [0] = c;
- tb [1] = 0;
- tval = tb;
-#else
- tval = 0;
-#endif
- ttok = c;
- break;
- }
- } while (1);
- return ttok;
-}
-
-int next_token (rval, cfile)
- char **rval;
- FILE *cfile;
-{
- int rv;
-
- if (token) {
- rv = token;
- token = 0;
- } else {
- rv = get_token (cfile);
- }
- if (rval)
- *rval = tval;
-#ifdef DEBUG_TOKENS
- fprintf (stderr, "%s:%d ", tval, rv);
-#endif
- return rv;
-}
-
-int peek_token (rval, cfile)
- char **rval;
- FILE *cfile;
-{
- if (!token)
- token = get_token (cfile);
- if (rval)
- *rval = tval;
-#ifdef DEBUG_TOKENS
- fprintf (stderr, "(%s:%d) ", tval, token);
-#endif
- return token;
-}
-
-static void skip_to_eol (cfile)
- FILE *cfile;
-{
- int c;
- do {
- c = get_char (cfile);
- if (c == EOF)
- return;
- if (c == EOL) {
- ungetc (c, cfile);
- ugflag = 1;
- return;
- }
- } while (1);
-}
-
-static int read_string (cfile)
- FILE *cfile;
-{
- int i;
- int bs = 0;
- int c;
-
- for (i = 0; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (c == EOF) {
- parse_warn ("eof in string constant");
- break;
- }
- if (bs) {
- bs = 0;
- tokbuf [i] = c;
- } else if (c == '\\')
- bs = 1;
- else if (c == '"')
- break;
- else
- tokbuf [i] = c;
- }
- /* Normally, I'd feel guilty about this, but we're talking about
- strings that'll fit in a DHCP packet here... */
- if (i == sizeof tokbuf) {
- parse_warn ("string constant larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return STRING;
-}
-
-static int read_number (c, cfile)
- int c;
- FILE *cfile;
-{
- int seenx = 0;
- int i = 0;
- tokbuf [i++] = c;
- for (; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (!seenx && c == 'x')
- seenx = 1;
- else if (!isascii (c) || !isxdigit (c)) {
- ungetc (c, cfile);
- ugflag = 1;
- break;
- }
- tokbuf [i] = c;
- }
- if (i == sizeof tokbuf) {
- parse_warn ("numeric token larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return NUMBER;
-}
-
-static int read_num_or_atom (c, cfile)
- int c;
- FILE *cfile;
-{
- int i = 0;
- int rv = NUMBER_OR_ATOM;
- tokbuf [i++] = c;
- for (; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (!isascii (c) ||
- (c != '-' && c != '_' && !isalnum (c))) {
- ungetc (c, cfile);
- ugflag = 1;
- break;
- }
- if (!isxdigit (c))
- rv = ATOM;
- tokbuf [i] = c;
- }
- if (i == sizeof tokbuf) {
- parse_warn ("token larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return intern (tval, rv);
-}
-
-static int intern (atom, dfv)
- char *atom;
- int dfv;
-{
- if (!isascii (atom [0]))
- return dfv;
-
- switch (tolower (atom [0])) {
- case 'c':
- if (!strcasecmp (atom + 1, "lass"))
- return CLASS;
- if (!strcasecmp (atom + 1, "iaddr"))
- return CIADDR;
- break;
- case 'd':
- if (!strcasecmp (atom + 1, "efault-lease-time"))
- return DEFAULT_LEASE_TIME;
- if (!strcasecmp (atom + 1, "ynamic-bootp"))
- return DYNAMIC_BOOTP;
- break;
- case 'e':
- if (!strcasecmp (atom + 1, "thernet"))
- return ETHERNET;
- if (!strcasecmp (atom + 1, "nds"))
- return ENDS;
- break;
- case 'f':
- if (!strcasecmp (atom + 1, "ilename"))
- return FILENAME;
- if (!strcasecmp (atom + 1, "ixed-address"))
- return FIXED_ADDR;
- break;
- case 'g':
- if (!strcasecmp (atom + 1, "iaddr"))
- return GIADDR;
- break;
- case 'h':
- if (!strcasecmp (atom + 1, "ost"))
- return HOST;
- if (!strcasecmp (atom + 1, "ardware"))
- return HARDWARE;
- break;
- case 'l':
- if (!strcasecmp (atom + 1, "ease"))
- return LEASE;
- break;
- case 'm':
- if (!strcasecmp (atom + 1, "ax-lease-time"))
- return MAX_LEASE_TIME;
- break;
- case 'n':
- if (!strcasecmp (atom + 1, "etmask"))
- return NETMASK;
- break;
- case 'p':
- if (!strcasecmp (atom + 1, "acket"))
- return PACKET;
- break;
- case 'o':
- if (!strcasecmp (atom + 1, "ption"))
- return OPTION;
- break;
- case 'r':
- if (!strcasecmp (atom + 1, "ange"))
- return RANGE;
- break;
- case 's':
- if (!strcasecmp (atom + 1, "tarts"))
- return STARTS;
- if (!strcasecmp (atom + 1, "iaddr"))
- return SIADDR;
- if (!strcasecmp (atom + 1, "ubnet"))
- return SUBNET;
- if (!strcasecmp (atom + 1, "hared-network"))
- return SHARED_NETWORK;
- if (!strcasecmp (atom + 1, "erver-name"))
- return SERVER_NAME;
- if (!strcasecmp (atom + 1, "erver-identifier"))
- return SERVER_IDENTIFIER;
- break;
- case 't':
- if (!strcasecmp (atom + 1, "imestamp"))
- return TIMESTAMP;
- break;
- case 'u':
- if (!strcasecmp (atom + 1, "id"))
- return UID;
- if (!strcasecmp (atom + 1, "ser-class"))
- return USER_CLASS;
- break;
- case 'v':
- if (!strcasecmp (atom + 1, "endor-class"))
- return VENDOR_CLASS;
- break;
- case 'y':
- if (!strcasecmp (atom + 1, "iaddr"))
- return YIADDR;
- break;
- }
- return dfv;
-}
diff --git a/common/convert.c b/common/convert.c
deleted file mode 100644
index 064dc5c4..00000000
--- a/common/convert.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* convert.c
-
- Safe copying of option values into and out of the option buffer, which
- can't be assumed to be aligned. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-u_int32_t getULong (buf)
- unsigned char *buf;
-{
- unsigned long ibuf;
-
- memcpy (&ibuf, buf, sizeof (u_int32_t));
- return ntohl (ibuf);
-}
-
-int32_t getLong (buf)
- unsigned char *buf;
-{
- long ibuf;
-
- memcpy (&ibuf, buf, sizeof (int32_t));
- return ntohl (ibuf);
-}
-
-u_int16_t getUShort (buf)
- unsigned char *buf;
-{
- unsigned short ibuf;
-
- memcpy (&ibuf, buf, sizeof (u_int16_t));
- return ntohs (ibuf);
-}
-
-int16_t getShort (buf)
- unsigned char *buf;
-{
- short ibuf;
-
- memcpy (&ibuf, buf, sizeof (int16_t));
- return ntohs (ibuf);
-}
-
-void putULong (obuf, val)
- unsigned char *obuf;
- u_int32_t val;
-{
- u_int32_t tmp = htonl (val);
- memcpy (obuf, &tmp, sizeof tmp);
-}
-
-void putLong (obuf, val)
- unsigned char *obuf;
- int32_t val;
-{
- int32_t tmp = htonl (val);
- memcpy (obuf, &tmp, sizeof tmp);
-}
-
-void putUShort (obuf, val)
- unsigned char *obuf;
- u_int16_t val;
-{
- u_int16_t tmp = htonl (val);
- memcpy (obuf, &tmp, sizeof tmp);
-}
-
-void putShort (obuf, val)
- unsigned char *obuf;
- int16_t val;
-{
- int16_t tmp = htonl (val);
- memcpy (obuf, &tmp, sizeof tmp);
-}
-
diff --git a/common/dispatch.c b/common/dispatch.c
deleted file mode 100644
index bbd5716e..00000000
--- a/common/dispatch.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/* socket.c
-
- BSD socket interface code... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include <sys/ioctl.h>
-
-struct interface_info *interfaces;
-static struct hardware_link *interface_links;
-
-static void got_one PROTO ((struct interface_info *));
-
-/* Use the SIOCGIFCONF ioctl to get a list of all the attached interfaces.
- For each interface that's of type INET and not the loopback interface,
- register that interface with the network I/O software, figure out what
- subnet it's on, and add it to the list of interfaces. */
-
-void discover_interfaces ()
-{
- struct interface_info *tmp;
- struct interface_info *last;
- static char buf [8192];
- struct ifconf ic;
- int i;
- int sock;
- int address_count = 0;
- int ifix = 0;
- struct hardware_link *lp;
- struct subnet *subnet;
- struct shared_network *share;
- struct sockaddr_in *foo;
-#ifdef USE_FALLBACK
- static struct shared_network fallback_network;
-#endif
-
- /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
- if ((sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
- error ("Can't create addrlist socket");
-
- /* Get the interface configuration information... */
- ic.ifc_len = sizeof buf;
- ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
- i = ioctl(sock, SIOCGIFCONF, &ic);
- close (sock);
- if (i < 0)
- error ("ioctl: SIOCGIFCONF: %m");
-
- /* Cycle through the list of interfaces looking for IP addresses.
- Go through twice; once to count the number if addresses, and a
- second time to copy them into an array of addresses. */
- for (i = 0; i < ic.ifc_len;) {
- struct ifreq *ifp = (struct ifreq *)((caddr_t)ic.ifc_req + i);
-#ifdef HAVE_SA_LEN
- i += (sizeof ifp -> ifr_name) + ifp -> ifr_addr.sa_len;
-#else
- i += sizeof *ifp;
-#endif
-
- /* See if we've seen an interface that matches this one. */
- for (tmp = interfaces; tmp; tmp = tmp -> next)
- if (!strcmp (tmp -> name, ifp -> ifr_name))
- break;
-
- /* If there isn't already an interface by this name,
- allocate one. */
- if (!tmp) {
- tmp = ((struct interface_info *)
- dmalloc (sizeof *tmp, "get_interface_list"));
- if (!tmp)
- error ("Insufficient memory to %s %s",
- "record interface", ifp -> ifr_name);
- memset (tmp, 0, sizeof *tmp);
- strcpy (tmp -> name, ifp -> ifr_name);
- tmp -> next = interfaces;
- interfaces = tmp;
- }
-
- /* If we have the capability, extract link information
- and record it in a linked list. */
-#ifdef AF_LINK
- if (ifp -> ifr_addr.sa_family == AF_LINK) {
- struct sockaddr_dl *foo = ((struct sockaddr_dl *)
- (&ifp -> ifr_addr));
- tmp -> hw_address.hlen = foo -> sdl_alen;
- tmp -> hw_address.htype = ARPHRD_ETHER; /* XXX */
- memcpy (tmp -> hw_address.haddr,
- LLADDR (foo), foo -> sdl_alen);
- } else
-#endif /* AF_LINK */
-
- if (ifp -> ifr_addr.sa_family == AF_INET) {
- struct iaddr addr;
-
- /* Get a pointer to the address... */
- foo = (struct sockaddr_in *)(&ifp -> ifr_addr);
-
- /* We don't want the loopback interface. */
- if (foo -> sin_addr.s_addr == htonl (INADDR_LOOPBACK))
- continue;
-
- /* If this is the first real IP address we've
- found, keep a pointer to ifreq structure in
- which we found it. */
- if (!tmp -> tif)
- tmp -> tif = ifp;
-
- /* Grab the address... */
- addr.len = 4;
- memcpy (addr.iabuf, &foo -> sin_addr.s_addr,
- addr.len);
-
- /* If this address matches the server identifier,
- make a note of it. */
- if (addr_eq (addr, server_identifier))
- server_identifier_matched = 1;
-
- /* If there's a registered subnet for this address,
- connect it together... */
- if ((subnet = find_subnet (addr))) {
- /* If this interface has multiple aliases
- on the same subnet, ignore all but the
- first we encounter. */
- if (!subnet -> interface) {
- subnet -> interface = tmp;
- subnet -> interface_address = addr;
- } else if (subnet -> interface != tmp) {
- warn ("Multiple %s %s: %s %s",
- "interfaces match the",
- "same subnet",
- subnet -> interface -> name,
- tmp -> name);
- }
- share = subnet -> shared_network;
- if (tmp -> shared_network &&
- tmp -> shared_network != share) {
- warn ("Interface %s matches %s",
- tmp -> name,
- "multiple shared networks");
- } else {
- tmp -> shared_network = share;
- }
-
- if (!share -> interface) {
- share -> interface = tmp;
- } else if (share -> interface != tmp) {
- warn ("Multiple %s %s: %s %s",
- "interfaces match the",
- "same shared network",
- share -> interface -> name,
- tmp -> name);
- }
- }
- }
- }
-
- /* Weed out the interfaces that did not have IP addresses. */
- last = (struct interface_info *)0;
- for (tmp = interfaces; tmp; tmp = tmp -> next) {
- if (!tmp -> tif) {
- if (!last)
- interfaces = interfaces -> next;
- else
- last -> next = tmp -> next;
- continue;
- }
-
- foo = (struct sockaddr_in *)(&tmp -> tif -> ifr_addr);
-
- /* Find subnets that don't have valid interface
- addresses... */
- for (subnet = (tmp -> shared_network
- ? tmp -> shared_network -> subnets
- : (struct subnet *)0);
- subnet; subnet = subnet -> next_sibling) {
- if (!subnet -> interface_address.len) {
- warn ("subnet %s attached to interface %s %s",
- piaddr (subnet -> net), tmp -> name,
- "but has no alias on that network.");
- /* Set the interface address for this subnet
- to the first address we found. */
- subnet -> interface_address.len = 4;
- memcpy (subnet -> interface_address.iabuf,
- &foo -> sin_addr.s_addr, 4);
- }
- }
-
- /* If a server identifier wasn't specified, take it
- from the first IP address we see... */
- if (!server_identifier.len) {
- if (address_count > 1)
- warn ("no server identifier specified.");
- server_identifier.len = 4;
- memcpy (server_identifier.iabuf,
- &foo -> sin_addr.s_addr, 4);
- /* Flag the server identifier as having matched,
- so we don't generate a spurious warning. */
- server_identifier_matched = 1;
- }
-
-
- /* Register the interface... */
- if_register_receive (tmp, tmp -> tif);
- if_register_send (tmp, tmp -> tif);
-
- tmp -> tif = (struct ifreq *)0; /* Can't keep this. */
- }
- if (!server_identifier_matched)
- warn ("no interface address matches server identifier");
-
-#ifdef USE_FALLBACK
- strcpy (fallback_interface.name, "fallback");
- fallback_interface.shared_network = &fallback_network;
- fallback_network.name = "fallback-net";
- if_register_fallback (&fallback_interface, (struct ifreq *)0);
-#endif
-}
-
-#ifdef USE_POLL
-/* Wait for packets to come in using poll(). Anyway, when a packet
- comes in, call receive_packet to receive the packet and possibly
- strip hardware addressing information from it, and then call
- do_packet to try to do something with it.
-
- As you can see by comparing this with the code that uses select(),
- below, this is gratuitously complex. Quelle surprise, eh? This is
- SysV we're talking about, after all, and even in the 90's, it
- wouldn't do for SysV to make networking *easy*, would it? Rant,
- rant... */
-
-void dispatch ()
-{
- struct interface_info *l;
- int nfds = 0;
- struct pollfd *fds;
- int count;
- int i;
-
- nfds = 0;
- for (l = interfaces; l; l = l -> next) {
- ++nfds;
- }
- fds = (struct pollfd *)malloc (nfds * sizeof (struct pollfd));
- if (!fds)
- error ("Can't allocate poll structures.");
-
- i = 0;
- for (l = interfaces; l; l = l -> next) {
- fds [i].fd = l -> rfdesc;
- fds [i].events = POLLIN;
- fds [i].revents = 0;
- ++i;
- }
-
- do {
- /* Wait for a packet or a timeout... XXX */
- count = poll (fds, nfds, -1);
-
- /* Get the current time... */
- GET_TIME (&cur_time);
-
- /* Not likely to be transitory... */
- if (count < 0)
- error ("poll: %m");
-
- i = 0;
- for (l = interfaces; l; l = l -> next) {
- if (!(fds [i].revents & POLLIN))
- continue;
- fds [i].revents = 0;
- got_one (l);
- }
- } while (1);
-}
-#else
-/* Wait for packets to come in using select(). When one does, call
- receive_packet to receive the packet and possibly strip hardware
- addressing information from it, and then call do_packet to try to
- do something with it. */
-
-void dispatch ()
-{
- struct sockaddr_in from;
- struct hardware hfrom;
- struct iaddr ifrom;
- fd_set r, w, x;
- struct interface_info *l;
- int max = 0;
- int count;
- int result;
- static unsigned char packbuf [4095]; /* Packet input buffer.
- Must be as large as largest
- possible MTU. */
-
- FD_ZERO (&r);
- FD_ZERO (&w);
- FD_ZERO (&x);
-
- do {
- /* Set up the read mask. */
- for (l = interfaces; l; l = l -> next) {
- FD_SET (l -> rfdesc, &r);
- FD_SET (l -> rfdesc, &x);
- if (l -> rfdesc > max)
- max = l -> rfdesc;
- }
-
- /* Wait for a packet or a timeout... XXX */
- count = select (max + 1, &r, &w, &x, (struct timeval *)0);
-
- /* Get the current time... */
- GET_TIME (&cur_time);
-
- /* Not likely to be transitory... */
- if (count < 0)
- error ("select: %m");
-
- for (l = interfaces; l; l = l -> next) {
- if (!FD_ISSET (l -> rfdesc, &r))
- continue;
- got_one (l);
- }
- } while (1);
-}
-#endif /* USE_POLL */
-
-static void got_one (l)
- struct interface_info *l;
-{
- struct sockaddr_in from;
- struct hardware hfrom;
- struct iaddr ifrom;
- int result;
- static unsigned char packbuf [4095]; /* Packet input buffer.
- Must be as large as largest
- possible MTU. */
-
- if ((result = receive_packet (l, packbuf, sizeof packbuf,
- &from, &hfrom)) < 0) {
- warn ("receive_packet failed on %s: %m", l -> name);
- return;
- }
- if (result == 0)
- return;
-
- ifrom.len = 4;
- memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len);
-
- do_packet (l, packbuf, result,
- from.sin_port, ifrom, &hfrom);
-}
-
-void do_packet (interface, packbuf, len, from_port, from, hfrom)
- struct interface_info *interface;
- unsigned char *packbuf;
- int len;
- unsigned short from_port;
- struct iaddr from;
- struct hardware *hfrom;
-{
- struct packet tp;
- struct dhcp_packet tdp;
-
- memcpy (&tdp, packbuf, len);
- memset (&tp, 0, sizeof tp);
- tp.raw = &tdp;
- tp.packet_length = len;
- tp.client_port = from_port;
- tp.client_addr = from;
- tp.interface = interface;
- tp.haddr = hfrom;
-
- parse_options (&tp);
- if (tp.options_valid &&
- tp.options [DHO_DHCP_MESSAGE_TYPE].data)
- tp.packet_type =
- tp.options [DHO_DHCP_MESSAGE_TYPE].data [0];
- if (tp.packet_type)
- dhcp (&tp);
- else
- bootp (&tp);
-}
-
-int locate_network (packet)
- struct packet *packet;
-{
- struct iaddr ia;
-
- /* If this came through a gateway, find the corresponding subnet... */
- if (packet -> raw -> giaddr.s_addr) {
- struct subnet *subnet;
- ia.len = 4;
- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
- subnet = find_subnet (ia);
- if (subnet)
- packet -> shared_network = subnet -> shared_network;
- else
- packet -> shared_network = (struct shared_network *)0;
- } else {
- packet -> shared_network =
- packet -> interface -> shared_network;
- }
-
- /* If the subnet from whence this packet came is unknown to us,
- drop it on the floor... */
- if (!packet -> shared_network) {
- note ("Packet from unknown subnet: %s",
- inet_ntoa (packet -> raw -> giaddr));
- return 0;
- }
- return 1;
-}
diff --git a/common/errwarn.c b/common/errwarn.c
deleted file mode 100644
index 89752d03..00000000
--- a/common/errwarn.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* errwarn.c
-
- Errors and warnings... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium.
- * All Rights Reserved.
- * Copyright (c) 1995 RadioMail Corporation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of RadioMail Corporation, the Internet Software
- * Consortium nor the names of its contributors may be used to endorse
- * or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY RADIOMAIL CORPORATION, THE INTERNET
- * SOFTWARE CONSORTIUM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL RADIOMAIL CORPORATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for RadioMail Corporation by Ted Lemon
- * under a contract with Vixie Enterprises. Further modifications have
- * been made for the Internet Software Consortium under a contract
- * with Vixie Laboratories.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include <errno.h>
-
-static void do_percentm PROTO ((char *obuf, char *ibuf));
-
-static char mbuf [1024];
-static char fbuf [1024];
-
-/* Log an error message, then exit... */
-
-void error (ANSI_DECL(char *) fmt, VA_DOTDOTDOT)
- KandR (char *fmt;)
- va_dcl
-{
- va_list list;
- extern int logged_in;
-
- do_percentm (fbuf, fmt);
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-#ifndef DEBUG
- syslog (log_priority | LOG_ERR, mbuf);
-#else
- write (1, mbuf, strlen (mbuf));
- write (1, "\n", 1);
-#endif
-
- cleanup ();
- exit (1);
-}
-
-/* Log a warning message... */
-
-int warn (ANSI_DECL (char *) fmt, VA_DOTDOTDOT)
- KandR (char *fmt;)
- va_dcl
-{
- va_list list;
-
- do_percentm (fbuf, fmt);
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-#ifndef DEBUG
- syslog (log_priority | LOG_ERR, mbuf);
-#else
- write (1, mbuf, strlen (mbuf));
- write (1, "\n", 1);
-#endif
- return 0;
-}
-
-/* Log a note... */
-
-int note (ANSI_DECL (char *) fmt, VA_DOTDOTDOT)
- KandR (char *fmt;)
- va_dcl
-{
- va_list list;
-
- do_percentm (fbuf, fmt);
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-#ifndef DEBUG
- syslog (log_priority | LOG_INFO, mbuf);
-#else
- write (1, mbuf, strlen (mbuf));
- write (1, "\n", 1);
-#endif
- return 0;
-}
-
-/* Log a debug message... */
-
-int debug (ANSI_DECL (char *) fmt, VA_DOTDOTDOT)
- KandR (char *fmt;)
- va_dcl
-{
- va_list list;
-
- do_percentm (fbuf, fmt);
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-#ifndef DEBUG
- syslog (log_priority | LOG_DEBUG, mbuf);
-#else
- write (1, mbuf, strlen (mbuf));
- write (1, "\n", 1);
-#endif
- return 0;
-}
-
-/* Find %m in the input string and substitute an error message string. */
-
-static void do_percentm (obuf, ibuf)
- char *obuf;
- char *ibuf;
-{
- char *s = ibuf;
- char *p = obuf;
- int infmt = 0;
-
- while (*s)
- {
- if (infmt)
- {
- if (*s == 'm')
- {
- strcpy (p - 1, strerror (errno));
- p += strlen (p);
- ++s;
- }
- else
- *p++ = *s++;
- infmt = 0;
- }
- else
- {
- if (*s == '%')
- infmt = 1;
- *p++ = *s++;
- }
- }
- *p = 0;
-}
-
-
-int parse_warn (ANSI_DECL (char *) fmt, VA_DOTDOTDOT)
- KandR (char *fmt;)
- va_dcl
-{
- extern int tline, tlpos;
- va_list list;
-
- do_percentm (mbuf, fmt);
-#ifndef NO_SNPRINTF
- snprintf (fbuf, sizeof fbuf, "dhcpd.conf line %d char %d: %s",
- tline, tlpos, mbuf);
-#else
- sprintf (fbuf, "dhcpd.conf line %d char %d: %s", tline, tlpos, mbuf);
-#endif
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-#ifndef DEBUG
- syslog (log_priority | LOG_ERR, mbuf);
-#else
- write (1, mbuf, strlen (mbuf));
- write (1, "\n", 1);
-#endif
- return 0;
-}
-
-#ifdef NO_STRERROR
-char *strerror (err)
- int err;
-{
- extern char *sys_errlist [];
- extern int sys_nerr;
- static char errbuf [128];
-
- if (err < 0 || err >= sys_nerr) {
- sprintf (errbuf, "Error %d", err);
- return errbuf;
- }
- return sys_errlist [err];
-}
-#endif /* NO_STRERROR */
diff --git a/common/hash.c b/common/hash.c
deleted file mode 100644
index 68972b72..00000000
--- a/common/hash.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* hash.c
-
- Routines for manipulating hash tables... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static INLINE int do_hash PROTO ((char *, int, int));
-
-struct hash_table *new_hash ()
-{
- struct hash_table *rv = new_hash_table (DEFAULT_HASH_SIZE, "new_hash");
- if (!rv)
- return rv;
- memset (&rv -> buckets [0], 0,
- DEFAULT_HASH_SIZE * sizeof (struct hash_bucket *));
- return rv;
-}
-
-static INLINE int do_hash (name, len, size)
- char *name;
- int len;
- int size;
-{
- register int accum = 0;
- register unsigned char *s = (unsigned char *)name;
- int i = len;
- if (i) {
- while (i--) {
- /* Add the character in... */
- accum += *s++;
- /* Add carry back in... */
- while (accum > 255) {
- accum = (accum & 255) + (accum >> 8);
- }
- }
- } else {
- while (*s) {
- /* Add the character in... */
- accum += *s++;
- /* Add carry back in... */
- while (accum > 255) {
- accum = (accum & 255) + (accum >> 8);
- }
- }
- }
- return accum % size;
-}
-
-void add_hash (table, name, len, pointer)
- struct hash_table *table;
- int len;
- char *name;
- unsigned char *pointer;
-{
- int hashno;
- struct hash_bucket *bp;
-
- if (!table)
- return;
-
- hashno = do_hash (name, len, table -> hash_count);
- bp = new_hash_bucket ("add_hash");
-
- if (!bp) {
- warn ("Can't add %s to hash table.", name);
- return;
- }
- bp -> name = name;
- bp -> value = pointer;
- bp -> next = table -> buckets [hashno];
- bp -> len = len;
- table -> buckets [hashno] = bp;
-}
-
-void delete_hash_entry (table, name, len)
- struct hash_table *table;
- int len;
- char *name;
-{
- int hashno;
- struct hash_bucket *bp, *pbp = (struct hash_bucket *)0;
-
- if (!table)
- return;
-
- hashno = do_hash (name, len, table -> hash_count);
-
- /* Go through the list looking for an entry that matches;
- if we find it, delete it. */
- for (bp = table -> buckets [hashno]; bp; bp = bp -> next) {
- if ((!bp -> len && !strcmp (bp -> name, name)) ||
- (bp -> len == len &&
- !memcmp (bp -> name, name, len))) {
- if (pbp) {
- pbp -> next = bp -> next;
- } else {
- table -> buckets [hashno] = bp -> next;
- }
- free_hash_bucket (bp, "delete_hash_entry");
- break;
- }
- }
-}
-
-unsigned char *hash_lookup (table, name, len)
- struct hash_table *table;
- char *name;
- int len;
-{
- int hashno;
- struct hash_bucket *bp;
-
- if (!table)
- return (unsigned char *)0;
- hashno = do_hash (name, len, table -> hash_count);
-
- if (len) {
- for (bp = table -> buckets [hashno]; bp; bp = bp -> next) {
- if (len == bp -> len
- && !memcmp (bp -> name, name, len))
- return bp -> value;
- }
- } else {
- for (bp = table -> buckets [hashno]; bp; bp = bp -> next)
- if (!strcmp (bp -> name, name))
- return bp -> value;
- }
- return (unsigned char *)0;
-}
-
diff --git a/common/inet.c b/common/inet.c
deleted file mode 100644
index 000d9718..00000000
--- a/common/inet.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* inet.c
-
- Subroutines to manipulate internet addresses in a safely portable
- way... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#include "dhcpd.h"
-
-/* Return just the network number of an internet address... */
-
-struct iaddr subnet_number (addr, mask)
- struct iaddr addr;
- struct iaddr mask;
-{
- int i;
- struct iaddr rv;
-
- rv.len = 0;
-
- /* Both addresses must have the same length... */
- if (addr.len != mask.len)
- return rv;
-
- rv.len = addr.len;
- for (i = 0; i < rv.len; i++)
- rv.iabuf [i] = addr.iabuf [i] & mask.iabuf [i];
- return rv;
-}
-
-/* Combine a network number and a integer to produce an internet address.
- This won't work for subnets with more than 32 bits of host address, but
- maybe this isn't a problem. */
-
-struct iaddr ip_addr (subnet, mask, host_address)
- struct iaddr subnet;
- struct iaddr mask;
- u_int32_t host_address;
-{
- int i, j, k;
- u_int32_t swaddr;
- struct iaddr rv;
- unsigned char habuf [sizeof swaddr];
-
- swaddr = htonl (host_address);
- memcpy (habuf, &swaddr, sizeof swaddr);
-
- /* Combine the subnet address and the host address. If
- the host address is bigger than can fit in the subnet,
- return a zero-length iaddr structure. */
- rv = subnet;
- j = rv.len - sizeof habuf;
- for (i = sizeof habuf - 1; i >= 0; i--) {
- if (mask.iabuf [i + j]) {
- if (habuf [i] > (mask.iabuf [i + j] ^ 0xFF)) {
- rv.len = 0;
- return rv;
- }
- for (k = i - 1; k >= 0; k--) {
- if (habuf [k]) {
- rv.len = 0;
- return rv;
- }
- }
- rv.iabuf [i + j] |= habuf [i];
- break;
- } else
- rv.iabuf [i + j] = habuf [i];
- }
-
- return rv;
-}
-
-u_int32_t host_addr (addr, mask)
- struct iaddr addr;
- struct iaddr mask;
-{
- int i;
- u_int32_t swaddr;
- struct iaddr rv;
-
- rv.len = 0;
-
- /* Mask out the network bits... */
- rv.len = addr.len;
- for (i = 0; i < rv.len; i++)
- rv.iabuf [i] = addr.iabuf [i] & ~mask.iabuf [i];
-
- /* Copy out up to 32 bits... */
- memcpy (&swaddr, &rv.iabuf [rv.len - sizeof swaddr], sizeof swaddr);
-
- /* Swap it and return it. */
- return ntohl (swaddr);
-}
-
-int addr_eq (addr1, addr2)
- struct iaddr addr1, addr2;
-{
- if (addr1.len != addr2.len)
- return 0;
- return memcmp (addr1.iabuf, addr2.iabuf, addr1.len) == 0;
-}
-
-char *piaddr (addr)
- struct iaddr addr;
-{
- static char pbuf [4 * 16];
- char *s = pbuf;
- int i;
-
- if (addr.len == 0) {
- strcpy (s, "<null address>");
- }
- for (i = 0; i < addr.len; i++) {
- sprintf (s, "%s%d", i ? "." : "", addr.iabuf [i]);
- s += strlen (s);
- }
- return pbuf;
-}
diff --git a/common/memory.c b/common/memory.c
deleted file mode 100644
index b030ea87..00000000
--- a/common/memory.c
+++ /dev/null
@@ -1,676 +0,0 @@
-/* memory.c
-
- Memory-resident database... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static struct subnet *subnets;
-static struct shared_network *shared_networks;
-static struct hash_table *host_hw_addr_hash;
-static struct hash_table *host_uid_hash;
-static struct hash_table *lease_uid_hash;
-static struct hash_table *lease_ip_addr_hash;
-static struct hash_table *lease_hw_addr_hash;
-static struct lease *dangling_leases;
-
-static struct hash_table *vendor_class_hash;
-static struct hash_table *user_class_hash;
-
-void enter_host (hd)
- struct host_decl *hd;
-{
- struct host_decl *hp = (struct host_decl *)0;
- struct host_decl *np = (struct host_decl *)0;
-
- hd -> n_ipaddr = (struct host_decl *)0;
-
- if (hd -> interface.hlen) {
- if (!host_hw_addr_hash)
- host_hw_addr_hash = new_hash ();
- else
- hp = (struct host_decl *)
- hash_lookup (host_hw_addr_hash,
- hd -> interface.haddr,
- hd -> interface.hlen);
-
- if (!hp)
- add_hash (host_hw_addr_hash,
- hd -> interface.haddr, hd -> interface.hlen,
- (unsigned char *)hd);
- }
- /* If there's already a host declaration for this hardware
- address, add this one to the end of the list. Otherwise,
- add it to the hash table. */
-
- if (hp) {
- for (np = hp; np -> n_ipaddr; np = np -> n_ipaddr)
- ;
- np -> n_ipaddr = hd;
- }
-
- if (hd -> options [DHO_DHCP_CLIENT_IDENTIFIER]) {
- if (!tree_evaluate (hd -> options
- [DHO_DHCP_CLIENT_IDENTIFIER]))
- return;
-
- if (!host_uid_hash)
- host_uid_hash = new_hash ();
- else
- hp = (struct host_decl *) hash_lookup
- (host_uid_hash,
- hd -> options
- [DHO_DHCP_CLIENT_IDENTIFIER] -> value,
- hd -> options
- [DHO_DHCP_CLIENT_IDENTIFIER] -> len);
-
- /* If there's already a host declaration for this
- client identifier, add this one to the end of the
- list. Otherwise, add it to the hash table. */
- if (hp) {
- /* Don't link it in twice... */
- if (!np) {
- for (np = hp; np -> n_ipaddr;
- np = np -> n_ipaddr)
- ;
- np -> n_ipaddr = hd;
- }
- } else {
- add_hash (host_uid_hash,
- hd -> options
- [DHO_DHCP_CLIENT_IDENTIFIER] -> value,
- hd -> options
- [DHO_DHCP_CLIENT_IDENTIFIER] -> len,
- (unsigned char *)hd);
- }
- }
-}
-
-struct host_decl *find_hosts_by_haddr (htype, haddr, hlen)
- int htype;
- unsigned char *haddr;
- int hlen;
-{
- struct host_decl *foo;
- int i;
-
- foo = (struct host_decl *)hash_lookup (host_hw_addr_hash,
- haddr, hlen);
- return foo;
-}
-
-struct host_decl *find_hosts_by_uid (data, len)
- unsigned char *data;
- int len;
-{
- struct host_decl *foo;
- int i;
-
- foo = (struct host_decl *)hash_lookup (host_uid_hash, data, len);
- return foo;
-}
-
-/* More than one host_decl can be returned by find_hosts_by_haddr or
- find_hosts_by_uid, and each host_decl can have multiple addresses.
- Loop through the list of hosts, and then for each host, through the
- list of addresses, looking for an address that's in the same shared
- network as the one specified. Store the matching address through
- the addr pointer, update the host pointer to point at the host_decl
- that matched, and return the subnet that matched. */
-
-struct subnet *find_host_for_network (host, addr, share)
- struct host_decl **host;
- struct iaddr *addr;
- struct shared_network *share;
-{
- int i;
- struct subnet *subnet;
- struct iaddr ip_address;
- struct host_decl *hp;
-
- for (hp = *host; hp; hp = hp -> n_ipaddr) {
- if (!hp -> fixed_addr || !tree_evaluate (hp -> fixed_addr))
- continue;
- for (i = 0; i < hp -> fixed_addr -> len; i += 4) {
- ip_address.len = 4;
- memcpy (ip_address.iabuf,
- hp -> fixed_addr -> value + i, 4);
- subnet = find_grouped_subnet (share, ip_address);
- if (subnet) {
- *addr = ip_address;
- *host = hp;
- return subnet;
- }
- }
- }
- return (struct subnet *)0;
-}
-
-void new_address_range (low, high, subnet, dynamic)
- struct iaddr low, high;
- struct subnet *subnet;
- int dynamic;
-{
- struct lease *address_range, *lp, *plp;
- struct iaddr net;
- int min, max, i;
- char lowbuf [16], highbuf [16], netbuf [16];
- struct shared_network *share = subnet -> shared_network;
-
- /* All subnets should have attached shared network structures. */
- if (!share) {
- strcpy (netbuf, piaddr (subnet -> net));
- error ("No shared network for network %s (%s)",
- netbuf, piaddr (subnet -> netmask));
- }
-
- /* Initialize the hash table if it hasn't been done yet. */
- if (!lease_uid_hash)
- lease_uid_hash = new_hash ();
- if (!lease_ip_addr_hash)
- lease_ip_addr_hash = new_hash ();
- if (!lease_hw_addr_hash)
- lease_hw_addr_hash = new_hash ();
-
- /* Make sure that high and low addresses are in same subnet. */
- net = subnet_number (low, subnet -> netmask);
- if (!addr_eq (net, subnet_number (high, subnet -> netmask))) {
- strcpy (lowbuf, piaddr (low));
- strcpy (highbuf, piaddr (high));
- strcpy (netbuf, piaddr (subnet -> netmask));
- error ("Address range %s to %s, netmask %s spans %s!",
- lowbuf, highbuf, netbuf, "multiple subnets");
- }
-
- /* Get the high and low host addresses... */
- max = host_addr (high, subnet -> netmask);
- min = host_addr (low, subnet -> netmask);
-
- /* Allow range to be specified high-to-low as well as low-to-high. */
- if (min > max) {
- max = min;
- min = host_addr (high, subnet -> netmask);
- }
-
- /* Get a lease structure for each address in the range. */
- address_range = new_leases (max - min + 1, "new_address_range");
- if (!address_range) {
- strcpy (lowbuf, piaddr (low));
- strcpy (highbuf, piaddr (high));
- error ("No memory for address range %s-%s.", lowbuf, highbuf);
- }
- memset (address_range, 0, (sizeof *address_range) * (max - min + 1));
-
- /* Fill in the last lease if it hasn't been already... */
- if (!share -> last_lease) {
- share -> last_lease = &address_range [0];
- }
-
- /* Fill out the lease structures with some minimal information. */
- for (i = 0; i < max - min + 1; i++) {
- address_range [i].ip_addr =
- ip_addr (subnet -> net, subnet -> netmask, i + min);
- address_range [i].starts =
- address_range [i].timestamp = MIN_TIME;
- address_range [i].ends = MIN_TIME;
- address_range [i].subnet = subnet;
- address_range [i].shared_network = share;
- address_range [i].flags = dynamic ? DYNAMIC_BOOTP_OK : 0;
-
- /* Link this entry into the list. */
- address_range [i].next = share -> leases;
- address_range [i].prev = (struct lease *)0;
- share -> leases = &address_range [i];
- if (address_range [i].next)
- address_range [i].next -> prev = share -> leases;
- add_hash (lease_ip_addr_hash,
- address_range [i].ip_addr.iabuf,
- address_range [i].ip_addr.len,
- (unsigned char *)&address_range [i]);
- }
-
- /* Find out if any dangling leases are in range... */
- plp = (struct lease *)0;
- for (lp = dangling_leases; lp; lp = lp -> next) {
- struct iaddr lnet;
- int lhost;
-
- lnet = subnet_number (lp -> ip_addr, subnet -> netmask);
- lhost = host_addr (lp -> ip_addr, subnet -> netmask);
-
- /* If it's in range, fill in the real lease structure with
- the dangling lease's values, and remove the lease from
- the list of dangling leases. */
- if (addr_eq (lnet, subnet -> net) &&
- lhost >= i && lhost <= max) {
- if (plp) {
- plp -> next = lp -> next;
- } else {
- dangling_leases = lp -> next;
- }
- lp -> next = (struct lease *)0;
- supersede_lease (&address_range [lhost - i], lp, 0);
- free_lease (lp, "new_address_range");
- } else
- plp = lp;
- }
-}
-
-struct subnet *find_subnet (addr)
- struct iaddr addr;
-{
- struct subnet *rv;
-
- for (rv = subnets; rv; rv = rv -> next_subnet) {
- if (addr_eq (subnet_number (addr, rv -> netmask), rv -> net))
- return rv;
- }
- return (struct subnet *)0;
-}
-
-struct subnet *find_grouped_subnet (share, addr)
- struct shared_network *share;
- struct iaddr addr;
-{
- struct subnet *rv;
-
- for (rv = share -> subnets; rv; rv = rv -> next_sibling) {
- if (addr_eq (subnet_number (addr, rv -> netmask), rv -> net))
- return rv;
- }
- return (struct subnet *)0;
-}
-
-/* Enter a new subnet into the subnet hash. */
-
-void enter_subnet (subnet)
- struct subnet *subnet;
-{
- /* XXX Sort the nets into a balanced tree to make searching quicker. */
- subnet -> next_subnet = subnets;
- subnets = subnet;
-}
-
-/* Enter a new subnet into the subnet hash. */
-
-void enter_shared_network (share)
- struct shared_network *share;
-{
- /* XXX Sort the nets into a balanced tree to make searching quicker. */
- share -> next = shared_networks;
- shared_networks = share;
-}
-
-/* Enter a lease into the system. This is called by the parser each
- time it reads in a new lease. If the subnet for that lease has
- already been read in (usually the case), just update that lease;
- otherwise, allocate temporary storage for the lease and keep it around
- until we're done reading in the config file. */
-
-void enter_lease (lease)
- struct lease *lease;
-{
- struct lease *comp = find_lease_by_ip_addr (lease -> ip_addr);
-
- /* If we don't have a place for this lease yet, save it for
- later. */
- if (!comp) {
- comp = new_lease ("enter_lease");
- if (!comp) {
- error ("No memory for lease %s\n",
- piaddr (lease -> ip_addr));
- }
- *comp = *lease;
- lease -> next = dangling_leases;
- lease -> prev = (struct lease *)0;
- dangling_leases = lease;
- } else {
- supersede_lease (comp, lease, 0);
- }
-}
-
-/* Replace the data in an existing lease with the data in a new lease;
- adjust hash tables to suit, and insertion sort the lease into the
- list of leases by expiry time so that we can always find the oldest
- lease. */
-
-int supersede_lease (comp, lease, commit)
- struct lease *comp, *lease;
- int commit;
-{
- int enter_uid = 0;
- int enter_hwaddr = 0;
- struct lease *lp;
-
- /* If the existing lease hasn't expired and has a different
- unique identifier or, if it doesn't have a unique
- identifier, a different hardware address, then the two
- leases are in conflict. */
- if (comp -> ends > cur_time &&
- ((comp -> uid &&
- (comp -> uid_len != lease -> uid_len ||
- memcmp (comp -> uid, lease -> uid, comp -> uid_len))) ||
- (!comp -> uid &&
- ((comp -> hardware_addr.htype !=
- lease -> hardware_addr.htype) ||
- (comp -> hardware_addr.hlen !=
- lease -> hardware_addr.hlen) ||
- memcmp (comp -> hardware_addr.haddr,
- lease -> hardware_addr.haddr,
- comp -> hardware_addr.hlen))))) {
- warn ("Lease conflict at %s",
- piaddr (comp -> ip_addr));
- } else {
- /* If there's a Unique ID, dissociate it from the hash
- table if necessary, and always free it. */
- if (comp -> uid) {
- if (comp -> uid_len != lease -> uid_len ||
- memcmp (comp -> uid, lease -> uid,
- comp -> uid_len)) {
- delete_hash_entry (lease_uid_hash,
- comp -> uid,
- comp -> uid_len);
- enter_uid = 1;
- }
- free (comp -> uid);
- } else
- enter_uid = 1;
-
- if (comp -> hardware_addr.htype &&
- ((comp -> hardware_addr.hlen !=
- lease -> hardware_addr.hlen) ||
- (comp -> hardware_addr.htype !=
- lease -> hardware_addr.htype) ||
- memcmp (comp -> hardware_addr.haddr,
- lease -> hardware_addr.haddr,
- comp -> hardware_addr.hlen))) {
- delete_hash_entry (lease_hw_addr_hash,
- comp -> hardware_addr.haddr,
- comp -> hardware_addr.hlen);
- enter_hwaddr = 1;
- } else if (!comp -> hardware_addr.htype)
- enter_hwaddr = 1;
-
- /* Copy the data files, but not the linkages. */
- comp -> starts = lease -> starts;
- comp -> offered_expiry = lease -> offered_expiry;
- comp -> timestamp = lease -> timestamp;
- comp -> uid = lease -> uid;
- comp -> uid_len = lease -> uid_len;
- comp -> host = lease -> host;
- comp -> hardware_addr = lease -> hardware_addr;
- comp -> state = lease -> state;
- comp -> flags = ((lease -> flags & ~PERSISTENT_FLAGS) |
- (comp -> flags & ~EPHEMERAL_FLAGS));
-
- /* Record the lease in the uid hash if necessary. */
- if (enter_uid && lease -> uid) {
- add_hash (lease_uid_hash, comp -> uid,
- comp -> uid_len, (unsigned char *)comp);
- }
-
- /* Record it in the hardware address hash if necessary. */
- if (enter_hwaddr && lease -> hardware_addr.htype) {
- add_hash (lease_hw_addr_hash,
- comp -> hardware_addr.haddr,
- comp -> hardware_addr.hlen,
- (unsigned char *)comp);
- }
-
- /* Remove the lease from its current place in the list. */
- if (comp -> prev) {
- comp -> prev -> next = comp -> next;
- } else {
- comp -> shared_network -> leases = comp -> next;
- }
- if (comp -> next) {
- comp -> next -> prev = comp -> prev;
- }
- if (comp -> shared_network -> last_lease == comp) {
- comp -> shared_network -> last_lease = comp -> prev;
- }
-
- /* Find the last insertion point... */
- if (comp == comp -> shared_network -> insertion_point ||
- !comp -> shared_network -> insertion_point) {
- lp = comp -> shared_network -> leases;
- } else {
- lp = comp -> shared_network -> insertion_point;
- }
-
- if (!lp) {
- /* Nothing on the list yet? Just make comp the
- head of the list. */
- comp -> shared_network -> leases = comp;
- comp -> shared_network -> last_lease = comp;
- } else if (lp -> ends > lease -> ends) {
- /* Skip down the list until we run out of list
- or find a place for comp. */
- while (lp -> next && lp -> ends > lease -> ends) {
- lp = lp -> next;
- }
- if (lp -> ends > lease -> ends) {
- /* If we ran out of list, put comp
- at the end. */
- lp -> next = comp;
- comp -> prev = lp;
- comp -> next = (struct lease *)0;
- comp -> shared_network -> last_lease = comp;
- } else {
- /* If we didn't, put it between lp and
- the previous item on the list. */
- if ((comp -> prev = lp -> prev))
- comp -> prev -> next = comp;
- comp -> next = lp;
- lp -> prev = comp;
- }
- } else {
- /* Skip up the list until we run out of list
- or find a place for comp. */
- while (lp -> prev && lp -> ends < lease -> ends) {
- lp = lp -> prev;
- }
- if (lp -> ends < lease -> ends) {
- /* If we ran out of list, put comp
- at the beginning. */
- lp -> prev = comp;
- comp -> next = lp;
- comp -> prev = (struct lease *)0;
- comp -> shared_network -> leases = comp;
- } else {
- /* If we didn't, put it between lp and
- the next item on the list. */
- if ((comp -> next = lp -> next))
- comp -> next -> prev = comp;
- comp -> prev = lp;
- lp -> next = comp;
- }
- }
- comp -> shared_network -> insertion_point = comp;
- comp -> ends = lease -> ends;
- }
-
- /* Return zero if we didn't commit the lease to permanent storage;
- nonzero if we did. */
- return commit && write_lease (comp) && commit_leases ();
-}
-
-/* Release the specified lease and re-hash it as appropriate. */
-
-void release_lease (lease)
- struct lease *lease;
-{
- struct lease lt;
-
- lt = *lease;
- lt.ends = cur_time;
- supersede_lease (lease, &lt, 1);
-}
-
-/* Abandon the specified lease (set its timeout to infinity and its
- particulars to zero, and re-hash it as appropriate. */
-
-void abandon_lease (lease)
- struct lease *lease;
-{
- struct lease lt;
-
- lt = *lease;
- lt.ends = 0xFFFFFFFF;
- warn ("Abandoning IP address %s\n",
- piaddr (lease -> ip_addr));
- lt.hardware_addr.htype = -1;
- lt.hardware_addr.hlen = 0;
- lt.uid = (unsigned char *)0;
- lt.uid_len = 0;
- supersede_lease (lease, &lt, 1);
-}
-
-/* Locate the lease associated with a given IP address... */
-
-struct lease *find_lease_by_ip_addr (addr)
- struct iaddr addr;
-{
- struct lease *lease = (struct lease *)hash_lookup (lease_ip_addr_hash,
- addr.iabuf,
- addr.len);
- return lease;
-}
-
-struct lease *find_lease_by_uid (uid, len)
- unsigned char *uid;
- int len;
-{
- struct lease *lease = (struct lease *)hash_lookup (lease_uid_hash,
- uid, len);
- return lease;
-}
-
-struct lease *find_lease_by_hw_addr (hwaddr, hwlen)
- unsigned char *hwaddr;
- int hwlen;
-{
- struct lease *lease = (struct lease *)hash_lookup (lease_hw_addr_hash,
- hwaddr, hwlen);
- return lease;
-}
-
-struct class *add_class (type, name)
- int type;
- char *name;
-{
- struct class *class = new_class ("add_class");
- char *tname = (char *)malloc (strlen (name) + 1);
-
- if (!vendor_class_hash)
- vendor_class_hash = new_hash ();
- if (!user_class_hash)
- user_class_hash = new_hash ();
-
- if (!tname || !class || !vendor_class_hash || !user_class_hash)
- return (struct class *)0;
-
- memset (class, 0, sizeof *class);
- strcpy (tname, name);
- class -> name = tname;
- memset (class -> options, 0, sizeof class -> options);
- class -> max_lease_time = class -> default_lease_time = 0;
-
- if (type)
- add_hash (user_class_hash,
- tname, strlen (tname), (unsigned char *)class);
- else
- add_hash (user_class_hash,
- tname, strlen (tname), (unsigned char *)class);
- return class;
-}
-
-struct class *find_class (type, name, len)
- int type;
- char *name;
- int len;
-{
- struct class *class =
- (struct class *)hash_lookup (type
- ? user_class_hash
- : vendor_class_hash, name, len);
- return class;
-}
-
-/* Write all interesting leases to permanent storage. */
-
-void write_leases ()
-{
- struct lease *l;
- struct shared_network *s;
- int i;
-
- for (s = shared_networks; s; s = s -> next) {
- for (l = s -> leases; l; l = l -> next) {
- if (l -> hardware_addr.hlen || l -> uid_len)
- write_lease (l);
- }
- }
- commit_leases ();
-}
-
-void dump_subnets ()
-{
- struct lease *l;
- struct shared_network *s;
- struct subnet *n;
- int i;
-
- for (n = s -> subnets; n; n = n -> next_subnet) {
- debug ("Subnet %s", piaddr (n -> net));
- debug (" netmask %s",
- piaddr (n -> netmask));
- }
- for (l = s -> leases; l; l = l -> next) {
- print_lease (l);
- }
- debug ("Last Lease:");
- print_lease (s -> last_lease);
-}
diff --git a/common/nit.c b/common/nit.c
deleted file mode 100644
index 48c0525e..00000000
--- a/common/nit.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/* nit.c
-
- Network Interface Tap (NIT) network interface code, by Ted Lemon
- with one crucial tidbit of help from Stu Grossmen. */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''. */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#if defined (USE_NIT_SEND) || defined (USE_NIT_RECEIVE)
-#include <sys/ioctl.h>
-#include <sys/uio.h>
-
-#include <sys/time.h>
-#include <net/nit.h>
-#include <net/nit_if.h>
-#include <net/nit_pf.h>
-#include <net/nit_buf.h>
-#include <sys/stropts.h>
-#include <net/packetfilt.h>
-
-#include <netinet/in_systm.h>
-#include "includes/netinet/ip.h"
-#include "includes/netinet/udp.h"
-#include "includes/netinet/if_ether.h"
-
-/* Called by get_interface_list for each interface that's discovered.
- Opens a packet filter for each interface and adds it to the select
- mask. */
-
-int if_register_nit (info, ifp)
- struct interface_info *info;
- struct ifreq *ifp;
-{
- int sock;
- char filename[50];
- struct ifreq ifr;
- struct strioctl sio;
-
- /* Open a NIT device */
- sock = open ("/dev/nit", O_RDWR);
- if (sock < 0)
- error ("Can't open NIT device: %m");
-
- /* Set the NIT device to point at this interface. */
- sio.ic_cmd = NIOCBIND;
- sio.ic_len = sizeof *ifp;
- sio.ic_dp = (char *)ifp;
- if (ioctl (sock, I_STR, &sio) < 0)
- error ("Can't attach interface to nit device: %m");
-
- /* Get the low-level address... */
- sio.ic_cmd = SIOCGIFADDR;
- sio.ic_len = sizeof ifr;
- sio.ic_dp = (char *)&ifr;
- if (ioctl (sock, I_STR, &sio) < 0)
- error ("Can't get physical layer address: %m");
-
- /* XXX code below assumes ethernet interface! */
- info -> hw_address.hlen = 6;
- info -> hw_address.htype = ARPHRD_ETHER;
- memcpy (info -> hw_address.haddr, ifr.ifr_ifru.ifru_addr.sa_data, 6);
-
- if (ioctl (sock, I_PUSH, "pf") < 0)
- error ("Can't push packet filter onto NIT: %m");
-
- return sock;
-}
-#endif /* USE_NIT_SEND || USE_NIT_RECEIVE */
-
-#ifdef USE_NIT_SEND
-void if_register_send (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- /* If we're using the nit API for sending and receiving,
- we don't need to register this interface twice. */
-#ifndef USE_NIT_RECEIVE
- struct packetfilt pf;
- struct strioctl sio;
-
- info -> wfdesc = if_register_nit (info, interface);
-
- pf.Pf_Priority = 0;
- pf.Pf_FilterLen = 1;
- pf.Pf_Filter [0] = ENF_PUSHZERO;
-
- /* Set up an NIT filter that rejects everything... */
- sio.ic_cmd = NIOCSETF;
- sio.ic_len = sizeof pf;
- sio.ic_dp = (char *)&pf;
- if (ioctl (info -> wfdesc, I_STR, &sio) < 0)
- error ("Can't set NIT filter: %m");
-#else
- info -> wfdesc = info -> rfdesc;
-#endif
- note ("Sending on NIT/%s/%s",
- print_hw_addr (info -> hw_address.htype,
- info -> hw_address.hlen,
- info -> hw_address.haddr),
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-#endif /* USE_NIT_SEND */
-
-#ifdef USE_NIT_RECEIVE
-/* Packet filter program...
- XXX Changes to the filter program may require changes to the constant
- offsets used in if_register_send to patch the NIT program! XXX */
-
-void if_register_receive (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- int flag = 1;
- u_int32_t x;
- struct packetfilt pf;
- struct strioctl sio;
- u_int16_t addr [2];
- struct timeval t;
-
- /* Open a NIT device and hang it on this interface... */
- info -> rfdesc = if_register_nit (info, interface);
-
- /* Set the snap length to 0, which means always take the whole
- packet. */
- x = 0;
- if (ioctl (info -> rfdesc, NIOCSSNAP, &x) < 0)
- error ("Can't set NIT snap length: %m");
-
- /* Set the stream to byte stream mode */
- if (ioctl (info -> rfdesc, I_SRDOPT, RMSGN) != 0)
- note ("I_SRDOPT failed: %m");
-
-#if 0
- /* Push on the chunker... */
- if (ioctl (info -> rfdesc, I_PUSH, "nbuf") < 0)
- error ("Can't push chunker onto NIT STREAM: %m");
-
- /* Set the timeout to zero. */
- t.tv_sec = 0;
- t.tv_usec = 0;
- if (ioctl (info -> rfdesc, NIOCSTIME, &t) < 0)
- error ("Can't set chunk timeout: %m");
-#endif
-
- /* Ask for no header... */
- x = 0;
- if (ioctl (info -> rfdesc, NIOCSFLAGS, &x) < 0)
- error ("Can't set NIT flags: %m");
-
- /* Set up the NIT filter program. */
- /* XXX Unlike the BPF filter program, this one won't work if the
- XXX IP packet is fragmented or if there are options on the IP
- XXX header. */
- pf.Pf_Priority = 0;
- pf.Pf_FilterLen = 0;
-
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHWORD + 6;
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHLIT + ENF_CAND;
- pf.Pf_Filter [pf.Pf_FilterLen++] = htons (ETHERTYPE_IP);
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHLIT;
- pf.Pf_Filter [pf.Pf_FilterLen++] = htons (IPPROTO_UDP);
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHWORD + 11;
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHLIT + ENF_AND;
- pf.Pf_Filter [pf.Pf_FilterLen++] = htons (0xFF);
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_CAND;
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHWORD + 18;
- pf.Pf_Filter [pf.Pf_FilterLen++] = ENF_PUSHLIT + ENF_CAND;
- pf.Pf_Filter [pf.Pf_FilterLen++] = server_port;
-
- /* Install the filter... */
- sio.ic_cmd = NIOCSETF;
- sio.ic_len = sizeof pf;
- sio.ic_dp = (char *)&pf;
- if (ioctl (info -> rfdesc, I_STR, &sio) < 0)
- error ("Can't set NIT filter: %m");
-
- note ("Listening on NIT/%s/%s",
- print_hw_addr (info -> hw_address.htype,
- info -> hw_address.hlen,
- info -> hw_address.haddr),
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-#endif /* USE_NIT_RECEIVE */
-
-#ifdef USE_NIT_SEND
-size_t send_packet (interface, packet, raw, len, from, to, hto)
- struct interface_info *interface;
- struct packet *packet;
- struct dhcp_packet *raw;
- size_t len;
- struct in_addr from;
- struct sockaddr_in *to;
- struct hardware *hto;
-{
- int bufp;
- unsigned char buf [1536 + sizeof (struct sockaddr)];
- struct sockaddr *junk;
- struct strbuf ctl, data;
- int hw_end;
- struct sockaddr_in foo;
-
- /* Start with the sockaddr struct... */
- junk = (struct sockaddr *)&buf [0];
- bufp = ((unsigned char *)&junk -> sa_data [0]) - &buf [0];
-
- /* Assemble the headers... */
- assemble_hw_header (interface, buf, &bufp, hto);
- hw_end = bufp;
- assemble_udp_ip_header (interface, buf, &bufp, from.s_addr,
- to -> sin_addr.s_addr, to -> sin_port,
- raw, len);
-
- /* Copy the data into the buffer (yuk). */
- memcpy (buf + bufp, raw, len);
-
- /* Set up the sockaddr structure... */
-#if USE_SIN_LEN
- junk -> sa_len = hw_end - 2; /* XXX */
-#endif
- junk -> sa_family = AF_UNSPEC;
-
-#if 0 /* Already done. */
- memcpy (junk.sa_data, buf, hw_len);
-#endif
-
- /* Set up the msg_buf structure... */
- ctl.buf = (char *)&buf [0];
- ctl.maxlen = ctl.len = hw_end;
- data.buf = (char *)&buf [hw_end];
- data.maxlen = data.len = bufp + len - hw_end;
-
- return putmsg (interface -> wfdesc, &ctl, &data, 0);
-}
-#endif /* USE_NIT_SEND */
-
-#ifdef USE_NIT_RECEIVE
-size_t receive_packet (interface, buf, len, from, hfrom)
- struct interface_info *interface;
- unsigned char *buf;
- size_t len;
- struct sockaddr_in *from;
- struct hardware *hfrom;
-{
- int nread;
- int length = 0;
- int offset = 0;
- unsigned char ibuf [1536];
- int bufix = 0;
-
- length = read (interface -> rfdesc, ibuf, sizeof ibuf);
- if (length <= 0)
- return length;
-
- /* Decode the physical header... */
- offset = decode_hw_header (interface, ibuf, bufix, hfrom);
-
- /* If a physical layer checksum failed (dunno of any
- physical layer that supports this, but WTH), skip this
- packet. */
- if (offset < 0) {
- return 0;
- }
-
- bufix += offset;
- length -= offset;
-
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header (interface, ibuf, bufix,
- from, (unsigned char *)0, length);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0)
- return 0;
-
- bufix += offset;
- length -= offset;
-
- /* Copy out the data in the packet... */
- memcpy (buf, &ibuf [bufix], length);
- return length;
-}
-#endif
diff --git a/common/options.c b/common/options.c
deleted file mode 100644
index 354c10a4..00000000
--- a/common/options.c
+++ /dev/null
@@ -1,520 +0,0 @@
-/* options.c
-
- DHCP options parsing and reassembly. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#define DHCP_OPTION_DATA
-#include "dhcpd.h"
-
-/* Parse all available options out of the specified packet. */
-
-void parse_options (packet)
- struct packet *packet;
-{
- /* Initially, zero all option pointers. */
- memset (packet -> options, 0, sizeof (packet -> options));
-
- /* If we don't see the magic cookie, there's nothing to parse. */
- if (memcmp (packet -> raw -> options, DHCP_OPTIONS_COOKIE, 4)) {
- packet -> options_valid = 0;
- return;
- }
-
- /* Go through the options field, up to the end of the packet
- or the End field. */
- parse_option_buffer (packet, &packet -> raw -> options [4],
- packet -> packet_length - DHCP_FIXED_NON_UDP + 4);
- /* If we parsed a DHCP Option Overload option, parse more
- options out of the buffer(s) containing them. */
- if (packet -> options_valid
- && packet -> options [DHO_DHCP_OPTION_OVERLOAD].data) {
- if (packet -> options [DHO_DHCP_OPTION_OVERLOAD].data [0] & 1)
- parse_option_buffer (packet,
- packet -> raw -> file,
- sizeof packet -> raw -> file);
- if (packet -> options [DHO_DHCP_OPTION_OVERLOAD].data [0] & 2)
- parse_option_buffer (packet,
- packet -> raw -> sname,
- sizeof packet -> raw -> sname);
- }
-}
-
-/* Parse options out of the specified buffer, storing addresses of option
- values in packet -> options and setting packet -> options_valid if no
- errors are encountered. */
-
-void parse_option_buffer (packet, buffer, length)
- struct packet *packet;
- unsigned char *buffer;
- int length;
-{
- unsigned char *s, *t;
- unsigned char *end = buffer + length;
- int len;
- int code;
-
- for (s = buffer; *s != DHO_END && s < end; ) {
- code = s [0];
- /* Pad options don't have a length - just skip them. */
- if (code == DHO_PAD) {
- ++s;
- continue;
- }
- /* All other fields (except end, see above) have a
- one-byte length. */
- len = s [1];
-
- /* If the length is outrageous, the options are bad. */
- if (s + len + 2 > end) {
- warn ("Option %s length %d overflows input buffer.",
- dhcp_options [code].name,
- len);
- packet -> options_valid = 0;
- return;
- }
- /* If we haven't seen this option before, just make
- space for it and copy it there. */
- if (!packet -> options [code].data) {
- if (!(t = (unsigned char *)malloc (len + 1)))
- error ("Can't allocate storage for option %s.",
- dhcp_options [code].name);
- /* Copy and NUL-terminate the option (in case it's an
- ASCII string. */
- memcpy (t, &s [2], len);
- t [len] = 0;
- packet -> options [code].len = len;
- packet -> options [code].data = t;
- } else {
- /* If it's a repeat, concatenate it to whatever
- we last saw. This is really only required
- for clients, but what the heck... */
- t = (unsigned char *)
- malloc (len + packet -> options [code].len);
- if (!t)
- error ("Can't expand storage for option %s.",
- dhcp_options [code].name);
- memcpy (t, packet -> options [code].data,
- packet -> options [code].len);
- memcpy (t + packet -> options [code].len,
- &s [2], len);
- packet -> options [code].len += len;
- t [packet -> options [code].len] = 0;
- free (packet -> options [code].data);
- packet -> options [code].data = t;
- }
- s += len + 2;
- }
- packet -> options_valid = 1;
-}
-
-/* cons options into a big buffer, and then split them out into the
- three seperate buffers if needed. This allows us to cons up a set
- of vendor options using the same routine. */
-
-void cons_options (inpacket, outpacket, options, overload)
- struct packet *inpacket;
- struct packet *outpacket;
- struct tree_cache **options;
- int overload; /* Overload flags that may be set. */
-{
- unsigned char priority_list [300];
- int priority_len;
- unsigned char buffer [4096]; /* Really big buffer... */
- int main_buffer_size;
- int mainbufix, bufix;
- int option_size;
- int result;
- int i;
-
- /* If the client has provided a maximum DHCP message size,
- use that. Otherwise, we use the default MTU size (576 bytes). */
- /* XXX Maybe it would be safe to assume that we can send a packet
- to the client that's as big as the one it sent us, even if it
- didn't specify a large MTU. */
- if (inpacket && inpacket -> options [DHO_DHCP_MAX_MESSAGE_SIZE].data) {
- main_buffer_size =
- (getUShort (inpacket -> options
- [DHO_DHCP_MAX_MESSAGE_SIZE].data)
- - DHCP_FIXED_LEN);
- /* Enforce a minimum packet size... */
- if (main_buffer_size < (576 - DHCP_FIXED_LEN))
- main_buffer_size = 576 - DHCP_FIXED_LEN;
- } else
- main_buffer_size = 576 - DHCP_FIXED_LEN;
-
- /* Preload the option priority list with mandatory options. */
- priority_len = 0;
- priority_list [priority_len++] = DHO_DHCP_MESSAGE_TYPE;
- priority_list [priority_len++] = DHO_DHCP_SERVER_IDENTIFIER;
- priority_list [priority_len++] = DHO_DHCP_LEASE_TIME;
- priority_list [priority_len++] = DHO_DHCP_MESSAGE;
-
- /* If the client has provided a list of options that it wishes
- returned, use it to prioritize. Otherwise, prioritize
- based on the default priority list. */
-
- if (inpacket &&
- inpacket -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].data) {
- memcpy (&priority_list [priority_len],
- inpacket -> options
- [DHO_DHCP_PARAMETER_REQUEST_LIST].data,
- inpacket -> options
- [DHO_DHCP_PARAMETER_REQUEST_LIST].len);
- priority_len +=
- inpacket -> options
- [DHO_DHCP_PARAMETER_REQUEST_LIST].len;
- } else {
- memcpy (&priority_list [priority_len],
- dhcp_option_default_priority_list,
- sizeof_dhcp_option_default_priority_list);
- priority_len += sizeof_dhcp_option_default_priority_list;
- }
-
- /* Copy the options into the big buffer... */
- option_size = store_options (buffer,
- (main_buffer_size - 7 +
- ((overload & 1) ? DHCP_FILE_LEN : 0) +
- ((overload & 2) ? DHCP_SNAME_LEN : 0)),
- options, priority_list, priority_len,
- main_buffer_size,
- (main_buffer_size +
- ((overload & 1) ? DHCP_FILE_LEN : 0)));
-
- /* Put the cookie up front... */
- memcpy (outpacket -> raw -> options, DHCP_OPTIONS_COOKIE, 4);
- mainbufix = 4;
-
- /* If we're going to have to overload, store the overload
- option at the beginning. If we can, though, just store the
- whole thing in the packet's option buffer and leave it at
- that. */
- if (option_size <= main_buffer_size - mainbufix) {
- memcpy (&outpacket -> raw -> options [mainbufix],
- buffer, option_size);
- mainbufix += option_size;
- if (mainbufix < main_buffer_size)
- outpacket -> raw -> options [mainbufix++]
- = DHO_END;
- outpacket -> packet_length = DHCP_FIXED_NON_UDP + mainbufix;
- } else {
- outpacket -> raw -> options [mainbufix++] =
- DHO_DHCP_OPTION_OVERLOAD;
- outpacket -> raw -> options [mainbufix++] = 1;
- if (option_size > main_buffer_size - mainbufix + DHCP_FILE_LEN)
- outpacket -> raw -> options [mainbufix++] = 3;
- else
- outpacket -> raw -> options [mainbufix++] = 1;
-
- memcpy (&outpacket -> raw -> options [mainbufix],
- buffer, main_buffer_size - mainbufix);
- bufix = main_buffer_size - mainbufix;
- outpacket -> packet_length = DHCP_FIXED_NON_UDP + mainbufix;
- if (overload & 1) {
- if (option_size - bufix <= DHCP_FILE_LEN) {
- memcpy (outpacket -> raw -> file,
- &buffer [bufix], option_size - bufix);
- mainbufix = option_size - bufix;
- if (mainbufix < DHCP_FILE_LEN)
- outpacket -> raw -> file [mainbufix++]
- = DHO_END;
- while (mainbufix < DHCP_FILE_LEN)
- outpacket -> raw -> file [mainbufix++]
- = DHO_PAD;
- } else {
- memcpy (outpacket -> raw -> file,
- &buffer [bufix], DHCP_FILE_LEN);
- bufix += DHCP_FILE_LEN;
- }
- }
- if ((overload & 2) && option_size < bufix) {
- memcpy (outpacket -> raw -> sname,
- &buffer [bufix], option_size - bufix);
-
- mainbufix = option_size - bufix;
- if (mainbufix < DHCP_SNAME_LEN)
- outpacket -> raw -> file [mainbufix++]
- = DHO_END;
- while (mainbufix < DHCP_SNAME_LEN)
- outpacket -> raw -> file [mainbufix++]
- = DHO_PAD;
- }
- }
- return;
-}
-
-/* Store all the requested options into the requested buffer. */
-
-int store_options (buffer, buflen, options, priority_list, priority_len,
- first_cutoff, second_cutoff)
- unsigned char *buffer;
- int buflen;
- struct tree_cache **options;
- unsigned char *priority_list;
- int priority_len;
- int first_cutoff, second_cutoff;
-{
- int bufix = 0;
- int option_stored [256];
- int missed = 0;
- int missed_code = 0;
- int missed_length = 0;
- int result;
- int i;
- int ix;
-
- /* Zero out the stored-lengths array. */
- memset (option_stored, 0, sizeof option_stored);
-
- /* Copy out the options in the order that they appear in the
- priority list... */
- for (i = 0; i < priority_len; i++) {
- /* Code for next option to try to store. */
- int code = priority_list [i];
- int optstart;
-
- /* Number of bytes left to store (some may already
- have been stored by a previous pass). */
- int length;
-
- /* If no data is available for this option, skip it. */
- if (!options [code]) {
- continue;
- }
-
- /* The client could ask for things that are mandatory,
- in which case we should avoid storing them twice... */
- if (option_stored [code])
- continue;
- option_stored [code] = 1;
-
- /* Find the value of the option... */
- if (!tree_evaluate (options [code])) {
- continue;
- }
-
- /* We should now have a constant length for the option. */
- length = options [code] -> len;
-
- /* Try to store the option. */
-
- /* If the option's length is more than 255, we must store it
- in multiple hunks. Store 255-byte hunks first. However,
- in any case, if the option data will cross a buffer
- boundary, split it across that boundary. */
-
- ix = 0;
-
- optstart = bufix;
- while (length) {
- unsigned char incr = length > 255 ? 255 : length;
-
- /* If this hunk of the buffer will cross a
- boundary, only go up to the boundary in this
- pass. */
- if (bufix < first_cutoff &&
- bufix + incr > first_cutoff)
- incr = first_cutoff - bufix;
- else if (bufix < second_cutoff &&
- bufix + incr > second_cutoff)
- incr = second_cutoff - bufix;
-
- /* If this option is going to overflow the buffer,
- skip it. */
- if (bufix + 2 + incr > buflen) {
- bufix = optstart;
- break;
- }
-
- /* Everything looks good - copy it in! */
- buffer [bufix] = code;
- buffer [bufix + 1] = incr;
- memcpy (buffer + bufix + 2,
- options [code] -> value + ix, incr);
- length -= incr;
- ix += incr;
- bufix += 2 + incr;
- }
- }
- return bufix;
-}
-
-/* Format the specified option so that a human can easily read it. */
-
-char *pretty_print_option (code, data, len)
- unsigned char code;
- unsigned char *data;
- int len;
-{
- static char optbuf [32768]; /* XXX */
- int hunksize = 0;
- int numhunk = -1;
- int numelem = 0;
- char fmtbuf [32];
- int i, j;
- char *op = optbuf;
- unsigned char *dp = data;
- struct in_addr foo;
-
- /* Figure out the size of the data. */
- for (i = 0; dhcp_options [code].format [i]; i++) {
- if (!numhunk) {
- warn ("%s: Excess information in format string: %s\n",
- dhcp_options [code].name,
- &(dhcp_options [code].format [i]));
- break;
- }
- numelem++;
- fmtbuf [i] = dhcp_options [code].format [i];
- switch (dhcp_options [code].format [i]) {
- case 'A':
- --numelem;
- fmtbuf [i] = 0;
- numhunk = 0;
- break;
- case 't':
- fmtbuf [i] = 't';
- fmtbuf [i + 1] = 0;
- numhunk = -2;
- break;
- case 'I':
- case 'l':
- case 'L':
- hunksize += 4;
- break;
- case 's':
- case 'S':
- hunksize += 2;
- break;
- case 'b':
- case 'B':
- case 'f':
- hunksize++;
- break;
- case 'e':
- break;
- default:
- warn ("%s: garbage in format string: %s\n",
- dhcp_options [code].name,
- &(dhcp_options [code].format [i]));
- break;
- }
- }
-
- /* Check for too few bytes... */
- if (hunksize > len) {
- warn ("%s: expecting at least %d bytes; got %d",
- dhcp_options [code].name,
- hunksize, len);
- return "<error>";
- }
- /* Check for too many bytes... */
- if (numhunk == -1 && hunksize < len)
- warn ("%s: %d extra bytes",
- dhcp_options [code].name,
- len - hunksize);
-
- /* If this is an array, compute its size. */
- if (!numhunk)
- numhunk = len / hunksize;
- /* See if we got an exact number of hunks. */
- if (numhunk > 0 && numhunk * hunksize < len)
- warn ("%s: %d extra bytes at end of array\n",
- dhcp_options [code].name,
- len - numhunk * hunksize);
-
- /* A one-hunk array prints the same as a single hunk. */
- if (numhunk < 0)
- numhunk = 1;
-
- /* Cycle through the array (or hunk) printing the data. */
- for (i = 0; i < numhunk; i++) {
- for (j = 0; j < numelem; j++) {
- switch (fmtbuf [j]) {
- case 't':
- strcpy (op, dp);
- break;
- case 'I':
- foo.s_addr = htonl (getULong (dp));
- strcpy (op, inet_ntoa (foo));
- dp += 4;
- break;
- case 'l':
- sprintf (op, "%ld", getLong (dp));
- dp += 4;
- break;
- case 'L':
- sprintf (op, "%ld", getULong (dp));
- dp += 4;
- break;
- case 's':
- sprintf (op, "%d", getShort (dp));
- dp += 2;
- break;
- case 'S':
- sprintf (op, "%d", getUShort (dp));
- dp += 2;
- break;
- case 'b':
- sprintf (op, "%d", *(char *)dp++);
- break;
- case 'B':
- sprintf (op, "%d", *dp++);
- break;
- case 'f':
- strcpy (op, *dp++ ? "true" : "false");
- break;
- default:
- warn ("Unexpected format code %c", fmtbuf [j]);
- }
- op += strlen (op);
- *op++ = ' ';
- }
- }
- *--op = 0;
- return optbuf;
-}
-
-
-
diff --git a/common/packet.c b/common/packet.c
deleted file mode 100644
index e5b57528..00000000
--- a/common/packet.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* packet.c
-
- Packet assembly code, originally contributed by Archie Cobbs. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#if defined (PACKET_ASSEMBLY) || defined (PACKET_DECODING)
-#include <netinet/in_systm.h>
-#include "includes/netinet/ip.h"
-#include "includes/netinet/udp.h"
-#include "includes/netinet/if_ether.h"
-
-static u_int32_t checksum PROTO ((unsigned char *, int, u_int32_t));
-static u_int32_t wrapsum PROTO ((u_int32_t));
-
-/* Compute the easy part of the checksum on a range of bytes. */
-
-static u_int32_t checksum (buf, nbytes, sum)
- unsigned char *buf;
- int nbytes;
- u_int32_t sum;
-{
- int i;
-
-#ifdef DEBUG_CHECKSUM
- debug ("checksum (%x %d %x)", buf, nbytes, sum);
-#endif
-
- /* Checksum all the pairs of bytes first... */
- for (i = 0; i < (nbytes & ~1); i += 2) {
-#ifdef DEBUG_CHECKSUM_VERBOSE
- debug ("sum = %x", sum);
-#endif
- sum += (u_int16_t) ntohs(*((u_int16_t *)buf)++);
- }
-
- /* If there's a single byte left over, checksum it, too. Network
- byte order is big-endian, so the remaining byte is the high byte. */
- if (i < nbytes) {
-#ifdef DEBUG_CHECKSUM_VERBOSE
- debug ("sum = %x", sum);
-#endif
- sum += (*buf) << 8;
- }
-
- return sum;
-}
-
-/* Fold the upper sixteen bits of the checksum down into the lower bits,
- complement the sum, and then put it into network byte order. */
-
-static u_int32_t wrapsum (sum)
- u_int32_t sum;
-{
-#ifdef DEBUG_CHECKSUM
- debug ("wrapsum (%x)", sum);
-#endif
-
- while (sum > 0x10000) {
- sum = (sum >> 16) + (sum & 0xFFFF);
-#ifdef DEBUG_CHECKSUM_VERBOSE
- debug ("sum = %x", sum);
-#endif
- sum += (sum >> 16);
-#ifdef DEBUG_CHECKSUM_VERBOSE
- debug ("sum = %x", sum);
-#endif
- }
- sum = sum ^ 0xFFFF;
-#ifdef DEBUG_CHECKSUM_VERBOSE
- debug ("sum = %x", sum);
-#endif
-
-#ifdef DEBUG_CHECKSUM
- debug ("wrapsum returns %x", htons (sum));
-#endif
- return htons(sum);
-}
-#endif /* PACKET_ASSEMBLY || PACKET_DECODING */
-
-#ifdef PACKET_ASSEMBLY
-/* Assemble an hardware header... */
-/* XXX currently only supports ethernet; doesn't check for other types. */
-
-void assemble_hw_header (interface, buf, bufix, to)
- struct interface_info *interface;
- unsigned char *buf;
- int *bufix;
- struct hardware *to;
-{
- struct ether_header eh;
-
- if (to)
- memcpy (eh.ether_dhost, to -> haddr, sizeof eh.ether_dhost);
- else
- memset (eh.ether_dhost, 0xff, sizeof (eh.ether_dhost));
- if (interface -> hw_address.hlen == sizeof (eh.ether_shost))
- memcpy (eh.ether_shost, interface -> hw_address.haddr,
- sizeof (eh.ether_shost));
- else
- memset (eh.ether_shost, 0x00, sizeof (eh.ether_shost));
- eh.ether_type = htons (ETHERTYPE_IP);
-
- memcpy (&buf [*bufix], &eh, sizeof eh);
- *bufix += sizeof eh;
-}
-
-/* UDP header and IP header assembled together for convenience. */
-
-void assemble_udp_ip_header (interface, buf, bufix,
- from, to, port, data, len)
- struct interface_info *interface;
- unsigned char *buf;
- int *bufix;
- u_int32_t from;
- u_int32_t to;
- u_int16_t port;
- unsigned char *data;
- int len;
-{
- struct ip ip;
- struct udphdr udp;
-
- /* Fill out the IP header */
- ip.ip_v = 4;
- ip.ip_hl = 5;
- ip.ip_tos = IPTOS_LOWDELAY;
- ip.ip_len = htons(sizeof(ip) + sizeof(udp) + len);
- ip.ip_id = 0;
- ip.ip_off = 0;
- ip.ip_ttl = 16;
- ip.ip_p = IPPROTO_UDP;
- ip.ip_sum = 0;
- ip.ip_src.s_addr = from;
- ip.ip_dst.s_addr = to;
-
- /* Checksum the IP header... */
- ip.ip_sum = wrapsum (checksum ((unsigned char *)&ip, sizeof ip, 0));
-
- /* Copy the ip header into the buffer... */
- memcpy (&buf [*bufix], &ip, sizeof ip);
- *bufix += sizeof ip;
-
- /* Fill out the UDP header */
- udp.uh_sport = server_port; /* XXX */
- udp.uh_dport = port; /* XXX */
- udp.uh_ulen = htons(sizeof(udp) + len);
- memset (&udp.uh_sum, 0, sizeof udp.uh_sum);
-
- /* Compute UDP checksums, including the ``pseudo-header'', the UDP
- header and the data. */
-
-#if 0
- udp.uh_sum =
- wrapsum (checksum ((unsigned char *)&udp, sizeof udp,
- checksum (data, len,
- checksum ((unsigned char *)
- &ip.ip_src,
- sizeof ip.ip_src,
- IPPROTO_UDP +
- (u_int32_t)
- ntohs (udp.uh_ulen)))));
-#endif
-
- /* Copy the udp header into the buffer... */
- memcpy (&buf [*bufix], &udp, sizeof udp);
- *bufix += sizeof udp;
-}
-#endif /* PACKET_ASSEMBLY */
-
-#ifdef PACKET_DECODING
-/* Decode a hardware header... */
-/* XXX currently only supports ethernet; doesn't check for other types. */
-
-size_t decode_hw_header (interface, buf, bufix, from)
- struct interface_info *interface;
- unsigned char *buf;
- int bufix;
- struct hardware *from;
-{
- struct ether_header eh;
-
- memcpy (&eh, buf + bufix, sizeof eh);
-
-#ifdef USERLAND_FILTER
- if (ntohs (eh.ether_type) != ETHERTYPE_IP)
- return -1;
-#endif
- memcpy (from -> haddr, eh.ether_shost, sizeof (eh.ether_shost));
- from -> htype = ARPHRD_ETHER;
- from -> hlen = sizeof eh.ether_shost;
-
- return sizeof eh;
-}
-
-/* UDP header and IP header decoded together for convenience. */
-
-size_t decode_udp_ip_header (interface, buf, bufix, from, data, len)
- struct interface_info *interface;
- unsigned char *buf;
- int bufix;
- struct sockaddr_in *from;
- unsigned char *data;
- int len;
-{
- struct ip *ip;
- struct udphdr *udp;
- u_int32_t ip_len = (buf [bufix] & 0xf) << 2;
- u_int32_t sum, usum;
-
- ip = (struct ip *)(buf + bufix);
- udp = (struct udphdr *)(buf + bufix + ip_len);
-
-#ifdef USERLAND_FILTER
- /* Is it a UDP packet? */
- if (ip -> ip_p != IPPROTO_UDP)
- return -1;
-
- /* Is it to the port we're serving? */
- if (udp -> uh_dport != server_port)
- return -1;
-#endif /* USERLAND_FILTER */
-
- /* Check the IP header checksum - it should be zero. */
- if (wrapsum (checksum (buf + bufix, ip_len, 0))) {
- note ("Bad IP checksum: %x",
- wrapsum (checksum (buf + bufix, sizeof *ip, 0)));
- return -1;
- }
-
- /* Copy out the IP source address... */
- memcpy (&from -> sin_addr, &ip -> ip_src, 4);
-
- /* Compute UDP checksums, including the ``pseudo-header'', the UDP
- header and the data. If the UDP checksum field is zero, we're
- not supposed to do a checksum. */
-
- if (!data) {
- data = buf + bufix + ip_len + sizeof *udp;
- len -= ip_len + sizeof *udp;
- }
-
-#if 0
- usum = udp -> uh_sum;
- udp -> uh_sum = 0;
-
- sum = wrapsum (checksum ((unsigned char *)udp, sizeof *udp,
- checksum (data, len,
- checksum ((unsigned char *)
- &ip -> ip_src,
- sizeof ip -> ip_src,
- IPPROTO_UDP +
- (u_int32_t)
- ntohs (udp -> uh_ulen)))));
-
- if (usum && usum != sum) {
- note ("Bad udp checksum: %x %x", usum, sum);
- return -1;
- }
-#endif
-
- /* Copy out the port... */
- memcpy (&from -> sin_port, &udp -> uh_sport, sizeof udp -> uh_sport);
-
- return ip_len + sizeof *udp;
-}
-#endif /* PACKET_DECODING */
diff --git a/common/print.c b/common/print.c
deleted file mode 100644
index 56463905..00000000
--- a/common/print.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* print.c
-
- Turn data structures into printable text. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-char *print_hw_addr (htype, hlen, data)
- int htype;
- int hlen;
- unsigned char *data;
-{
- static char habuf [49];
- char *s;
- int i;
-
- if (htype == 0 || hlen == 0) {
- strcpy (habuf, "<null>");
- } else {
- s = habuf;
- for (i = 0; i < hlen; i++) {
- sprintf (s, "%x", data [i]);
- s += strlen (s);
- *s++ = ':';
- }
- *--s = 0;
- }
- return habuf;
-}
-
-void print_lease (lease)
- struct lease *lease;
-{
- struct tm *t;
- char tbuf [32];
-
- debug (" Lease %s",
- piaddr (lease -> ip_addr));
-
- t = gmtime (&lease -> starts);
- strftime (tbuf, sizeof tbuf, "%D %H:%M:%S", t);
- debug (" start %s", tbuf);
-
- t = gmtime (&lease -> ends);
- strftime (tbuf, sizeof tbuf, "%D %H:%M:%S", t);
- debug (" end %s", tbuf);
-
- t = gmtime (&lease -> timestamp);
- strftime (tbuf, sizeof tbuf, "%D %H:%M:%S", t);
- debug (" stamp %s", tbuf);
-
- debug (" hardware addr = %s",
- print_hw_addr (lease -> hardware_addr.htype,
- lease -> hardware_addr.hlen,
- lease -> hardware_addr.haddr));
- debug (" host %s state %x",
- lease -> host ? lease -> host -> name : "<none>",
- lease -> state);
-}
-
-void dump_packet (tp)
- struct packet *tp;
-{
- struct dhcp_packet *tdp = tp -> raw;
-
- debug ("packet length %d", tp -> packet_length);
- debug ("op = %d htype = %d hlen = %d hops = %d",
- tdp -> op, tdp -> htype, tdp -> hlen, tdp -> hops);
- debug ("xid = %x secs = %d flags = %x",
- tdp -> xid, tdp -> secs, tdp -> flags);
- debug ("ciaddr = %s", inet_ntoa (tdp -> ciaddr));
- debug ("yiaddr = %s", inet_ntoa (tdp -> yiaddr));
- debug ("siaddr = %s", inet_ntoa (tdp -> siaddr));
- debug ("giaddr = %s", inet_ntoa (tdp -> giaddr));
- debug ("chaddr = %02.2x:%02.2x:%02.2x:%02.2x:%02.2x:%02.2x",
- ((unsigned char *)(tdp -> chaddr)) [0],
- ((unsigned char *)(tdp -> chaddr)) [1],
- ((unsigned char *)(tdp -> chaddr)) [2],
- ((unsigned char *)(tdp -> chaddr)) [3],
- ((unsigned char *)(tdp -> chaddr)) [4],
- ((unsigned char *)(tdp -> chaddr)) [5]);
- debug ("filename = %s", tdp -> file);
- debug ("server_name = %s", tdp -> sname);
- if (tp -> options_valid) {
- int i;
-
- for (i = 0; i < 256; i++) {
- if (tp -> options [i].data)
- debug (" %s = %s",
- dhcp_options [i].name,
- pretty_print_option
- (i, tp -> options [i].data,
- tp -> options [i].len));
- }
- }
- debug ("");
-}
-
-void dump_raw (buf, len)
- unsigned char *buf;
- int len;
-{
- int i;
- char lbuf [80];
- int lbix = 0;
-
- for (i = 0; i < len; i++) {
- if ((i & 15) == 0) {
- if (lbix)
- note (lbuf);
- sprintf (lbuf, "%03x:", i);
- lbix = 4;
- } else if ((i & 7) == 0)
- lbuf [lbix++] = ' ';
- sprintf (&lbuf [lbix], " %02x", buf [i]);
- lbix += 3;
- }
- note (lbuf);
-}
-
-void hash_dump (table)
- struct hash_table *table;
-{
- int i;
- struct hash_bucket *bp;
-
- if (!table)
- return;
-
- for (i = 0; i < table -> hash_count; i++) {
- if (!table -> buckets [i])
- continue;
- note ("hash bucket %d:", i);
- for (bp = table -> buckets [i]; bp; bp = bp -> next) {
- if (bp -> len)
- dump_raw (bp -> name, bp -> len);
- else
- note (bp -> name);
- }
- }
-}
-
diff --git a/common/raw.c b/common/raw.c
deleted file mode 100644
index 36a0d5e2..00000000
--- a/common/raw.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/* socket.c
-
- BSD raw socket interface code... */
-
-/* XXX
-
- It's not clear how this should work, and that lack of clarity is
- terribly detrimental to the NetBSD 1.1 kernel - it crashes and
- burns.
-
- Using raw sockets ought to be a big win over using BPF or something
- like it, because you don't need to deal with the complexities of
- the physical layer, but it appears not to be possible with existing
- raw socket implementations. This may be worth revisiting in the
- future. For now, this code can probably be considered a curiosity.
- Sigh. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''. */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include <sys/uio.h>
-
-#if defined (USE_RAW_SEND)
-/* Generic interface registration routine... */
-void if_register_send (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- struct sockaddr_in name;
- int sock;
- struct socklist *tmp;
- int flag;
-
- /* Set up the address we're going to connect to. */
- name.sin_family = AF_INET;
- name.sin_port = server_port;
- name.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- memset (name.sin_zero, 0, sizeof (name.sin_zero));
-
- /* List addresses on which we're listening. */
- note ("Sending on %s, port %d",
- piaddr (info -> address), htons (server_port));
- if ((sock = socket (AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
- error ("Can't create dhcp socket: %m");
-
- /* Set the BROADCAST option so that we can broadcast DHCP responses. */
- flag = 1;
- if (setsockopt (sock, SOL_SOCKET, SO_BROADCAST,
- &flag, sizeof flag) < 0)
- error ("Can't set SO_BROADCAST option on dhcp socket: %m");
-
- /* Set the IP_HDRINCL flag so that we can supply our own IP
- headers... */
- if (setsockopt (sock, IPPROTO_IP, IP_HDRINCL, &flag, sizeof flag) < 0)
- error ("Can't set IP_HDRINCL flag: %m");
-
- info -> wfdesc = sock;
- note ("Sending on Raw/%s/%s",
- info -> name,
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-
-size_t send_packet (interface, packet, raw, len, from, to, hto)
- struct interface_info *interface;
- struct packet *packet;
- struct dhcp_packet *raw;
- size_t len;
- struct in_addr from;
- struct sockaddr_in *to;
- struct hardware *hto;
-{
- unsigned char buf [256];
- int bufp = 0;
- struct iovec iov [2];
-
- /* Assemble the headers... */
- assemble_udp_ip_header (interface, buf, &bufp, from.s_addr,
- to -> sin_addr.s_addr, to -> sin_port,
- (unsigned char *)raw, len);
-
- /* Fire it off */
- iov [0].iov_base = (char *)buf;
- iov [0].iov_len = bufp;
- iov [1].iov_base = (char *)raw;
- iov [1].iov_len = len;
-
- return writev(interface -> wfdesc, iov, 2);
-}
-#endif /* USE_SOCKET_SEND */
diff --git a/common/socket.c b/common/socket.c
deleted file mode 100644
index bb447527..00000000
--- a/common/socket.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* socket.c
-
- BSD socket interface code... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-#ifdef USE_SOCKET_FALLBACK
-# define USE_SOCKET_SEND
-# define if_register_send if_register_fallback
-# define send_packet send_fallback
-#endif
-
-#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
-/* Generic interface registration routine... */
-int if_register_socket (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- struct sockaddr_in name;
- int sock;
- struct socklist *tmp;
- int flag;
- static int once = 0;
-
- /* Make sure only one interface is registered. */
- if (once)
- error ("The standard socket API can only support %s%s%s%s%s",
- "hosts with a single network interface. If you must ",
- "run dhcpd on a host with multiple interfaces, ",
- "you must compile in BPF or NIT support. If neither ",
- "option is supported on your system, please let us ",
- "know.");
-
- /* Technically, we need to know what interface every packet
- comes in on, which means that we can only operate on a
- machine with a single interface configured. However,
- we generally don't expect to get broadcast packets on
- point-to-point interfaces, so we can bend the rules a bit
- and not count them. This won't allow DHCP-over-PPP,
- but it's probably right in a lot of cases, and the issue
- will have to be revisited when DHCP-over-PPP support is
- done. Currently we determine whether an interface is
- point-to-point by seeing if it has a link-level address.
- This only works on 4.4BSD and derivative networking. */
-#ifdef AF_LINK
- if (info -> hw_address.hlen) /* XXX */
-#endif
- once = 1;
-
- /* Set up the address we're going to bind to. */
- name.sin_family = AF_INET;
- name.sin_port = server_port;
- name.sin_addr.s_addr = INADDR_ANY;
- memset (name.sin_zero, 0, sizeof (name.sin_zero));
-
- /* Make a socket... */
- if ((sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
- error ("Can't create dhcp socket: %m");
-
- /* Set the REUSEADDR option so that we don't fail to start if
- we're being restarted. */
- flag = 1;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
- (char *)&flag, sizeof flag) < 0)
- error ("Can't set SO_REUSEADDR option on dhcp socket: %m");
-
- /* Set the BROADCAST option so that we can broadcast DHCP responses. */
- if (setsockopt (sock, SOL_SOCKET, SO_BROADCAST,
- (char *)&flag, sizeof flag) < 0)
- error ("Can't set SO_BROADCAST option on dhcp socket: %m");
-
- /* Bind the socket to this interface's IP address. */
- if (bind (sock, (struct sockaddr *)&name, sizeof name) < 0)
- error ("Can't bind to dhcp address: %m");
-
- return sock;
-}
-#endif /* USE_SOCKET_SEND || USE_SOCKET_RECEIVE */
-
-#ifdef USE_SOCKET_SEND
-void if_register_send (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-
-{
-#ifndef USE_SOCKET_RECEIVE
- info -> wfdesc = if_register_socket (info, interface);
-#else
- info -> wfdesc = info -> rfdesc;
-#endif
- note ("Sending on Socket/%s/%s",
- info -> name,
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-
-}
-#endif /* USE_SOCKET_SEND */
-
-#ifdef USE_SOCKET_RECEIVE
-void if_register_receive (info, interface)
- struct interface_info *info;
- struct ifreq *interface;
-{
- /* If we're using the socket API for sending and receiving,
- we don't need to register this interface twice. */
- info -> rfdesc = if_register_socket (info, interface);
- note ("Listening on Socket/%s/%s",
- info -> name,
- (info -> shared_network ?
- info -> shared_network -> name : "unattached"));
-}
-#endif /* USE_SOCKET_RECEIVE */
-
-#ifdef USE_SOCKET_SEND
-size_t send_packet (interface, packet, raw, len, from, to, hto)
- struct interface_info *interface;
- struct packet *packet;
- struct dhcp_packet *raw;
- size_t len;
- struct in_addr from;
- struct sockaddr_in *to;
- struct hardware *hto;
-{
- return sendto (interface -> wfdesc, (char *)raw, len, 0,
- (struct sockaddr *)to, sizeof *to);
-}
-#endif /* USE_SOCKET_SEND */
-
-#ifdef USE_SOCKET_RECEIVE
-size_t receive_packet (interface, buf, len, from, hfrom)
- struct interface_info *interface;
- unsigned char *buf;
- size_t len;
- struct sockaddr_in *from;
- struct hardware *hfrom;
-{
- int flen = sizeof *from;
-
- return recvfrom (interface -> rfdesc, buf, len, 0,
- (struct sockaddr *)from, &flen);
-}
-#endif /* USE_SOCKET_RECEIVE */
diff --git a/common/tables.c b/common/tables.c
deleted file mode 100644
index 34676e06..00000000
--- a/common/tables.c
+++ /dev/null
@@ -1,671 +0,0 @@
-/* tables.c
-
- Tables of information... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-/* DHCP Option names, formats and codes, from RFC1533.
-
- Format codes:
-
- e - end of data
- I - IP address
- l - 32-bit signed integer
- L - 32-bit unsigned integer
- s - 16-bit signed integer
- S - 16-bit unsigned integer
- b - 8-bit signed integer
- B - 8-bit unsigned integer
- t - ASCII text
- f - flag (true or false)
- A - array of whatever precedes (e.g., IA means array of IP addresses)
-*/
-
-struct universe dhcp_universe;
-struct option dhcp_options [256] = {
- { "pad", "", &dhcp_universe, 0 },
- { "subnet-mask", "I", &dhcp_universe, 1 },
- { "time-offset", "l", &dhcp_universe, 2 },
- { "routers", "IA", &dhcp_universe, 3 },
- { "time-servers", "IA", &dhcp_universe, 4 },
- { "name-servers", "IA", &dhcp_universe, 5 },
- { "domain-name-servers", "IA", &dhcp_universe, 6 },
- { "log-servers", "IA", &dhcp_universe, 7 },
- { "cookie-servers", "IA", &dhcp_universe, 8 },
- { "lpr-servers", "IA", &dhcp_universe, 9 },
- { "impress-servers", "IA", &dhcp_universe, 10 },
- { "resource-location-servers", "IA", &dhcp_universe, 11 },
- { "host-name", "t", &dhcp_universe, 12 },
- { "boot-size", "S", &dhcp_universe, 13 },
- { "merit-dump", "t", &dhcp_universe, 14 },
- { "domain-name", "t", &dhcp_universe, 15 },
- { "swap-server", "I", &dhcp_universe, 16 },
- { "root-path", "t", &dhcp_universe, 17 },
- { "extensions-path", "t", &dhcp_universe, 18 },
- { "ip-forwarding", "f", &dhcp_universe, 19 },
- { "non-local-source-routing", "f", &dhcp_universe, 20 },
- { "policy-filter", "IIA", &dhcp_universe, 21 },
- { "max-dgram-reassembly", "S", &dhcp_universe, 22 },
- { "default-ip-ttl", "B", &dhcp_universe, 23 },
- { "path-mtu-aging-timeout", "L", &dhcp_universe, 24 },
- { "path-mtu-plateau-table", "SA", &dhcp_universe, 25 },
- { "interface-mtu", "S", &dhcp_universe, 26 },
- { "all-subnets-local", "f", &dhcp_universe, 27 },
- { "broadcast-address", "I", &dhcp_universe, 28 },
- { "perform-mask-discovery", "f", &dhcp_universe, 29 },
- { "mask-supplier", "f", &dhcp_universe, 30 },
- { "router-discovery", "f", &dhcp_universe, 31 },
- { "router-solicitation-address", "I", &dhcp_universe, 32 },
- { "static-routes", "IIA", &dhcp_universe, 33 },
- { "trailer-encapsulation", "f", &dhcp_universe, 34 },
- { "arp-cache-timeout", "L", &dhcp_universe, 35 },
- { "ieee802.3-encapsulation", "f", &dhcp_universe, 36 },
- { "default-tcp-ttl", "B", &dhcp_universe, 37 },
- { "tcp-keepalive-interval", "L", &dhcp_universe, 38 },
- { "tcp-keepalive-garbage", "f", &dhcp_universe, 39 },
- { "nis-domain", "t", &dhcp_universe, 40 },
- { "nis-servers", "IA", &dhcp_universe, 41 },
- { "ntp-servers", "IA", &dhcp_universe, 42 },
- { "vendor-encapsulated-options", "t", &dhcp_universe, 43 },
- { "netbios-name-servers", "IA", &dhcp_universe, 44 },
- { "netbios-dd-server", "IA", &dhcp_universe, 45 },
- { "netbios-node-type", "B", &dhcp_universe, 46 },
- { "netbios-scope", "t", &dhcp_universe, 47 },
- { "font-servers", "IA", &dhcp_universe, 48 },
- { "x-display-manager", "IA", &dhcp_universe, 49 },
- { "dhcp-requested-address", "I", &dhcp_universe, 50 },
- { "dhcp-lease-time", "L", &dhcp_universe, 51 },
- { "dhcp-option-overload", "B", &dhcp_universe, 52 },
- { "dhcp-message-type", "B", &dhcp_universe, 53 },
- { "dhcp-server-identifier", "I", &dhcp_universe, 54 },
- { "dhcp-parameter-request-list", "BA", &dhcp_universe, 55 },
- { "dhcp-message", "t", &dhcp_universe, 56 },
- { "dhcp-max-message-size", "S", &dhcp_universe, 57 },
- { "dhcp-renewal-time", "L", &dhcp_universe, 58 },
- { "dhcp-rebinding-time", "L", &dhcp_universe, 59 },
- { "dhcp-class-identifier", "t", &dhcp_universe, 60 },
- { "dhcp-client-identifier", "BA", &dhcp_universe, 61 },
- { "option-62", "", &dhcp_universe, 62 },
- { "option-63", "", &dhcp_universe, 63 },
- { "option-64", "", &dhcp_universe, 64 },
- { "option-65", "", &dhcp_universe, 65 },
- { "option-66", "", &dhcp_universe, 66 },
- { "option-67", "", &dhcp_universe, 67 },
- { "option-68", "", &dhcp_universe, 68 },
- { "option-69", "", &dhcp_universe, 69 },
- { "option-70", "", &dhcp_universe, 70 },
- { "option-71", "", &dhcp_universe, 71 },
- { "option-72", "", &dhcp_universe, 72 },
- { "option-73", "", &dhcp_universe, 73 },
- { "option-74", "", &dhcp_universe, 74 },
- { "option-75", "", &dhcp_universe, 75 },
- { "option-76", "", &dhcp_universe, 76 },
- { "dhcp-user-class-identifier", "t", &dhcp_universe, 77 },
- { "option-78", "", &dhcp_universe, 78 },
- { "option-79", "", &dhcp_universe, 79 },
- { "option-80", "", &dhcp_universe, 80 },
- { "option-81", "", &dhcp_universe, 81 },
- { "option-82", "", &dhcp_universe, 82 },
- { "option-83", "", &dhcp_universe, 83 },
- { "option-84", "", &dhcp_universe, 84 },
- { "option-85", "", &dhcp_universe, 85 },
- { "option-86", "", &dhcp_universe, 86 },
- { "option-87", "", &dhcp_universe, 87 },
- { "option-88", "", &dhcp_universe, 88 },
- { "option-89", "", &dhcp_universe, 89 },
- { "option-90", "", &dhcp_universe, 90 },
- { "option-91", "", &dhcp_universe, 91 },
- { "option-92", "", &dhcp_universe, 92 },
- { "option-93", "", &dhcp_universe, 93 },
- { "option-94", "", &dhcp_universe, 94 },
- { "option-95", "", &dhcp_universe, 95 },
- { "option-96", "", &dhcp_universe, 96 },
- { "option-97", "", &dhcp_universe, 97 },
- { "option-98", "", &dhcp_universe, 98 },
- { "option-99", "", &dhcp_universe, 99 },
- { "option-100", "", &dhcp_universe, 100 },
- { "option-101", "", &dhcp_universe, 101 },
- { "option-102", "", &dhcp_universe, 102 },
- { "option-103", "", &dhcp_universe, 103 },
- { "option-104", "", &dhcp_universe, 104 },
- { "option-105", "", &dhcp_universe, 105 },
- { "option-106", "", &dhcp_universe, 106 },
- { "option-107", "", &dhcp_universe, 107 },
- { "option-108", "", &dhcp_universe, 108 },
- { "option-109", "", &dhcp_universe, 109 },
- { "option-110", "", &dhcp_universe, 110 },
- { "option-111", "", &dhcp_universe, 111 },
- { "option-112", "", &dhcp_universe, 112 },
- { "option-113", "", &dhcp_universe, 113 },
- { "option-114", "", &dhcp_universe, 114 },
- { "option-115", "", &dhcp_universe, 115 },
- { "option-116", "", &dhcp_universe, 116 },
- { "option-117", "", &dhcp_universe, 117 },
- { "option-118", "", &dhcp_universe, 118 },
- { "option-119", "", &dhcp_universe, 119 },
- { "option-120", "", &dhcp_universe, 120 },
- { "option-121", "", &dhcp_universe, 121 },
- { "option-122", "", &dhcp_universe, 122 },
- { "option-123", "", &dhcp_universe, 123 },
- { "option-124", "", &dhcp_universe, 124 },
- { "option-125", "", &dhcp_universe, 125 },
- { "option-126", "", &dhcp_universe, 126 },
- { "option-127", "", &dhcp_universe, 127 },
- { "option-128", "", &dhcp_universe, 128 },
- { "option-129", "", &dhcp_universe, 129 },
- { "option-130", "", &dhcp_universe, 130 },
- { "option-131", "", &dhcp_universe, 131 },
- { "option-132", "", &dhcp_universe, 132 },
- { "option-133", "", &dhcp_universe, 133 },
- { "option-134", "", &dhcp_universe, 134 },
- { "option-135", "", &dhcp_universe, 135 },
- { "option-136", "", &dhcp_universe, 136 },
- { "option-137", "", &dhcp_universe, 137 },
- { "option-138", "", &dhcp_universe, 138 },
- { "option-139", "", &dhcp_universe, 139 },
- { "option-140", "", &dhcp_universe, 140 },
- { "option-141", "", &dhcp_universe, 141 },
- { "option-142", "", &dhcp_universe, 142 },
- { "option-143", "", &dhcp_universe, 143 },
- { "option-144", "", &dhcp_universe, 144 },
- { "option-145", "", &dhcp_universe, 145 },
- { "option-146", "", &dhcp_universe, 146 },
- { "option-147", "", &dhcp_universe, 147 },
- { "option-148", "", &dhcp_universe, 148 },
- { "option-149", "", &dhcp_universe, 149 },
- { "option-150", "", &dhcp_universe, 150 },
- { "option-151", "", &dhcp_universe, 151 },
- { "option-152", "", &dhcp_universe, 152 },
- { "option-153", "", &dhcp_universe, 153 },
- { "option-154", "", &dhcp_universe, 154 },
- { "option-155", "", &dhcp_universe, 155 },
- { "option-156", "", &dhcp_universe, 156 },
- { "option-157", "", &dhcp_universe, 157 },
- { "option-158", "", &dhcp_universe, 158 },
- { "option-159", "", &dhcp_universe, 159 },
- { "option-160", "", &dhcp_universe, 160 },
- { "option-161", "", &dhcp_universe, 161 },
- { "option-162", "", &dhcp_universe, 162 },
- { "option-163", "", &dhcp_universe, 163 },
- { "option-164", "", &dhcp_universe, 164 },
- { "option-165", "", &dhcp_universe, 165 },
- { "option-166", "", &dhcp_universe, 166 },
- { "option-167", "", &dhcp_universe, 167 },
- { "option-168", "", &dhcp_universe, 168 },
- { "option-169", "", &dhcp_universe, 169 },
- { "option-170", "", &dhcp_universe, 170 },
- { "option-171", "", &dhcp_universe, 171 },
- { "option-172", "", &dhcp_universe, 172 },
- { "option-173", "", &dhcp_universe, 173 },
- { "option-174", "", &dhcp_universe, 174 },
- { "option-175", "", &dhcp_universe, 175 },
- { "option-176", "", &dhcp_universe, 176 },
- { "option-177", "", &dhcp_universe, 177 },
- { "option-178", "", &dhcp_universe, 178 },
- { "option-179", "", &dhcp_universe, 179 },
- { "option-180", "", &dhcp_universe, 180 },
- { "option-181", "", &dhcp_universe, 181 },
- { "option-182", "", &dhcp_universe, 182 },
- { "option-183", "", &dhcp_universe, 183 },
- { "option-184", "", &dhcp_universe, 184 },
- { "option-185", "", &dhcp_universe, 185 },
- { "option-186", "", &dhcp_universe, 186 },
- { "option-187", "", &dhcp_universe, 187 },
- { "option-188", "", &dhcp_universe, 188 },
- { "option-189", "", &dhcp_universe, 189 },
- { "option-190", "", &dhcp_universe, 190 },
- { "option-191", "", &dhcp_universe, 191 },
- { "option-192", "", &dhcp_universe, 192 },
- { "option-193", "", &dhcp_universe, 193 },
- { "option-194", "", &dhcp_universe, 194 },
- { "option-195", "", &dhcp_universe, 195 },
- { "option-196", "", &dhcp_universe, 196 },
- { "option-197", "", &dhcp_universe, 197 },
- { "option-198", "", &dhcp_universe, 198 },
- { "option-199", "", &dhcp_universe, 199 },
- { "option-200", "", &dhcp_universe, 200 },
- { "option-201", "", &dhcp_universe, 201 },
- { "option-202", "", &dhcp_universe, 202 },
- { "option-203", "", &dhcp_universe, 203 },
- { "option-204", "", &dhcp_universe, 204 },
- { "option-205", "", &dhcp_universe, 205 },
- { "option-206", "", &dhcp_universe, 206 },
- { "option-207", "", &dhcp_universe, 207 },
- { "option-208", "", &dhcp_universe, 208 },
- { "option-209", "", &dhcp_universe, 209 },
- { "option-210", "", &dhcp_universe, 210 },
- { "option-211", "", &dhcp_universe, 211 },
- { "option-212", "", &dhcp_universe, 212 },
- { "option-213", "", &dhcp_universe, 213 },
- { "option-214", "", &dhcp_universe, 214 },
- { "option-215", "", &dhcp_universe, 215 },
- { "option-216", "", &dhcp_universe, 216 },
- { "option-217", "", &dhcp_universe, 217 },
- { "option-218", "", &dhcp_universe, 218 },
- { "option-219", "", &dhcp_universe, 219 },
- { "option-220", "", &dhcp_universe, 220 },
- { "option-221", "", &dhcp_universe, 221 },
- { "option-222", "", &dhcp_universe, 222 },
- { "option-223", "", &dhcp_universe, 223 },
- { "option-224", "", &dhcp_universe, 224 },
- { "option-225", "", &dhcp_universe, 225 },
- { "option-226", "", &dhcp_universe, 226 },
- { "option-227", "", &dhcp_universe, 227 },
- { "option-228", "", &dhcp_universe, 228 },
- { "option-229", "", &dhcp_universe, 229 },
- { "option-230", "", &dhcp_universe, 230 },
- { "option-231", "", &dhcp_universe, 231 },
- { "option-232", "", &dhcp_universe, 232 },
- { "option-233", "", &dhcp_universe, 233 },
- { "option-234", "", &dhcp_universe, 234 },
- { "option-235", "", &dhcp_universe, 235 },
- { "option-236", "", &dhcp_universe, 236 },
- { "option-237", "", &dhcp_universe, 237 },
- { "option-238", "", &dhcp_universe, 238 },
- { "option-239", "", &dhcp_universe, 239 },
- { "option-240", "", &dhcp_universe, 240 },
- { "option-241", "", &dhcp_universe, 241 },
- { "option-242", "", &dhcp_universe, 242 },
- { "option-243", "", &dhcp_universe, 243 },
- { "option-244", "", &dhcp_universe, 244 },
- { "option-245", "", &dhcp_universe, 245 },
- { "option-246", "", &dhcp_universe, 246 },
- { "option-247", "", &dhcp_universe, 247 },
- { "option-248", "", &dhcp_universe, 248 },
- { "option-249", "", &dhcp_universe, 249 },
- { "option-250", "", &dhcp_universe, 250 },
- { "option-251", "", &dhcp_universe, 251 },
- { "option-252", "", &dhcp_universe, 252 },
- { "option-253", "", &dhcp_universe, 253 },
- { "option-254", "", &dhcp_universe, 254 },
- { "option-end", "e", &dhcp_universe, 255 },
-};
-
-/* Default dhcp option priority list (this is ad hoc and should not be
- mistaken for a carefully crafted and optimized list). */
-unsigned char dhcp_option_default_priority_list [] = {
- DHO_DHCP_REQUESTED_ADDRESS,
- DHO_DHCP_OPTION_OVERLOAD,
- DHO_DHCP_MAX_MESSAGE_SIZE,
- DHO_DHCP_RENEWAL_TIME,
- DHO_DHCP_REBINDING_TIME,
- DHO_DHCP_CLASS_IDENTIFIER,
- DHO_DHCP_CLIENT_IDENTIFIER,
- DHO_SUBNET_MASK,
- DHO_TIME_OFFSET,
- DHO_ROUTERS,
- DHO_TIME_SERVERS,
- DHO_NAME_SERVERS,
- DHO_DOMAIN_NAME_SERVERS,
- DHO_LOG_SERVERS,
- DHO_COOKIE_SERVERS,
- DHO_LPR_SERVERS,
- DHO_IMPRESS_SERVERS,
- DHO_RESOURCE_LOCATION_SERVERS,
- DHO_HOST_NAME,
- DHO_BOOT_SIZE,
- DHO_MERIT_DUMP,
- DHO_DOMAIN_NAME,
- DHO_SWAP_SERVER,
- DHO_ROOT_PATH,
- DHO_EXTENSIONS_PATH,
- DHO_IP_FORWARDING,
- DHO_NON_LOCAL_SOURCE_ROUTING,
- DHO_POLICY_FILTER,
- DHO_MAX_DGRAM_REASSEMBLY,
- DHO_DEFAULT_IP_TTL,
- DHO_PATH_MTU_AGING_TIMEOUT,
- DHO_PATH_MTU_PLATEAU_TABLE,
- DHO_INTERFACE_MTU,
- DHO_ALL_SUBNETS_LOCAL,
- DHO_BROADCAST_ADDRESS,
- DHO_PERFORM_MASK_DISCOVERY,
- DHO_MASK_SUPPLIER,
- DHO_ROUTER_DISCOVERY,
- DHO_ROUTER_SOLICITATION_ADDRESS,
- DHO_STATIC_ROUTES,
- DHO_TRAILER_ENCAPSULATION,
- DHO_ARP_CACHE_TIMEOUT,
- DHO_IEEE802_3_ENCAPSULATION,
- DHO_DEFAULT_TCP_TTL,
- DHO_TCP_KEEPALIVE_INTERVAL,
- DHO_TCP_KEEPALIVE_GARBAGE,
- DHO_NIS_DOMAIN,
- DHO_NIS_SERVERS,
- DHO_NTP_SERVERS,
- DHO_VENDOR_ENCAPSULATED_OPTIONS,
- DHO_NETBIOS_NAME_SERVERS,
- DHO_NETBIOS_DD_SERVER,
- DHO_NETBIOS_NODE_TYPE,
- DHO_NETBIOS_SCOPE,
- DHO_FONT_SERVERS,
- DHO_X_DISPLAY_MANAGER,
- DHO_DHCP_PARAMETER_REQUEST_LIST,
-};
-
-int sizeof_dhcp_option_default_priority_list =
- sizeof dhcp_option_default_priority_list;
-
-
-char *hardware_types [] = {
- "unknown-0",
- "ethernet",
- "unknown-2",
- "unknown-3",
- "unknown-4",
- "unknown-5",
- "unknown-6",
- "unknown-7",
- "unknown-8",
- "unknown-9",
- "unknown-10",
- "unknown-11",
- "unknown-12",
- "unknown-13",
- "unknown-14",
- "unknown-15",
- "unknown-16",
- "unknown-17",
- "unknown-18",
- "unknown-19",
- "unknown-20",
- "unknown-21",
- "unknown-22",
- "unknown-23",
- "unknown-24",
- "unknown-25",
- "unknown-26",
- "unknown-27",
- "unknown-28",
- "unknown-29",
- "unknown-30",
- "unknown-31",
- "unknown-32",
- "unknown-33",
- "unknown-34",
- "unknown-35",
- "unknown-36",
- "unknown-37",
- "unknown-38",
- "unknown-39",
- "unknown-40",
- "unknown-41",
- "unknown-42",
- "unknown-43",
- "unknown-44",
- "unknown-45",
- "unknown-46",
- "unknown-47",
- "unknown-48",
- "unknown-49",
- "unknown-50",
- "unknown-51",
- "unknown-52",
- "unknown-53",
- "unknown-54",
- "unknown-55",
- "unknown-56",
- "unknown-57",
- "unknown-58",
- "unknown-59",
- "unknown-60",
- "unknown-61",
- "unknown-62",
- "unknown-63",
- "unknown-64",
- "unknown-65",
- "unknown-66",
- "unknown-67",
- "unknown-68",
- "unknown-69",
- "unknown-70",
- "unknown-71",
- "unknown-72",
- "unknown-73",
- "unknown-74",
- "unknown-75",
- "unknown-76",
- "unknown-77",
- "unknown-78",
- "unknown-79",
- "unknown-80",
- "unknown-81",
- "unknown-82",
- "unknown-83",
- "unknown-84",
- "unknown-85",
- "unknown-86",
- "unknown-87",
- "unknown-88",
- "unknown-89",
- "unknown-90",
- "unknown-91",
- "unknown-92",
- "unknown-93",
- "unknown-94",
- "unknown-95",
- "unknown-96",
- "unknown-97",
- "unknown-98",
- "unknown-99",
- "unknown-100",
- "unknown-101",
- "unknown-102",
- "unknown-103",
- "unknown-104",
- "unknown-105",
- "unknown-106",
- "unknown-107",
- "unknown-108",
- "unknown-109",
- "unknown-110",
- "unknown-111",
- "unknown-112",
- "unknown-113",
- "unknown-114",
- "unknown-115",
- "unknown-116",
- "unknown-117",
- "unknown-118",
- "unknown-119",
- "unknown-120",
- "unknown-121",
- "unknown-122",
- "unknown-123",
- "unknown-124",
- "unknown-125",
- "unknown-126",
- "unknown-127",
- "unknown-128",
- "unknown-129",
- "unknown-130",
- "unknown-131",
- "unknown-132",
- "unknown-133",
- "unknown-134",
- "unknown-135",
- "unknown-136",
- "unknown-137",
- "unknown-138",
- "unknown-139",
- "unknown-140",
- "unknown-141",
- "unknown-142",
- "unknown-143",
- "unknown-144",
- "unknown-145",
- "unknown-146",
- "unknown-147",
- "unknown-148",
- "unknown-149",
- "unknown-150",
- "unknown-151",
- "unknown-152",
- "unknown-153",
- "unknown-154",
- "unknown-155",
- "unknown-156",
- "unknown-157",
- "unknown-158",
- "unknown-159",
- "unknown-160",
- "unknown-161",
- "unknown-162",
- "unknown-163",
- "unknown-164",
- "unknown-165",
- "unknown-166",
- "unknown-167",
- "unknown-168",
- "unknown-169",
- "unknown-170",
- "unknown-171",
- "unknown-172",
- "unknown-173",
- "unknown-174",
- "unknown-175",
- "unknown-176",
- "unknown-177",
- "unknown-178",
- "unknown-179",
- "unknown-180",
- "unknown-181",
- "unknown-182",
- "unknown-183",
- "unknown-184",
- "unknown-185",
- "unknown-186",
- "unknown-187",
- "unknown-188",
- "unknown-189",
- "unknown-190",
- "unknown-191",
- "unknown-192",
- "unknown-193",
- "unknown-194",
- "unknown-195",
- "unknown-196",
- "unknown-197",
- "unknown-198",
- "unknown-199",
- "unknown-200",
- "unknown-201",
- "unknown-202",
- "unknown-203",
- "unknown-204",
- "unknown-205",
- "unknown-206",
- "unknown-207",
- "unknown-208",
- "unknown-209",
- "unknown-210",
- "unknown-211",
- "unknown-212",
- "unknown-213",
- "unknown-214",
- "unknown-215",
- "unknown-216",
- "unknown-217",
- "unknown-218",
- "unknown-219",
- "unknown-220",
- "unknown-221",
- "unknown-222",
- "unknown-223",
- "unknown-224",
- "unknown-225",
- "unknown-226",
- "unknown-227",
- "unknown-228",
- "unknown-229",
- "unknown-230",
- "unknown-231",
- "unknown-232",
- "unknown-233",
- "unknown-234",
- "unknown-235",
- "unknown-236",
- "unknown-237",
- "unknown-238",
- "unknown-239",
- "unknown-240",
- "unknown-241",
- "unknown-242",
- "unknown-243",
- "unknown-244",
- "unknown-245",
- "unknown-246",
- "unknown-247",
- "unknown-248",
- "unknown-249",
- "unknown-250",
- "unknown-251",
- "unknown-252",
- "unknown-253",
- "unknown-254",
- "unknown-255" };
-
-
-
-struct hash_table universe_hash;
-
-void initialize_universes()
-{
- int i;
-
- dhcp_universe.name = "dhcp";
- dhcp_universe.hash = new_hash ();
- if (!dhcp_universe.hash)
- error ("Can't allocate dhcp option hash table.");
- for (i = 0; i < 256; i++) {
- dhcp_universe.options [i] = &dhcp_options [i];
- add_hash (dhcp_universe.hash, dhcp_options [i].name, 0,
- (unsigned char *)&dhcp_options [i]);
- }
- universe_hash.hash_count = DEFAULT_HASH_SIZE;
- add_hash (&universe_hash, dhcp_universe.name, 0,
- (unsigned char *)&dhcp_universe);
-}
diff --git a/common/tree.c b/common/tree.c
deleted file mode 100644
index 49f62926..00000000
--- a/common/tree.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/* tree.c
-
- Routines for manipulating parse trees... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static TIME tree_evaluate_recurse PROTO ((int *, unsigned char **, int *,
- struct tree *));
-static TIME do_host_lookup PROTO ((int *, unsigned char **, int *,
- struct dns_host_entry *));
-static void do_data_copy PROTO ((int *, unsigned char **, int *,
- unsigned char *, int));
-
-pair cons (car, cdr)
- caddr_t car;
- pair cdr;
-{
- pair foo = (pair)dmalloc (sizeof *foo, "cons");
- if (!foo)
- error ("no memory for cons.");
- foo -> car = car;
- foo -> cdr = cdr;
- return foo;
-}
-
-struct tree_cache *tree_cache (tree)
- struct tree *tree;
-{
- struct tree_cache *tc;
-
- tc = new_tree_cache ("tree_cache");
- if (!tc)
- return 0;
- tc -> value = (unsigned char *)0;
- tc -> len = tc -> buf_size = 0;
- tc -> timeout = 0;
- tc -> tree = tree;
- return tc;
-}
-
-struct tree *tree_host_lookup (name)
- char *name;
-{
- struct tree *nt;
- nt = new_tree ("tree_host_lookup");
- if (!nt)
- error ("No memory for host lookup tree node.");
- nt -> op = TREE_HOST_LOOKUP;
- nt -> data.host_lookup.host = enter_dns_host (name);
- return nt;
-}
-
-struct dns_host_entry *enter_dns_host (name)
- char *name;
-{
- struct dns_host_entry *dh;
-
- if (!(dh = (struct dns_host_entry *)dmalloc
- (sizeof (struct dns_host_entry), "enter_dns_host"))
- || !(dh -> hostname = dmalloc (strlen (name) + 1,
- "enter_dns_host")))
- error ("Can't allocate space for new host.");
- strcpy (dh -> hostname, name);
- dh -> data = (unsigned char *)0;
- dh -> data_len = 0;
- dh -> buf_len = 0;
- dh -> timeout = 0;
- return dh;
-}
-
-struct tree *tree_const (data, len)
- unsigned char *data;
- int len;
-{
- struct tree *nt;
- if (!(nt = new_tree ("tree_const"))
- || !(nt -> data.const_val.data =
- (unsigned char *)dmalloc (len, "tree_const")))
- error ("No memory for constant data tree node.");
- nt -> op = TREE_CONST;
- memcpy (nt -> data.const_val.data, data, len);
- nt -> data.const_val.len = len;
- return nt;
-}
-
-struct tree *tree_concat (left, right)
- struct tree *left, *right;
-{
- struct tree *nt;
-
- /* If we're concatenating a null tree to a non-null tree, just
- return the non-null tree; if both trees are null, return
- a null tree. */
- if (!left)
- return right;
- if (!right)
- return left;
-
- /* If both trees are constant, combine them. */
- if (left -> op == TREE_CONST && right -> op == TREE_CONST) {
- unsigned char *buf = dmalloc (left -> data.const_val.len
- + right -> data.const_val.len,
- "tree_concat");
- if (!buf)
- error ("No memory to concatenate constants.");
- memcpy (buf, left -> data.const_val.data,
- left -> data.const_val.len);
- memcpy (buf + left -> data.const_val.len,
- right -> data.const_val.data,
- right -> data.const_val.len);
- dfree (left -> data.const_val.data, "tree_concat");
- dfree (right -> data.const_val.data, "tree_concat");
- left -> data.const_val.data = buf;
- left -> data.const_val.len += right -> data.const_val.len;
- free_tree (right, "tree_concat");
- return left;
- }
-
- /* Otherwise, allocate a new node to concatenate the two. */
- if (!(nt = new_tree ("tree_concat")))
- error ("No memory for data tree concatenation node.");
- nt -> op = TREE_CONCAT;
- nt -> data.concat.left = left;
- nt -> data.concat.right = right;
- return nt;
-}
-
-struct tree *tree_limit (tree, limit)
- struct tree *tree;
- int limit;
-{
- struct tree *rv;
-
- /* If the tree we're limiting is constant, limit it now. */
- if (tree -> op == TREE_CONST) {
- if (tree -> data.const_val.len > limit)
- tree -> data.const_val.len = limit;
- return tree;
- }
-
- /* Otherwise, put in a node which enforces the limit on evaluation. */
- rv = new_tree ("tree_limit");
- if (!rv)
- return (struct tree *)0;
- rv -> op = TREE_LIMIT;
- rv -> data.limit.tree = tree;
- rv -> data.limit.limit = limit;
- return rv;
-}
-
-int tree_evaluate (tree_cache)
- struct tree_cache *tree_cache;
-{
- unsigned char *bp = tree_cache -> value;
- int bc = tree_cache -> buf_size;
- int bufix = 0;
-
- /* If there's no tree associated with this cache, it evaluates
- to a constant and that was detected at startup. */
- if (!tree_cache -> tree)
- return 1;
-
- /* Try to evaluate the tree without allocating more memory... */
- tree_cache -> timeout = tree_evaluate_recurse (&bufix, &bp, &bc,
- tree_cache -> tree);
-
- /* No additional allocation needed? */
- if (bufix <= bc) {
- tree_cache -> len = bufix;
- return 1;
- }
-
- /* If we can't allocate more memory, return with what we
- have (maybe nothing). */
- if (!(bp = (unsigned char *)dmalloc (bufix, "tree_evaluate")))
- return 0;
-
- /* Record the change in conditions... */
- bc = bufix;
- bufix = 0;
-
- /* Note that the size of the result shouldn't change on the
- second call to tree_evaluate_recurse, since we haven't
- changed the ``current'' time. */
- tree_evaluate_recurse (&bufix, &bp, &bc, tree_cache -> tree);
-
- /* Free the old buffer if needed, then store the new buffer
- location and size and return. */
- if (tree_cache -> value)
- dfree (tree_cache -> value, "tree_evaluate");
- tree_cache -> value = bp;
- tree_cache -> len = bufix;
- tree_cache -> buf_size = bc;
- return 1;
-}
-
-static TIME tree_evaluate_recurse (bufix, bufp, bufcount, tree)
- int *bufix;
- unsigned char **bufp;
- int *bufcount;
- struct tree *tree;
-{
- int limit;
- TIME t1, t2;
-
- switch (tree -> op) {
- case TREE_CONCAT:
- t1 = tree_evaluate_recurse (bufix, bufp, bufcount,
- tree -> data.concat.left);
- t2 = tree_evaluate_recurse (bufix, bufp, bufcount,
- tree -> data.concat.right);
- if (t1 > t2)
- return t2;
- return t1;
-
- case TREE_HOST_LOOKUP:
- return do_host_lookup (bufix, bufp, bufcount,
- tree -> data.host_lookup.host);
-
- case TREE_CONST:
- do_data_copy (bufix, bufp, bufcount,
- tree -> data.const_val.data,
- tree -> data.const_val.len);
- t1 = MAX_TIME;
- return t1;
-
- case TREE_LIMIT:
- limit = *bufix + tree -> data.limit.limit;
- t1 = tree_evaluate_recurse (bufix, bufp, bufcount,
- tree -> data.limit.tree);
- *bufix = limit;
- return t1;
-
- default:
- warn ("Bad node id in tree: %d.");
- t1 = MAX_TIME;
- return t1;
- }
-}
-
-static TIME do_host_lookup (bufix, bufp, bufcount, dns)
- int *bufix;
- unsigned char **bufp;
- int *bufcount;
- struct dns_host_entry *dns;
-{
- struct hostent *h;
- int i;
- int new_len;
-
-#ifdef DEBUG_EVAL
- debug ("time: now = %d dns = %d %d diff = %d",
- cur_time, dns -> timeout, cur_time - dns -> timeout);
-#endif
-
- /* If the record hasn't timed out, just copy the data and return. */
- if (cur_time <= dns -> timeout) {
-#ifdef DEBUG_EVAL
- debug ("easy copy: %x %d %x",
- dns -> data, dns -> data_len,
- dns -> data ? *(int *)(dns -> data) : 0);
-#endif
- do_data_copy (bufix, bufp, bufcount,
- dns -> data, dns -> data_len);
- return dns -> timeout;
- }
-#ifdef DEBUG_EVAL
- debug ("Looking up %s", dns -> hostname);
-#endif
-
- /* Otherwise, look it up... */
- h = gethostbyname (dns -> hostname);
- if (!h) {
- switch (h_errno) {
- case HOST_NOT_FOUND:
- warn ("%s: host unknown.", dns -> hostname);
- break;
- case TRY_AGAIN:
- warn ("%s: temporary name server failure",
- dns -> hostname);
- break;
- case NO_RECOVERY:
- warn ("%s: name server failed", dns -> hostname);
- break;
- case NO_DATA:
- warn ("%s: no A record associated with address",
- dns -> hostname);
- }
-
- /* Okay to try again after a minute. */
- return cur_time + 60;
- }
-
-#ifdef DEBUG_EVAL
- debug ("Lookup succeeded; first address is %x",
- h -> h_addr_list [0]);
-#endif
-
- /* Count the number of addresses we got... */
- for (i = 0; h -> h_addr_list [i]; i++)
- ;
-
- /* Do we need to allocate more memory? */
- new_len = i * h -> h_length;
- if (dns -> buf_len < i) {
- unsigned char *buf =
- (unsigned char *)dmalloc (new_len, "do_host_lookup");
- /* If we didn't get more memory, use what we have. */
- if (!buf) {
- new_len = dns -> buf_len;
- if (!dns -> buf_len) {
- dns -> timeout = cur_time + 60;
- return dns -> timeout;
- }
- } else {
- dfree (dns -> data, "do_host_lookup");
- dns -> data = buf;
- dns -> buf_len = new_len;
- }
- }
-
- /* Addresses are conveniently stored one to the buffer, so we
- have to copy them out one at a time... :'( */
- for (i = 0; i < new_len / h -> h_length; i++) {
- memcpy (dns -> data + h -> h_length * i,
- h -> h_addr_list [i], h -> h_length);
- }
-#ifdef DEBUG_EVAL
- debug ("dns -> data: %x h -> h_addr_list [0]: %x",
- *(int *)(dns -> data), h -> h_addr_list [0]);
-#endif
- dns -> data_len = new_len;
-
- /* Set the timeout for an hour from now.
- XXX This should really use the time on the DNS reply. */
- dns -> timeout = cur_time + 3600;
-
-#ifdef DEBUG_EVAL
- debug ("hard copy: %x %d %x",
- dns -> data, dns -> data_len, *(int *)(dns -> data));
-#endif
- do_data_copy (bufix, bufp, bufcount, dns -> data, dns -> data_len);
- return dns -> timeout;
-}
-
-static void do_data_copy (bufix, bufp, bufcount, data, len)
- int *bufix;
- unsigned char **bufp;
- int *bufcount;
- unsigned char *data;
- int len;
-{
- int space = *bufcount - *bufix;
-
- /* If there's more space than we need, use only what we need. */
- if (space > len)
- space = len;
-
- /* Copy as much data as will fit, then increment the buffer index
- by the amount we actually had to copy, which could be more. */
- if (space > 0)
- memcpy (*bufp + *bufix, data, space);
- *bufix += len;
-}
diff --git a/includes/cdefs.h b/includes/cdefs.h
deleted file mode 100644
index 6a8dcffd..00000000
--- a/includes/cdefs.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* cdefs.h
-
- Standard C definitions... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium.
- * All Rights Reserved.
- * Copyright (c) 1995 RadioMail Corporation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of RadioMail Corporation, the Internet Software
- * Consortium nor the names of its contributors may be used to endorse
- * or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY RADIOMAIL CORPORATION, THE INTERNET
- * SOFTWARE CONSORTIUM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL RADIOMAIL CORPORATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for RadioMail Corporation by Ted Lemon
- * under a contract with Vixie Enterprises. Further modifications have
- * been made for the Internet Software Consortium under a contract
- * with Vixie Laboratories.
- */
-
-#if (defined (__GNUC__) || defined (__STDC__)) && !defined (BROKEN_ANSI)
-#define PROTO(x) x
-#define KandR(x)
-#define ANSI_DECL(x) x
-#if defined (__GNUC__)
-#define INLINE inline
-#endif /* __GNUC__ */
-#else
-#define PROTO(x) ()
-#define KandR(x) x
-#define ANSI_DECL(x)
-#define INLINE
-#endif /* __GNUC__ || __STDC__ */
diff --git a/includes/cf/alphaosf.h b/includes/cf/alphaosf.h
deleted file mode 100644
index 431f3265..00000000
--- a/includes/cf/alphaosf.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* alphaosf.h
-
- System dependencies for DEC Alpha/OSF1... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <sys/bitypes.h>
-#include <string.h>
-#include <paths.h>
-#include <errno.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <setjmp.h>
-#include <limits.h>
-
-#include <sys/wait.h>
-#include <signal.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_dl.h>
-
-/* Varargs stuff... */
-#include <varargs.h>
-#define VA_DOTDOTDOT va_alist
-#define VA_start(list, last) va_start (list)
-
-#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/* Time stuff... */
-#include <sys/time.h>
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-/* The jmp_buf type is an array on OSF/1, so we can't dereference it
- and must declare it differently. */
-#define jbp_decl(x) jmp_buf x
-#define jref(x) (x)
-#define jdref(x) (x)
-#define jrefproto jmp_buf
-
-/* OSF/1 doesn't support limited sprintfs. */
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-#define NEED_OSF_PFILT_HACKS
-#define BPF_FORMAT "/dev/pf/pfilt%d"
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_BPF
-#endif
diff --git a/includes/cf/bsdos.h b/includes/cf/bsdos.h
deleted file mode 100644
index 8947b1d8..00000000
--- a/includes/cf/bsdos.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* bsdos.h
-
- System dependencies for BSDI BSD/OS... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <string.h>
-#include <paths.h>
-#include <errno.h>
-#include <unistd.h>
-#include <setjmp.h>
-#include <limits.h>
-
-#include <sys/wait.h>
-#include <signal.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#define INADDR_LOOPBACK ((u_int32_t)0x7f000001)
-
-/* Varargs stuff... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define va_dcl
-#define VA_start(list, last) va_start (list, last)
-
-#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/* Time stuff... */
-#include <sys/time.h>
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-#define HAVE_SA_LEN
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_BPF
-#endif
diff --git a/includes/cf/freebsd.h b/includes/cf/freebsd.h
deleted file mode 100644
index 286b8b58..00000000
--- a/includes/cf/freebsd.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* freebsd.h
-
- System dependencies for FreeBSD... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#define _ANSI_SOURCE
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <string.h>
-#include <paths.h>
-#include <errno.h>
-#include <unistd.h>
-#include <setjmp.h>
-#include <limits.h>
-
-#include <sys/wait.h>
-#include <signal.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_dl.h>
-#define INADDR_LOOPBACK ((u_int32_t)0x7f000001)
-
-/* Varargs stuff... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define va_dcl
-#define VA_start(list, last) va_start (list, last)
-
-#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/* Time stuff... */
-#include <sys/time.h>
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-#define HAVE_SA_LEN
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_BPF
-#endif
diff --git a/includes/cf/linux.h b/includes/cf/linux.h
deleted file mode 100644
index b1d9bd34..00000000
--- a/includes/cf/linux.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* linux.h
-
- System dependencies for Linux.
-
- Based on a configuration originally supplied by Jonathan Stone. */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <features.h>
-#undef __USE_BSD
-typedef char int8_t;
-typedef short int16_t;
-typedef long int32_t;
-
-typedef unsigned char u_int8_t;
-typedef unsigned short u_int16_t;
-typedef unsigned long u_int32_t;
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <linux/if_arp.h>
-#include <sys/time.h> /* gettimeofday()*/
-#include <linux/time.h> /* also necessary */
-
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-
-/* Varargs stuff... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define VA_start(list, last) va_start (list, last)
-#define va_dcl
-
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-#define VOIDPTR void *
-
-#define EOL '\n'
-
-/* Time stuff... */
-
-#include <time.h>
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_SOCKETS
-#endif
diff --git a/includes/cf/netbsd.h b/includes/cf/netbsd.h
deleted file mode 100644
index 4f5efd0e..00000000
--- a/includes/cf/netbsd.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* netbsd.h
-
- System dependencies for NetBSD... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <string.h>
-#include <paths.h>
-#include <errno.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <setjmp.h>
-#include <limits.h>
-
-#include <sys/wait.h>
-#include <signal.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_dl.h>
-
-/* Varargs stuff... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define va_dcl
-#define VA_start(list, last) va_start (list, last)
-
-#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/* Time stuff... */
-#include <sys/time.h>
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-#define HAVE_SA_LEN
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_BPF
-#endif
diff --git a/includes/cf/sample.h b/includes/cf/sample.h
deleted file mode 100644
index 8fe45f4b..00000000
--- a/includes/cf/sample.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/* sample.h
-
- Sample config file for clients.
-
- This file is provided as a sample in case the system you want to run
- on is not currently supported. If that is the case, follow the Porting::
- comments here and in other files as guides for what to change. */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/* Porting::
-
- Some systems do not define basic integer types as shown below.
- On some systems, you need to include <bitypes.h> or <sys/bitypes.h>.
- If you get parse errors in dhcpd.h while compiling dhcpd.conf, try
- including bitypes.h, and if that fails, use the hard-coded definitions
- shown below. */
-
-#if 0
-#include <sys/bitypes.h>
-#endif
-
-#if 0
-#define int8_t char
-#define int16_t short
-#define int32_t long
-
-#define u_int8_t unsigned char
-#define u_int16_t unsigned short
-#define u_int32_t unsigned long
-#endif
-
-#include <sys/types.h>
-
-/* Porting::
-
- The jmp_buf type as declared in <setjmp.h> is sometimes a structure
- and sometimes an array. By default, we assume it's a structure.
- If it's an array on your system, you may get compile warnings or errors
- as a result in confpars.c. If so, try including the following definitions,
- which treat jmp_buf as an array: */
-
-#if 0
-#define jbp_decl(x) jmp_buf x
-#define jref(x) (x)
-#define jdref(x) (x)
-#define jrefproto jmp_buf
-#endif
-
-/* Porting::
-
- Some older systems (e.g., Ultrix) still use the 4.2BSD-style syslog
- API. These differ from later versions of the syslog API in that the
- openlog system call takes two arguments instead of three, and the
- facility code (the third argument to modern versions of openlog())
- is ORed into the log priority in the syslog() call.
-
- If you are running with the 4.2BSD-style syslog interface, define
- SYSLOG_4_2. */
-
-/* #define SYSLOG_4_2 */
-
-#include <syslog.h>
-
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_arp.h>
-
-/* Porting::
-
- Some older systems do not have defines for IP type-of-service,
- or don't define them the way we expect. If you get undefined
- symbol errors on the following symbols, they probably need to be
- defined here. */
-
-#if 0
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-#endif
-
-/* Porting::
-
- Newer BSD derivatives store non-permanent daemon files in a
- directory called /var/run. If your system has a /var/run,
- use it; otherwise, use /etc. */
-
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-#endif
-
-/* Porting::
-
- If your system supports standard ANSI C, it should provide the file
- /usr/include/stdarg.h. This contains the ANSI standard declarations
- for functions which take a variable number of arguments.
-
- Older systems with non-ANSI compilers cannot support this interface,
- and generally use the older varargs interface, defined in <varargs.h>.
- Some systems only support varargs, but define the interface in
- <stdarg.h> anyway.
-
- You must choose one of the two sets of definitions below. Try
- stdarg.h first, unless you know it won't work. If you have
- trouble compiling errwarn.c, try switching to the varargs.h definitions.
- If that fails, try using stdarg.h with the varargs definitions. */
-
-#if 0
-/* Stdarg definitions for ANSI-compliant C compilers. */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define VA_start(list, last) va_start (list, last)
-#define va_dcl
-#endif
-
-#if 0
-/* Varargs definitions, for non-ANSI-compliant C compilers. */
-#include <varargs.h>
-#define VA_DOTDOTDOT va_alist
-#define VA_start(list, last) va_start (list)
-#endif
-
-/* Porting::
-
- Some systems (notably 4.4BSD derivatives) support versions of the
- sprintf functions which will deposit a limited number of characters
- into the buffer; that limit is provided in an extra argument.
- If your system doesn't support this functionality, you must include
- the definitions below: */
-
-#if 0
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-#endif
-
-/* Porting::
-
- Some systems provide a function, strerror(), which takes the unix
- error number (see errno) and returns a pointer to a static buffer
- containing the corresponding error message.
-
- If your system doesn't provide strerror(), define NO_STRERROR
- as shown below: */
-
-#if 0
-#define NO_STRERROR
-char *strerror PROTO ((int));
-#endif
-
-/* Porting::
-
- Once dhcpd has initialized itself, it loops forever waiting for
- packets to come in. Since we need to support multiple input streams
- in order to support multiple interfaces, dhcpd needs to be able to
- do a syscall to determine which descriptors have input waiting on
- them.
-
- Normally, dhcpd uses the select() system call, which is a 4.2BSD
- syscall invented precisely for this purpose. Unfortunately, some
- System V-based systems do not support select() properly when it
- operates on streams. The System V interface which does (largely)
- the same thing as select is called poll(). In some cases, this may
- work better than select() - if you find that dhcpd is hanging and not
- responding to packets very consistently, you might try defining
- USE_POLL and including <poll.h>. */
-
-#if 0
-#define USE_POLL
-#include <poll.h>
-#endif
-
-/* Porting::
-
- You must define the default network API for your port. This
- will depend on whether one of the existing APIs will work for
- you, or whether you need to implement support for a new API.
- Currently, the following APIs are supported:
-
- The BSD socket API: define USE_SOCKETS.
- The Berkeley Packet Filter: define USE_BPF.
- The Streams Network Interface Tap (NIT): define USE_NIT.
- Raw sockets: define USE_RAW_SOCKETS
-
- If your system supports the BSD socket API and doesn't provide
- one of the supported interfaces to the physical packet layer,
- you can either provide support for the low-level API that your
- system does support (if any) or just use the BSD socket interface.
- The BSD socket interface doesn't support multiple network interfaces,
- and on many systems, it does not support the all-ones broadcast
- address, which can cause problems with some DHCP clients (e.g.
- Microsoft Windows 95). */
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_SOCKETS
-#endif
-
-/* Porting::
-
- Recent versions of BSD added a new element to the sockaddr structure:
- sa_len. This indicates the length of the structure, and is used
- in a variety of places, not the least of which is the SIOCGIFCONF
- ioctl, which is used to figure out what interfaces are attached to
- the system.
-
- You should be able to determine if your system has an sa_len element
- by looking at the struct sockaddr definition in /usr/include/sys/socket.h.
- If it does, you must define HAVE_SA_LEN. Otherwise, you must not.
- The most obvious symptom that you've got this wrong is either a compile
- error complaining about the use of the sa_len structure element, or
- the failure of dhcpd to find any interfaces. */
-
-/* #define HAVE_SA_LEN */
-
-/* Every operating system has its own way of seperating lines in a
- sequential text file. Most modern systems use a single character,
- either an ASCII Newline (10) or an ASCII Carriage Return (13).
-
- The most notable exception is MS-DOS (and consequently, Windows),
- which uses an ASCII Carriage Return followed by a Newline to
- seperate each line. Fortunately, MS-DOS C compiler libraries
- typically hide this from the programmer, returning just a Newline.
-
- Define EOL to be whatever getc() returns for a newline. */
-
-#define EOL '\n'
-
-/* Some older C compilers don't support the void pointer type.
- ANSI C defines void * to be a pointer type that matches
- any other pointer type. This is handy for returning a pointer
- which will always need to be cast to a different value. For
- example, malloc() on an ANSI C-compliant system returns void *.
-
- If your compiler doesn't support void pointers, you may need to
- define VOIDPTR to be char *; otherwise, define it to be void *. */
-
-#define VOIDPTR void *
-
-/* Porting::
-
- The following definitions for time should work on any unix machine.
- They may not work (or at least, may not work well) on a variety of
- non-unix machines. If you are porting to a non-unix machine, you
- probably need to change the definitions below and perhaps include
- different headers.
-
- I should note that dhcpd is not yet entirely clean of unix-specific
- time references, so the list of defines shown below probably isn't
- good enough if you're porting to a system that really doesn't support
- unix time. It's probably a reasonable place to start, though. */
-
-#include <time.h>
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
diff --git a/includes/cf/sco.h b/includes/cf/sco.h
deleted file mode 100644
index d839f974..00000000
--- a/includes/cf/sco.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* sco.h
-
- System dependencies for SCO ODT 3.0...
-
- Based on changes contributed by Gerald Rosenberg. */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#include <syslog.h>
-#include <sys/types.h>
-
-/* Basic Integer Types not defined in SCO headers... */
-
-typedef char int8_t;
-typedef short int16_t;
-typedef long int32_t;
-
-typedef unsigned char u_int8_t;
-typedef unsigned short u_int16_t;
-typedef unsigned long u_int32_t;
-
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_arp.h>
-
-/* XXX dunno if this is required for SCO... */
-/*
- * Definitions for IP type of service (ip_tos)
- */
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-/* IPTOS_LOWCOST 0x02 XXX */
-
-/* SCO doesn't have /var/run. */
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-#endif
-
-#define INADDR_LOOPBACK ((u_int32_t)0x7f000001)
-
-/* Varargs stuff: use stdarg.h instead ... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define VA_start(list, last) va_start (list, last)
-#define va_dcl
-
-/* SCO doesn't support limited sprintfs. */
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-/* By default, use BSD Socket API for receiving and sending packets.
- This actually works pretty well on Solaris, which doesn't censor
- the all-ones broadcast address. */
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_SOCKETS
-#endif
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/*
- * Time stuff...
- *
- * Definitions for an ISC DHCPD system that uses time_t
- * to represent time internally as opposed to, for example, struct timeval.)
- */
-
-#include <time.h>
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
diff --git a/includes/cf/sunos4.h b/includes/cf/sunos4.h
deleted file mode 100644
index 1e8b849d..00000000
--- a/includes/cf/sunos4.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* sunos4.h
-
- System dependencies for SunOS 4 (tested on 4.1.4)... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-/* Basic Integer Types not defined in SunOS headers... */
-
-#define int8_t char
-#define int16_t short
-#define int32_t long
-
-#define u_int8_t unsigned char
-#define u_int16_t unsigned short
-#define u_int32_t unsigned long
-
-/* No endian.h either. */
-/*
- * Definitions for byte order, according to byte significance from low
- * address to high.
- */
-#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */
-#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */
-#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */
-
-#define BYTE_ORDER BIG_ENDIAN
-
-/* The jmp_buf type is an array on SunOS, so we can't dereference it
- and must declare it differently. */
-#define jbp_decl(x) jmp_buf x
-#define jref(x) (x)
-#define jdref(x) (x)
-#define jrefproto jmp_buf
-
-#include <syslog.h>
-#include <sys/types.h>
-
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-#include <poll.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_arp.h>
-
-/*
- * Definitions for IP type of service (ip_tos)
- */
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-/* IPTOS_LOWCOST 0x02 XXX */
-
-/* SunOS systems don't have /var/run, but some sites have added it.
- If you want to put dhcpd.pid in /var/run, define _PATH_DHCPD_PID
- in site.h. */
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-#endif
-
-#ifdef __GNUC__
-/* Varargs stuff: use stdarg.h instead ... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define VA_start(list, last) va_start (list, last)
-#define va_dcl
-#else /* !__GNUC__*/
-/* Varargs stuff... */
-#include <varargs.h>
-#define VA_DOTDOTDOT va_alist
-#define VA_start(list, last) va_start (list)
-#endif /* !__GNUC__*/
-
-/* SunOS doesn't support limited sprintfs. */
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-/* SunOS doesn't supply strerror... */
-#define NO_STRERROR
-char *strerror PROTO ((int));
-
-/* SunOS select() doesn't work on streams, so we have to use poll -
- as usual, SysV can't do networking to save its life. */
-#define USE_POLL
-
-/* By default, use NIT API for receiving and sending packets... */
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_NIT
-#endif
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-#include <time.h>
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
diff --git a/includes/cf/sunos5-5.h b/includes/cf/sunos5-5.h
deleted file mode 100644
index ea842a62..00000000
--- a/includes/cf/sunos5-5.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* sunos5-5.h
-
- System dependencies for Solaris 2.x (tested on 2.5 with gcc)... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-/* Basic Integer Types not defined in SunOS headers... */
-
-#define int8_t char
-#define int16_t short
-#define int32_t long
-
-#define u_int8_t unsigned char
-#define u_int16_t unsigned short
-#define u_int32_t unsigned long
-
-/* The jmp_buf type is an array on Solaris, so we can't dereference it
- and must declare it differently. */
-
-#define jbp_decl(x) jmp_buf x
-#define jref(x) (x)
-#define jdref(x) (x)
-#define jrefproto jmp_buf
-
-#include <syslog.h>
-#include <sys/types.h>
-#include <sys/sockio.h>
-
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-#include <net/if_arp.h>
-
-/*
- * Definitions for IP type of service (ip_tos)
- */
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-/* IPTOS_LOWCOST 0x02 XXX */
-
-/* Solaris systems don't have /var/run, but some sites have added it.
- If you want to put dhcpd.pid in /var/run, define _PATH_DHCPD_PID
- in site.h. */
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-#endif
-
-#ifdef __GNUC__
-/* Varargs stuff: use stdarg.h instead ... */
-#include <stdarg.h>
-#define VA_DOTDOTDOT ...
-#define VA_start(list, last) va_start (list, last)
-#define va_dcl
-#else /* !__GNUC__*/
-/* Varargs stuff... */
-#include <varargs.h>
-#define VA_DOTDOTDOT va_alist
-#define VA_start(list, last) va_start (list)
-#endif /* !__GNUC__*/
-
-/* Solaris doesn't support limited sprintfs. */
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-/* By default, use BSD Socket API for receiving and sending packets.
- This actually works pretty well on Solaris, which doesn't censor
- the all-ones broadcast address. */
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_SOCKETS
-#endif
-
-#define USE_POLL
-
-#define EOL '\n'
-#define VOIDPTR void *
-
-/* Time stuff... */
-
-#include <time.h>
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
diff --git a/includes/cf/ultrix.h b/includes/cf/ultrix.h
deleted file mode 100644
index 661bd081..00000000
--- a/includes/cf/ultrix.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* ultrix.h
-
- System dependencies for Ultrix 4.2 (tested on 4.2a+multicast)... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-/* Ultrix uses the old 4.2BSD-style syslog(). */
-#include <sys/syslog.h>
-#define SYSLOG_4_2
-
-#include <sys/types.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <limits.h>
-
-extern int h_errno;
-
-#include <net/if.h>
-
-/*#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"*/
-
-/*
- * Ultrix systems don't have /var/run, but some sites have added it.
- * if yours is one, edit this file or define _PATH_DHCPD_PID externally.
- */
-
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/etc/dhcpd.pid"
-#endif
-
-#define int8_t char
-#define int16_t short
-#define int32_t long
-
-#define u_int8_t unsigned char /* Not quite POSIX... */
-#define u_int16_t unsigned short
-#define u_int32_t unsigned long
-
-/* The jmp_buf type is an array on ultrix, so we can't dereference it
- and must declare it differently. */
-#define jbp_decl(x) jmp_buf x
-#define jref(x) (x)
-#define jdref(x) (x)
-#define jrefproto jmp_buf
-
-#define IPTOS_LOWDELAY 0x10
-/* IPTOS_LOWCOST 0x02 XXX */
-
-/* Varargs stuff... */
-#include <varargs.h>
-#define VA_DOTDOTDOT va_alist
-#define VA_start(list, last) va_start (list)
-#define vsnprintf(buf, size, fmt, list) vsprintf (buf, fmt, list)
-#define NO_SNPRINTF
-
-#define INADDR_LOOPBACK ((u_int32_t)0x7f000001)
-#define EOL '\n'
-#define VOIDPTR void *
-
-/*
- * Time stuff...
- *
- * Definitions for an ISC DHCPD system that uses time_t
- * to represent time internally as opposed to, for example, struct timeval.)
- */
-
-#define TIME time_t
-#define GET_TIME(x) time ((x))
-
-#if defined (USE_DEFAULT_NETWORK)
-# define USE_SOCKETS
-#endif
diff --git a/includes/dhcp.h b/includes/dhcp.h
deleted file mode 100644
index 24da0d08..00000000
--- a/includes/dhcp.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/* dhcp.h
-
- Protocol structures... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#define DHCP_UDP_OVERHEAD (14 + /* Ethernet header */ \
- 20 + /* IP header */ \
- 8) /* UDP header */
-#define DHCP_SNAME_LEN 64
-#define DHCP_FILE_LEN 128
-#define DHCP_FIXED_NON_UDP 236
-#define DHCP_FIXED_LEN (DHCP_FIXED_NON_UDP + DHCP_UDP_OVERHEAD)
- /* Everything but options. */
-#define DHCP_MTU_MAX 1500
-#define DHCP_OPTION_LEN (DHCP_MTU_MAX - DHCP_FIXED_LEN)
-
-struct dhcp_packet {
- u_int8_t op; /* Message opcode/type */
- u_int8_t htype; /* Hardware addr type (see net/if_types.h) */
- u_int8_t hlen; /* Hardware addr length */
- u_int8_t hops; /* Number of relay agent hops from client */
- u_int32_t xid; /* Transaction ID */
- u_int16_t secs; /* Seconds since client started looking */
- u_int16_t flags; /* Flag bits */
- struct in_addr ciaddr; /* Client IP address (if already in use) */
- struct in_addr yiaddr; /* Client IP address */
- struct in_addr siaddr; /* IP address of next server to talk to */
- struct in_addr giaddr; /* DHCP relay agent IP address */
- char chaddr [16]; /* Client hardware address */
- char sname [DHCP_SNAME_LEN]; /* Server name */
- char file [DHCP_FILE_LEN]; /* Boot filename */
- unsigned char options [DHCP_OPTION_LEN];
- /* Optional parameters
- (actual length dependent on MTU). */
-};
-
-/* BOOTP (rfc951) message types */
-#define BOOTREQUEST 1
-#define BOOTREPLY 2
-
-/* Possible values for flags field... */
-#define BOOTP_BROADCAST 32768L
-
-/* Magic cookie validating dhcp options field (and bootp vendor
- extensions field). */
-#define DHCP_OPTIONS_COOKIE "\143\202\123\143"
-
-/* DHCP Option codes: */
-
-#define DHO_PAD 0
-#define DHO_SUBNET_MASK 1
-#define DHO_TIME_OFFSET 2
-#define DHO_ROUTERS 3
-#define DHO_TIME_SERVERS 4
-#define DHO_NAME_SERVERS 5
-#define DHO_DOMAIN_NAME_SERVERS 6
-#define DHO_LOG_SERVERS 7
-#define DHO_COOKIE_SERVERS 8
-#define DHO_LPR_SERVERS 9
-#define DHO_IMPRESS_SERVERS 10
-#define DHO_RESOURCE_LOCATION_SERVERS 11
-#define DHO_HOST_NAME 12
-#define DHO_BOOT_SIZE 13
-#define DHO_MERIT_DUMP 14
-#define DHO_DOMAIN_NAME 15
-#define DHO_SWAP_SERVER 16
-#define DHO_ROOT_PATH 17
-#define DHO_EXTENSIONS_PATH 18
-#define DHO_IP_FORWARDING 19
-#define DHO_NON_LOCAL_SOURCE_ROUTING 20
-#define DHO_POLICY_FILTER 21
-#define DHO_MAX_DGRAM_REASSEMBLY 22
-#define DHO_DEFAULT_IP_TTL 23
-#define DHO_PATH_MTU_AGING_TIMEOUT 24
-#define DHO_PATH_MTU_PLATEAU_TABLE 25
-#define DHO_INTERFACE_MTU 26
-#define DHO_ALL_SUBNETS_LOCAL 27
-#define DHO_BROADCAST_ADDRESS 28
-#define DHO_PERFORM_MASK_DISCOVERY 29
-#define DHO_MASK_SUPPLIER 30
-#define DHO_ROUTER_DISCOVERY 31
-#define DHO_ROUTER_SOLICITATION_ADDRESS 32
-#define DHO_STATIC_ROUTES 33
-#define DHO_TRAILER_ENCAPSULATION 34
-#define DHO_ARP_CACHE_TIMEOUT 35
-#define DHO_IEEE802_3_ENCAPSULATION 36
-#define DHO_DEFAULT_TCP_TTL 37
-#define DHO_TCP_KEEPALIVE_INTERVAL 38
-#define DHO_TCP_KEEPALIVE_GARBAGE 39
-#define DHO_NIS_DOMAIN 40
-#define DHO_NIS_SERVERS 41
-#define DHO_NTP_SERVERS 42
-#define DHO_VENDOR_ENCAPSULATED_OPTIONS 43
-#define DHO_NETBIOS_NAME_SERVERS 44
-#define DHO_NETBIOS_DD_SERVER 45
-#define DHO_NETBIOS_NODE_TYPE 46
-#define DHO_NETBIOS_SCOPE 47
-#define DHO_FONT_SERVERS 48
-#define DHO_X_DISPLAY_MANAGER 49
-#define DHO_DHCP_REQUESTED_ADDRESS 50
-#define DHO_DHCP_LEASE_TIME 51
-#define DHO_DHCP_OPTION_OVERLOAD 52
-#define DHO_DHCP_MESSAGE_TYPE 53
-#define DHO_DHCP_SERVER_IDENTIFIER 54
-#define DHO_DHCP_PARAMETER_REQUEST_LIST 55
-#define DHO_DHCP_MESSAGE 56
-#define DHO_DHCP_MAX_MESSAGE_SIZE 57
-#define DHO_DHCP_RENEWAL_TIME 58
-#define DHO_DHCP_REBINDING_TIME 59
-#define DHO_DHCP_CLASS_IDENTIFIER 60
-#define DHO_DHCP_CLIENT_IDENTIFIER 61
-#define DHO_DHCP_USER_CLASS_ID 77
-#define DHO_END 255
-
-/* DHCP message types. */
-#define DHCPDISCOVER 1
-#define DHCPOFFER 2
-#define DHCPREQUEST 3
-#define DHCPDECLINE 4
-#define DHCPACK 5
-#define DHCPNAK 6
-#define DHCPRELEASE 7
-#define DHCPINFORM 8
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
deleted file mode 100644
index 398b1807..00000000
--- a/includes/dhcpd.h
+++ /dev/null
@@ -1,520 +0,0 @@
-/* dhcpd.h
-
- Definitions for dhcpd... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <time.h>
-
-#include "cdefs.h"
-#include "osdep.h"
-#include "dhcp.h"
-#include "tree.h"
-#include "hash.h"
-#include "inet.h"
-
-/* A dhcp packet and the pointers to its option values. */
-struct packet {
- struct dhcp_packet *raw;
- int packet_length;
- int packet_type;
- int options_valid;
- int client_port;
- struct iaddr client_addr;
- struct interface_info *interface; /* Interface on which packet
- was received. */
- struct hardware *haddr; /* Physical link address
- of local sender (maybe gateway). */
- struct shared_network *shared_network;
- struct {
- int len;
- unsigned char *data;
- } options [256];
-};
-
-struct hardware {
- u_int8_t htype;
- u_int8_t hlen;
- u_int8_t haddr [16];
-};
-
-/* A dhcp host declaration structure. */
-struct host_decl {
- struct host_decl *n_ipaddr;
- char *name;
- struct hardware interface;
- char *filename;
- char *server_name;
- TIME default_lease_time;
- TIME max_lease_time;
- struct tree_cache *fixed_addr;
- struct tree_cache *ciaddr;
- struct tree_cache *yiaddr;
- struct tree_cache *siaddr;
- struct tree_cache *giaddr;
- struct tree_cache *options [256];
-};
-
-/* A dhcp lease declaration structure. */
-struct lease {
- struct lease *next;
- struct lease *prev;
- struct iaddr ip_addr;
- TIME starts, ends, timestamp;
- TIME offered_expiry;
- unsigned char *uid;
- int uid_len;
- struct host_decl *host;
- struct subnet *subnet;
- struct shared_network *shared_network;
- struct hardware hardware_addr;
- int state;
- int xid;
- int flags;
-# define STATIC_LEASE 1
-# define BOOTP_LEASE 2
-# define DYNAMIC_BOOTP_OK 4
-# define PERSISTENT_FLAGS (DYNAMIC_BOOTP_OK)
-# define EPHEMERAL_FLAGS (BOOTP_LEASE)
-};
-
-struct shared_network {
- struct shared_network *next;
- struct subnet *subnets;
- struct interface_info *interface;
- struct lease *leases;
- struct lease *insertion_point;
- struct lease *last_lease;
- TIME default_lease_time;
- TIME max_lease_time;
- struct tree_cache *options [256];
- int dynamic_bootp;
- char *name;
-};
-
-struct subnet {
- struct subnet *next_subnet;
- struct subnet *next_sibling;
- struct shared_network *shared_network;
- struct interface_info *interface;
- struct iaddr interface_address;
- struct iaddr net;
- struct iaddr netmask;
- TIME default_lease_time;
- TIME max_lease_time;
- struct tree_cache *options [256];
- int dynamic_bootp;
-};
-
-struct class {
- char *name;
- char *filename;
- char *server_name;
- TIME default_lease_time;
- TIME max_lease_time;
- struct tree_cache *options [256];
-};
-
-/* Information about each network interface. */
-
-struct interface_info {
- struct interface_info *next; /* Next interface in list... */
- struct shared_network *shared_network;
- /* Networks connected to this interface. */
- struct hardware hw_address; /* Its physical address. */
- char name [IFNAMSIZ]; /* Its name... */
- int rfdesc; /* Its read file descriptor. */
- int wfdesc; /* Its write file descriptor, if
- different. */
- unsigned char *rbuf; /* Read buffer, if required. */
- size_t rbuf_max; /* Size of read buffer. */
- size_t rbuf_offset; /* Current offset into buffer. */
- size_t rbuf_len; /* Length of data in buffer. */
-
- struct ifreq *tif; /* Temp. pointer to ifreq struct. */
-};
-
-struct hardware_link {
- struct hardware_link *next;
- char name [IFNAMSIZ];
- struct hardware address;
-};
-
-/* Bitmask of dhcp option codes. */
-typedef unsigned char option_mask [16];
-
-/* DHCP Option mask manipulation macros... */
-#define OPTION_ZERO(mask) (memset (mask, 0, 16))
-#define OPTION_SET(mask, bit) (mask [bit >> 8] |= (1 << (bit & 7)))
-#define OPTION_CLR(mask, bit) (mask [bit >> 8] &= ~(1 << (bit & 7)))
-#define OPTION_ISSET(mask, bit) (mask [bit >> 8] & (1 << (bit & 7)))
-#define OPTION_ISCLR(mask, bit) (!OPTION_ISSET (mask, bit))
-
-/* An option occupies its length plus two header bytes (code and
- length) for every 255 bytes that must be stored. */
-#define OPTION_SPACE(x) ((x) + 2 * ((x) / 255 + 1))
-
-/* Default path to dhcpd config file. */
-#ifdef DEBUG
-#define _PATH_DHCPD_CONF "dhcpd.conf"
-#define _PATH_DHCPD_DB "dhcpd.leases"
-#else
-#ifndef _PATH_DHCPD_CONF
-#define _PATH_DHCPD_CONF "/etc/dhcpd.conf"
-#endif
-
-#ifndef _PATH_DHCPD_DB
-#define _PATH_DHCPD_DB "/etc/dhcpd.leases"
-#endif
-
-#ifndef _PATH_DHCPD_PID
-#define _PATH_DHCPD_PID "/var/run/dhcpd.pid"
-#endif
-#endif
-
-#define MAX_TIME 0x7fffffff
-#define MIN_TIME 0
-
-/* External definitions... */
-
-/* options.c */
-
-void parse_options PROTO ((struct packet *));
-void parse_option_buffer PROTO ((struct packet *, unsigned char *, int));
-void cons_options PROTO ((struct packet *, struct packet *,
- struct tree_cache **, int));
-/* void new_cons_options PROTO ((struct packet *, struct packet *,
- struct tree_cache **, int)); */
-int store_options PROTO ((unsigned char *, int, struct tree_cache **,
- unsigned char *, int, int, int));
-/* int store_option PROTO ((struct tree_cache **, unsigned char,
- unsigned char *, int, int *)); */
-char *pretty_print_option PROTO ((unsigned char, unsigned char *, int));
-
-/* errwarn.c */
-void error PROTO ((char *, ...));
-int warn PROTO ((char *, ...));
-int note PROTO ((char *, ...));
-int debug PROTO ((char *, ...));
-int parse_warn PROTO ((char *, ...));
-
-/* dhcpd.c */
-extern TIME cur_time;
-extern TIME default_lease_time;
-extern TIME max_lease_time;
-extern struct tree_cache *global_options [256];
-
-extern struct iaddr server_identifier;
-extern int server_identifier_matched;
-
-extern u_int16_t server_port;
-extern int log_priority;
-
-#ifdef USE_FALLBACK
-extern struct interface_info fallback_interface;
-#endif
-
-int main PROTO ((int, char **, char **));
-void cleanup PROTO ((void));
-
-/* conflex.c */
-int next_token PROTO ((char **, FILE *));
-int peek_token PROTO ((char **, FILE *));
-
-/* confpars.c */
-void readconf PROTO ((void));
-void read_leases PROTO ((void));
-void parse_statement PROTO ((FILE *));
-void skip_to_semi PROTO ((FILE *));
-struct host_decl *parse_host_statement PROTO ((FILE *, jrefproto));
-char *parse_host_name PROTO ((FILE *, jrefproto));
-void parse_class_statement PROTO ((FILE *, jrefproto, int));
-void parse_class_decl PROTO ((FILE *, jrefproto, struct class *));
-void parse_lease_time PROTO ((FILE *, jrefproto, TIME *));
-void parse_shared_net_statement PROTO ((FILE *, jrefproto));
-struct subnet *parse_subnet_statement PROTO ((FILE *, jrefproto,
- struct shared_network *));
-void parse_subnet_decl PROTO ((FILE *, jrefproto, struct subnet *));
-void parse_host_decl PROTO ((FILE *, jrefproto, struct host_decl *));
-void parse_hardware_decl PROTO ((FILE *, jrefproto, struct host_decl *));
-struct hardware parse_hardware_addr PROTO ((FILE *, jrefproto));
-char *parse_filename_decl PROTO ((FILE *, jrefproto));
-char *parse_servername_decl PROTO ((FILE *, jrefproto));
-struct tree *parse_ip_addr_or_hostname PROTO ((FILE *, jrefproto, int));
-void parse_fixed_addr_decl PROTO ((FILE *, jrefproto, struct host_decl *));
-void parse_option_decl PROTO ((FILE *, jrefproto, struct tree_cache **));
-TIME parse_timestamp PROTO ((FILE *, jrefproto));
-TIME parse_date PROTO ((FILE *, jrefproto));
-struct lease *parse_lease_statement PROTO ((FILE *, jrefproto));
-void parse_address_range PROTO ((FILE *, jrefproto, struct subnet *));
-unsigned char *parse_numeric_aggregate PROTO ((FILE *, jrefproto,
- unsigned char *, int *,
- int, int, int));
-void convert_num PROTO ((unsigned char *, char *, int, int));
-
-/* tree.c */
-pair cons PROTO ((caddr_t, pair));
-struct tree_cache *tree_cache PROTO ((struct tree *));
-struct tree *tree_host_lookup PROTO ((char *));
-struct dns_host_entry *enter_dns_host PROTO ((char *));
-struct tree *tree_const PROTO ((unsigned char *, int));
-struct tree *tree_concat PROTO ((struct tree *, struct tree *));
-struct tree *tree_limit PROTO ((struct tree *, int));
-int tree_evaluate PROTO ((struct tree_cache *));
-
-/* dhcp.c */
-void dhcp PROTO ((struct packet *));
-void dhcpdiscover PROTO ((struct packet *));
-void dhcprequest PROTO ((struct packet *));
-void dhcprelease PROTO ((struct packet *));
-void dhcpdecline PROTO ((struct packet *));
-void dhcpinform PROTO ((struct packet *));
-void nak_lease PROTO ((struct packet *, struct iaddr *cip));
-void ack_lease PROTO ((struct packet *, struct lease *, unsigned char, TIME));
-struct lease *find_lease PROTO ((struct packet *));
-struct lease *mockup_lease PROTO ((struct packet *, struct host_decl *));
-
-/* bootp.c */
-void bootp PROTO ((struct packet *));
-
-/* memory.c */
-void enter_host PROTO ((struct host_decl *));
-struct host_decl *find_hosts_by_haddr PROTO ((int, unsigned char *, int));
-struct host_decl *find_hosts_by_uid PROTO ((unsigned char *, int));
-struct subnet *find_host_for_network PROTO ((struct host_decl **,
- struct iaddr *,
- struct shared_network *));
-void new_address_range PROTO ((struct iaddr, struct iaddr,
- struct subnet *, int));
-extern struct subnet *find_grouped_subnet PROTO ((struct shared_network *,
- struct iaddr));
-extern struct subnet *find_subnet PROTO ((struct iaddr));
-void enter_shared_network PROTO ((struct shared_network *));
-void enter_subnet PROTO ((struct subnet *));
-void enter_lease PROTO ((struct lease *));
-int supersede_lease PROTO ((struct lease *, struct lease *, int));
-void release_lease PROTO ((struct lease *));
-void abandon_lease PROTO ((struct lease *));
-struct lease *find_lease_by_uid PROTO ((unsigned char *, int));
-struct lease *find_lease_by_hw_addr PROTO ((unsigned char *, int));
-struct lease *find_lease_by_ip_addr PROTO ((struct iaddr));
-struct class *add_class PROTO ((int, char *));
-struct class *find_class PROTO ((int, char *, int));
-void write_leases PROTO ((void));
-void dump_subnets PROTO ((void));
-
-/* alloc.c */
-VOIDPTR dmalloc PROTO ((int, char *));
-void dfree PROTO ((VOIDPTR, char *));
-struct packet *new_packet PROTO ((char *));
-struct dhcp_packet *new_dhcp_packet PROTO ((char *));
-struct tree *new_tree PROTO ((char *));
-struct tree_cache *new_tree_cache PROTO ((char *));
-struct hash_table *new_hash_table PROTO ((int, char *));
-struct hash_bucket *new_hash_bucket PROTO ((char *));
-struct lease *new_lease PROTO ((char *));
-struct lease *new_leases PROTO ((int, char *));
-struct subnet *new_subnet PROTO ((char *));
-struct class *new_class PROTO ((char *));
-struct shared_network *new_shared_network PROTO ((char *));
-void free_shared_network PROTO ((struct shared_network *, char *));
-void free_class PROTO ((struct class *, char *));
-void free_subnet PROTO ((struct subnet *, char *));
-void free_lease PROTO ((struct lease *, char *));
-void free_hash_bucket PROTO ((struct hash_bucket *, char *));
-void free_hash_table PROTO ((struct hash_table *, char *));
-void free_tree_cache PROTO ((struct tree_cache *, char *));
-void free_packet PROTO ((struct packet *, char *));
-void free_dhcp_packet PROTO ((struct dhcp_packet *, char *));
-void free_tree PROTO ((struct tree *, char *));
-
-/* print.c */
-char *print_hw_addr PROTO ((int, int, unsigned char *));
-void print_lease PROTO ((struct lease *));
-void dump_raw PROTO ((unsigned char *, int));
-void dump_packet PROTO ((struct packet *));
-void hash_dump PROTO ((struct hash_table *));
-
-/* socket.c */
-#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
- || defined (USE_SOCKET_FALLBACK)
-int if_register_socket PROTO ((struct interface_info *, struct ifreq *));
-#endif
-
-#ifdef USE_SOCKET_FALLBACK
-void if_register_fallback PROTO ((struct interface_info *, struct ifreq *));
-size_t send_fallback PROTO ((struct interface_info *,
- struct packet *, struct dhcp_packet *, size_t,
- struct in_addr,
- struct sockaddr_in *, struct hardware *));
-#endif
-
-#ifdef USE_SOCKET_SEND
-void if_register_send PROTO ((struct interface_info *, struct ifreq *));
-size_t send_packet PROTO ((struct interface_info *,
- struct packet *, struct dhcp_packet *, size_t,
- struct in_addr,
- struct sockaddr_in *, struct hardware *));
-#endif
-#ifdef USE_SOCKET_RECEIVE
-void if_register_receive PROTO ((struct interface_info *, struct ifreq *));
-size_t receive_packet PROTO ((struct interface_info *,
- unsigned char *, size_t,
- struct sockaddr_in *, struct hardware *));
-#endif
-
-/* bpf.c */
-#if defined (USE_BPF_SEND) || defined (USE_BPF_RECEIVE)
-int if_register_bpf PROTO ( (struct interface_info *, struct ifreq *));
-#endif
-#ifdef USE_BPF_SEND
-void if_register_send PROTO ((struct interface_info *, struct ifreq *));
-size_t send_packet PROTO ((struct interface_info *,
- struct packet *, struct dhcp_packet *, size_t,
- struct in_addr,
- struct sockaddr_in *, struct hardware *));
-#endif
-#ifdef USE_BPF_RECEIVE
-void if_register_receive PROTO ((struct interface_info *, struct ifreq *));
-size_t receive_packet PROTO ((struct interface_info *,
- unsigned char *, size_t,
- struct sockaddr_in *, struct hardware *));
-#endif
-
-/* nit.c */
-#ifdef USE_NIT_SEND
-void if_register_send PROTO ((struct interface_info *, struct ifreq *));
-size_t send_packet PROTO ((struct interface_info *,
- struct packet *, struct dhcp_packet *, size_t,
- struct in_addr,
- struct sockaddr_in *, struct hardware *));
-#endif
-#ifdef USE_NIT_RECEIVE
-void if_register_receive PROTO ((struct interface_info *, struct ifreq *));
-size_t receive_packet PROTO ((struct interface_info *,
- unsigned char *, size_t,
- struct sockaddr_in *, struct hardware *));
-#endif
-
-/* raw.c */
-#ifdef USE_RAW_SEND
-void if_register_send PROTO ((struct interface_info *, struct ifreq *));
-size_t send_packet PROTO ((struct interface_info *,
- struct packet *, struct dhcp_packet *, size_t,
- struct in_addr,
- struct sockaddr_in *, struct hardware *));
-#endif
-
-/* dispatch.c */
-struct interface_info *interfaces;
-void discover_interfaces PROTO ((void));
-void dispatch PROTO ((void));
-void do_packet PROTO ((struct interface_info *,
- unsigned char *, int,
- unsigned short, struct iaddr, struct hardware *));
-int locate_network PROTO ((struct packet *));
-
-/* hash.c */
-struct hash_table *new_hash PROTO ((void));
-void add_hash PROTO ((struct hash_table *, char *, int, unsigned char *));
-void delete_hash_entry PROTO ((struct hash_table *, char *, int));
-unsigned char *hash_lookup PROTO ((struct hash_table *, char *, int));
-
-/* tables.c */
-extern struct option dhcp_options [256];
-extern unsigned char dhcp_option_default_priority_list [];
-extern int sizeof_dhcp_option_default_priority_list;
-extern char *hardware_types [256];
-extern struct hash_table universe_hash;
-extern struct universe dhcp_universe;
-void initialize_universes PROTO ((void));
-
-/* convert.c */
-u_int32_t getULong PROTO ((unsigned char *));
-int32_t getLong PROTO ((unsigned char *));
-u_int16_t getUShort PROTO ((unsigned char *));
-int16_t getShort PROTO ((unsigned char *));
-void putULong PROTO ((unsigned char *, u_int32_t));
-void putLong PROTO ((unsigned char *, int32_t));
-void putUShort PROTO ((unsigned char *, u_int16_t));
-void putShort PROTO ((unsigned char *, int16_t));
-
-/* inet.c */
-struct iaddr subnet_number PROTO ((struct iaddr, struct iaddr));
-struct iaddr ip_addr PROTO ((struct iaddr, struct iaddr, u_int32_t));
-u_int32_t host_addr PROTO ((struct iaddr, struct iaddr));
-int addr_eq PROTO ((struct iaddr, struct iaddr));
-char *piaddr PROTO ((struct iaddr));
-
-/* dhclient.c */
-void dhcpoffer PROTO ((struct packet *));
-void dhcpack PROTO ((struct packet *));
-void dhcpnak PROTO ((struct packet *));
-void send_discover PROTO ((struct interface_info *));
-void send_request PROTO ((struct packet *));
-
-/* db.c */
-int write_lease PROTO ((struct lease *));
-int commit_leases PROTO ((void));
-void db_startup PROTO ((void));
-void new_lease_file PROTO ((void));
-
-/* packet.c */
-void assemble_hw_header PROTO ((struct interface_info *, unsigned char *,
- int *, struct hardware *));
-void assemble_udp_ip_header PROTO ((struct interface_info *, unsigned char *,
- int *, u_int32_t, u_int32_t, u_int16_t,
- unsigned char *, int));
-size_t decode_hw_header PROTO ((struct interface_info *, unsigned char *,
- int, struct hardware *));
-size_t decode_udp_ip_header PROTO ((struct interface_info *, unsigned char *,
- int, struct sockaddr_in *,
- unsigned char *, int));
diff --git a/includes/dhctoken.h b/includes/dhctoken.h
deleted file mode 100644
index 2d37a493..00000000
--- a/includes/dhctoken.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* dhctoken.h
-
- Tokens for config file lexer and parser. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#define SEMI ';'
-#define DOT '.'
-#define COLON ':'
-#define COMMA ','
-#define SLASH '/'
-
-#define FIRST_TOKEN HOST
-#define HOST 256
-#define HARDWARE 257
-#define FILENAME 258
-#define FIXED_ADDR 259
-#define OPTION 260
-#define ETHERNET 261
-#define STRING 262
-#define NUMBER 263
-#define NUMBER_OR_ATOM 264
-#define ATOM 265
-#define TIMESTAMP 266
-#define STARTS 267
-#define ENDS 268
-#define UID 269
-#define CLASS 270
-#define LEASE 271
-#define RANGE 272
-#define PACKET 273
-#define CIADDR 274
-#define YIADDR 275
-#define SIADDR 276
-#define GIADDR 277
-#define SUBNET 278
-#define NETMASK 279
-#define DEFAULT_LEASE_TIME 280
-#define MAX_LEASE_TIME 281
-#define VENDOR_CLASS 282
-#define USER_CLASS 283
-#define SHARED_NETWORK 284
-#define SERVER_NAME 285
-#define DYNAMIC_BOOTP 286
-#define SERVER_IDENTIFIER 287
-
-#define is_identifier(x) ((x) >= FIRST_TOKEN && \
- (x) != STRING && \
- (x) != NUMBER && \
- (x) != EOF)
diff --git a/includes/hash.h b/includes/hash.h
deleted file mode 100644
index d30072b3..00000000
--- a/includes/hash.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* hash.h
-
- Definitions for hashing... */
-
-/*
- * Copyright (c) 1995 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#define DEFAULT_HASH_SIZE 97
-
-struct hash_bucket {
- struct hash_bucket *next;
- char *name;
- int len;
- unsigned char *value;
-};
-
-struct hash_table {
- int hash_count;
- struct hash_bucket *buckets [DEFAULT_HASH_SIZE];
-};
-
diff --git a/includes/inet.h b/includes/inet.h
deleted file mode 100644
index 758573e9..00000000
--- a/includes/inet.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* inet.h
-
- Portable definitions for internet addresses */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-/* An internet address of up to 128 bits. */
-
-struct iaddr {
- int len;
- unsigned char iabuf [16];
-};
diff --git a/includes/osdep.h b/includes/osdep.h
deleted file mode 100644
index 7c32a590..00000000
--- a/includes/osdep.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/* osdep.h
-
- Operating system dependencies... */
-
-/*
- * Copyright (c) 1996 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE INTERNET SOFTWARE CONSORTIUM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software was written for the Internet Software Consortium by Ted Lemon
- * under a contract with Vixie Laboratories.
- */
-
-#include "site.h"
-
-/* Porting::
-
- If you add a new network API, you must add a check for it below: */
-
-#if !defined (USE_SOCKETS) && \
- !defined (USE_SOCKET_SEND) && \
- !defined (USE_SOCKET_RECEIVE) && \
- !defined (USE_RAW_SOCKETS) && \
- !defined (USE_RAW_SEND) && \
- !defined (USE_SOCKET_RECEIVE) && \
- !defined (USE_BPF) && \
- !defined (USE_BPF_SEND) && \
- !defined (USE_BPF_RECEIVE) && \
- !defined (USE_NIT) && \
- !defined (USE_NIT_SEND) && \
- !defined (USE_NIT_RECEIVE)
-# define USE_DEFAULT_NETWORK
-#endif
-
-
-/* Porting::
-
- If you add a new system configuration file, include it here: */
-
-#if defined (sun)
-# if defined (__svr4__)
-# include "cf/sunos5-5.h"
-# else
-# include "cf/sunos4.h"
-# endif
-#endif
-
-#ifdef bsdi
-# include "cf/bsdos.h"
-#endif
-
-#ifdef __NetBSD__
-# include "cf/netbsd.h"
-#endif
-
-#ifdef __FreeBSD__
-# include "cf/freebsd.h"
-#endif
-
-#if defined (__osf__) && defined (__alpha)
-# include "cf/alphaosf.h"
-#endif
-
-#ifdef ultrix
-# include "cf/ultrix.h"
-#endif
-
-#ifdef linux
-# include "cf/linux.h"
-#endif
-
-#ifdef SCO
-# include "cf/sco.h"
-#endif
-
-/* Porting::
-
- If you add a new network API, and have it set up so that it can be
- used for sending or receiving, but doesn't have to be used for both,
- then set up an ifdef like the ones below: */
-
-#ifdef USE_SOCKETS
-# define USE_SOCKET_SEND
-# define USE_SOCKET_RECEIVE
-#endif
-
-#ifdef USE_RAW_SOCKETS
-# define USE_RAW_SEND
-# define USE_SOCKET_RECEIVE
-#endif
-
-#ifdef USE_BPF
-# define USE_BPF_SEND
-# define USE_BPF_RECEIVE
-#endif
-
-#ifdef USE_NIT
-# define USE_NIT_SEND
-# define USE_NIT_RECEIVE
-#endif
-
-/* Porting::
-
- If you add support for sending packets directly out an interface,
- and your support does not do ARP or routing, you must use a fallback
- mechanism to deal with packets that need to be sent to routers.
- Currently, all low-level packet interfaces use BSD sockets as a
- fallback. */
-
-#if defined (USE_BPF_SEND) || defined (USE_NIT_SEND)
-# define USE_SOCKET_FALLBACK
-# define USE_FALLBACK
-#endif
-
-/* Porting::
-
- If you add support for sending packets directly out an interface
- and need to be able to assemble packets, add the USE_XXX_SEND
- definition for your interface to the list tested below. */
-
-#if defined (USE_RAW_SEND) || defined (USE_BPF_SEND) || defined (USE_NIT_SEND)
-# define PACKET_ASSEMBLY
-#endif
-
-/* Porting::
-
- If you add support for receiving packets directly from an interface
- and need to be able to decode raw packets, add the USE_XXX_RECEIVE
- definition for your interface to the list tested below. */
-
-#if defined (USE_RAW_RECEIVE) || defined (USE_BPF_RECEIVE) \
- || defined (USE_NIT_RECEIVE)
-# define PACKET_DECODING
-#endif
-
-/* jmp_buf is assumed to be a struct unless otherwise defined in the
- system header. */
-#ifndef jbp_decl
-# define jbp_decl(x) jmp_buf *x
-#endif
-#ifndef jref
-# define jref(x) (&(x))
-#endif
-#ifndef jdref
-# define jdref(x) (*(x))
-#endif
-#ifndef jrefproto
-# define jrefproto jmp_buf *
-#endif
-
-#ifndef BPF_FORMAT
-# define BPF_FORMAT "/dev/bpf%d"
-#endif
diff --git a/includes/site.h b/includes/site.h
deleted file mode 100644
index 15ced2c1..00000000
--- a/includes/site.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Site-specific definitions.
-
- For supported systems, you shouldn't need to make any changes here.
- However, you may want to, in order to deal with site-specific
- differences. */
-
-/* Add any site-specific definitions and inclusions here... */
-
-/* #include <site-foo-bar.h> */
-/* #define SITE_FOOBAR */
-
-/* Define this if you don't want dhcpd to run as a daemon and do want
- to see all its output printed to stdout instead of being logged via
- syslog(). This also makes dhcpd use the dhcpd.conf in its working
- directory and write the dhcpd.leases file there. */
-
-/* #define DEBUG */
-
-/* Define this to see what the parser is parsing. You probably don't
- want to see this. */
-
-/* #define DEBUG_TOKENS */
-
-/* Define this to see dumps of incoming and outgoing packets. This
- slows things down quite a bit... */
-
-/* #define DEBUG_PACKET */
-
-/* Define this if you want to see dumps of tree evaluations. The most
- common reason for doing this is to watch what happens with DNS name
- lookups. */
-
-/* #define DEBUG_EVAL */
-
-/* Define this if you want the dhcpd.pid file to go somewhere other than
- the default (which varies from system to system, but is usually either
- /etc or /var/run. */
-
-/* #define _PATH_DHCPD_PID "/var/run/dhcpd.pid" */
-
-/* Define this if you want the dhcpd.leases file (the dynamic lease database)
- to go somewhere other than the default location, which is normally
- /etc/dhcpd.leases. */
-
-/* #define _PATH_DHCPD_DB "/etc/dhcpd.leases" */
-
-/* Define this if you want the dhcpd.conf file to go somewhere other than
- the default location. By default, it goes in /etc/dhcpd.conf. */
-
-/* #define _PATH_DHCPD_CONF "/etc/dhcpd.conf" */
-
-/* Network API definitions. You do not need to choose one of these - if
- you don't choose, one will be chosen for you in your system's config
- header. */
-
-/* Define this to use the standard BSD socket API.
-
- On many systems, the BSD socket API does not provide the ability to
- send packets to the 255.255.255.255 broadcast address, which can
- prevent some clients (e.g., Win95) from seeing replies. This is
- not a problem on Solaris.
-
- In addition, the BSD socket API will not work when more than one
- network interface is configured on the server.
-
- However, the BSD socket API is about as efficient as you can get, so if
- the aforementioned problems do not matter to you, or if no other
- API is supported for your system, you may want to go with it. */
-
-/* #define USE_SOCKETS */
-
-/* Define this to use the Sun Streams NIT API.
-
- The Sun Streams NIT API is only supported on SunOS 4.x releases. */
-
-/* #define USE_NIT */
-
-/* Define this to use the Berkeley Packet Filter API.
-
- The BPF API is available on all 4.4-BSD derivatives, including
- NetBSD, FreeBSD and BSDI's BSD/OS. It's also available on
- DEC Alpha OSF/1 in a compatibility mode supported by the Alpha OSF/1
- packetfilter interface. */
-
-/* #define USE_BPF */
-
-/* Define this to use the raw socket API.
-
- The raw socket API is provided on many BSD derivatives, and provides
- a way to send out raw IP packets. It is only supported for sending
- packets - packets must be received with the regular socket API.
- This code is experimental - I've never gotten it to actually transmit
- a packet to the 255.255.255.255 broadcast address - so use it at your
- own risk. */
-
-/* #define USE_RAW_SOCKETS */
diff --git a/includes/tree.h b/includes/tree.h
deleted file mode 100644
index c6b7a3ba..00000000
--- a/includes/tree.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* tree.h
-
- Definitions for address trees... */
-
-/*
- * Copyright (c) 1995 The Internet Software Consortium. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-/* A pair of pointers, suitable for making a linked list. */
-typedef struct _pair {
- caddr_t car;
- struct _pair *cdr;
-} *pair;
-
-/* Tree node types... */
-#define TREE_CONCAT 1
-#define TREE_HOST_LOOKUP 2
-#define TREE_CONST 3
-#define TREE_LIMIT 4
-
-/* Tree structure for deferred evaluation of changing values. */
-struct tree {
- int op;
- union {
- struct concat {
- struct tree *left;
- struct tree *right;
- } concat;
- struct host_lookup {
- struct dns_host_entry *host;
- } host_lookup;
- struct const_val {
- unsigned char *data;
- int len;
- } const_val;
- struct limit {
- struct tree *tree;
- int limit;
- } limit;
- } data;
-};
-
-/* DNS host entry structure... */
-struct dns_host_entry {
- char *hostname;
- unsigned char *data;
- int data_len;
- int buf_len;
- TIME timeout;
-};
-
-struct tree_cache {
- unsigned char *value;
- int len;
- int buf_size;
- TIME timeout;
- struct tree *tree;
-};
-
-struct universe {
- char *name;
- struct hash_table *hash;
- struct option *options [256];
-};
-
-struct option {
- char *name;
- char *format;
- struct universe *universe;
- unsigned char code;
-};
diff --git a/server/bootp.c b/server/bootp.c
deleted file mode 100644
index 427499b8..00000000
--- a/server/bootp.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* bootp.c
-
- BOOTP Protocol support. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-void bootp (packet)
- struct packet *packet;
-{
- int result;
- struct host_decl *hp;
- struct host_decl *host = (struct host_decl *)0;
- struct packet outgoing;
- struct dhcp_packet raw;
- struct sockaddr_in to;
- struct hardware hto;
- struct tree_cache *options [256];
- struct subnet *subnet;
- struct lease *lease;
- struct iaddr ip_address;
- int i;
-
- note ("BOOTREQUEST from %s", print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- if (!locate_network (packet))
- return;
-
- hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen);
-
- lease = find_lease (packet);
-
- /* Find an IP address in the host_decl that matches the
- specified network. */
- if (hp)
- subnet = find_host_for_network (&hp, &ip_address,
- packet -> shared_network);
- else
- subnet = (struct subnet *)0;
-
- if (!subnet) {
- /* We didn't find an applicable host declaration.
- Just in case we may be able to dynamically assign
- an address, see if there's a host declaration
- that doesn't have an ip address associated with it. */
- if (hp) {
- for (; hp; hp = hp -> n_ipaddr) {
- if (!hp -> fixed_addr) {
- host = hp;
- }
- }
- }
-
- /* If the packet is from a host we don't know and there
- are no dynamic bootp addresses on the network it came
- in on, drop it on the floor. */
- if (!packet -> shared_network -> dynamic_bootp) {
- lose:
- note ("No applicable record for BOOTP host %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
- return;
- }
-
- /* If a lease has already been assigned through dynamic
- BOOTP, and it's still okay to use dynamic bootp on
- that lease, reassign it. */
- if (lease) {
- if ((lease -> flags & BOOTP_LEASE) &&
- (lease -> flags & DYNAMIC_BOOTP_OK)) {
- lease -> host = host;
- ack_lease (packet, lease, 0, 0);
- return;
- }
- /* If the lease was acquired with DHCP, or
- if dynamic BOOTP is no longer allowed for
- this lease, set it free. */
- release_lease (lease);
- }
-
- /* If there are dynamic bootp addresses that might be
- available, try to snag one. */
- for (lease =
- packet -> shared_network -> last_lease;
- lease && lease -> ends <= cur_time;
- lease = lease -> prev) {
- if ((lease -> flags & DYNAMIC_BOOTP_OK)) {
- lease -> host = host;
- ack_lease (packet, lease, 0, 0);
- return;
- }
- }
- goto lose;
- }
-
- /* If we don't have a fixed address for it, drop it. */
- if (!subnet) {
- note ("No fixed address for BOOTP host %s (%s)",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- hp -> name);
- return;
- }
-
- /* Set up the outgoing packet... */
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Come up with a list of options that we want to send to this
- client. Start with the per-subnet options, and then override
- those with client-specific options. */
-
- memcpy (options, subnet -> options, sizeof options);
-
- for (i = 0; i < 256; i++) {
- if (hp -> options [i])
- options [i] = hp -> options [i];
- }
-
- /* Pack the options into the buffer. Unlike DHCP, we can't
- pack options into the filename and server name buffers. */
-
- cons_options (packet, &outgoing, options, 0);
-
-
- /* Take the fields that we care about... */
- raw.op = BOOTREPLY;
- raw.htype = packet -> raw -> htype;
- raw.hlen = packet -> raw -> hlen;
- memcpy (raw.chaddr, packet -> raw -> chaddr, raw.hlen);
- memset (&raw.chaddr [raw.hlen], 0,
- (sizeof raw.chaddr) - raw.hlen);
- raw.hops = packet -> raw -> hops;
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = 0;
- raw.ciaddr = packet -> raw -> ciaddr;
- memcpy (&raw.yiaddr, ip_address.iabuf, sizeof raw.yiaddr);
-
- if (subnet -> interface_address.len)
- memcpy (&raw.siaddr, subnet -> interface_address.iabuf, 4);
- else
- memcpy (&raw.siaddr, server_identifier.iabuf, 4);
-
- raw.giaddr = packet -> raw -> giaddr;
- if (hp -> server_name) {
- strncpy (raw.sname, hp -> server_name,
- (sizeof raw.sname) - 1);
- raw.sname [(sizeof raw.sname) - 1] = 0;
- }
- if (hp -> filename) {
- strncpy (raw.file, hp -> filename,
- (sizeof raw.file) - 1);
- raw.file [(sizeof raw.file) - 1] = 0;
- }
-
- /* Set up the hardware destination address... */
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- /* Report what we're doing... */
- note ("BOOTREPLY for %s to %s",
- inet_ntoa (raw.yiaddr),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* Set up the parts of the address that are in common. */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- /* If this was gatewayed, send it back to the gateway... */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = server_port;
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- (struct packet *)0,
- &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
- /* Otherwise, broadcast it on the local network. */
- } else {
- to.sin_addr.s_addr = INADDR_BROADCAST;
- to.sin_port = htons (ntohs (server_port) + 1); /* XXX */
- }
-
- errno = 0;
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_packet: %m");
-}
diff --git a/server/confpars.c b/server/confpars.c
deleted file mode 100644
index a913114c..00000000
--- a/server/confpars.c
+++ /dev/null
@@ -1,1536 +0,0 @@
-/* confpars.c
-
- Parser for dhcpd config file... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include "dhctoken.h"
-
-static TIME parsed_time;
-
-/* conf-file :== statements
- declarations :== <nil> | declaration | declarations declaration */
-
-void readconf ()
-{
- FILE *cfile;
- char *val;
- int token;
-
- /* Set up the initial dhcp option universe. */
- initialize_universes ();
-
- if ((cfile = fopen (_PATH_DHCPD_CONF, "r")) == NULL)
- error ("Can't open %s: %m", _PATH_DHCPD_CONF);
- do {
- token = peek_token (&val, cfile);
- if (token == EOF)
- break;
- parse_statement (cfile);
- } while (1);
- token = next_token (&val, cfile);
-}
-
-void read_leases ()
-{
- FILE *cfile;
- char *val;
- int token;
- jmp_buf bc;
-
- /* Open the lease file... */
- if ((cfile = fopen (_PATH_DHCPD_DB, "r")) == NULL) {
- warn ("Can't open lease database %s: %m", _PATH_DHCPD_DB);
- return;
- }
- do {
- token = next_token (&val, cfile);
- if (token == EOF)
- break;
- if (token != LEASE) {
- warn ("Corrupt lease file - possible data loss!");
- skip_to_semi (cfile);
- } else {
- if (!setjmp (bc)) {
- struct lease *lease;
- lease = parse_lease_statement (cfile,
- jref (bc));
- enter_lease (lease);
- } else {
- parse_warn ("possibly corrupt lease file");
- }
- }
-
- } while (1);
-}
-
-/* statement :== host_statement */
-
-void parse_statement (cfile)
- FILE *cfile;
-{
- int token;
- char *val;
- jmp_buf bc;
-
- switch (next_token (&val, cfile)) {
- case HOST:
- if (!setjmp (bc)) {
- struct host_decl *hd =
- parse_host_statement (cfile, jref (bc));
- if (hd) {
- enter_host (hd);
- }
- }
- break;
- case LEASE:
- if (!setjmp (bc)) {
- struct lease *lease =
- parse_lease_statement (cfile, jref (bc));
- enter_lease (lease);
- }
- break;
- case TIMESTAMP:
- if (!setjmp (bc)) {
- parsed_time = parse_timestamp (cfile, jref (bc));
- }
- break;
- case SHARED_NETWORK:
- if (!setjmp (bc)) {
- parse_shared_net_statement (cfile, jref (bc));
- }
- break;
- case SUBNET:
- if (!setjmp (bc)) {
- struct shared_network *share;
- struct subnet *subnet;
- char *t, *n;
-
- share = new_shared_network ("parse_statement");
- if (!share)
- error ("No memory for shared subnet");
- share -> leases = (struct lease *)0;
- share -> last_lease = (struct lease *)0;
- share -> insertion_point = (struct lease *)0;
- share -> next = (struct shared_network *)0;
- share -> default_lease_time = default_lease_time;
- share -> max_lease_time = max_lease_time;
- memcpy (share -> options,
- global_options, sizeof global_options);
-
- subnet = parse_subnet_statement (cfile, jref (bc),
- share);
- share -> subnets = subnet;
- n = piaddr (subnet -> net);
- t = dmalloc (strlen (n) + 1, "parse_statement");
- if (!t)
- error ("no memory for subnet name");
- strcpy (t, n);
- share -> name = t;
- enter_shared_network (share);
- goto need_semi;
- }
- break;
- case VENDOR_CLASS:
- if (!setjmp (bc)) {
- parse_class_statement (cfile, jref (bc), 0);
- }
- break;
- case USER_CLASS:
- if (!setjmp (bc)) {
- parse_class_statement (cfile, jref (bc), 1);
- }
- break;
-
- case DEFAULT_LEASE_TIME:
- if (!setjmp (bc)) {
- parse_lease_time (cfile, jref (bc),
- &default_lease_time);
- goto need_semi;
- }
- break;
-
- case MAX_LEASE_TIME:
- if (!setjmp (bc)) {
- parse_lease_time (cfile, jref (bc), &max_lease_time);
- goto need_semi;
- }
- break;
-
- case OPTION:
- if (!setjmp (bc)) {
- parse_option_decl (cfile, jref (bc), global_options);
- goto need_semi;
- }
- break;
-
- case SERVER_IDENTIFIER:
- if (!setjmp (bc)) {
- struct tree_cache *server_id =
- tree_cache (parse_ip_addr_or_hostname
- (cfile, jref (bc), 0));
- if (!tree_evaluate (server_id))
- error ("server identifier is not known");
- if (server_id -> len > 4)
- warn ("server identifier evaluates to more %s",
- "than one IP address");
- server_identifier.len = 4;
- memcpy (server_identifier.iabuf,
- server_id -> value, server_identifier.len);
- goto need_semi;
- }
- break;
-
- default:
- parse_warn ("expecting a declaration.");
- skip_to_semi (cfile);
- break;
- }
- return;
-
- need_semi:
- token = next_token (&val, cfile);
- if (token != SEMI) {
- parse_warn ("semicolon expected");
- skip_to_semi (cfile);
- }
-}
-
-void skip_to_semi (cfile)
- FILE *cfile;
-{
- int token;
- char *val;
-
- do {
- token = next_token (&val, cfile);
- } while (token != SEMI && token != EOF);
-}
-
-/* host_statement :== HOST hostname declarations SEMI
- host_declarations :== <nil> | host_declaration
- | host_declarations host_declaration SEMI */
-
-struct host_decl *parse_host_statement (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- struct host_decl tmp, *perm;
-
- memset (&tmp, 0, sizeof tmp);
- tmp.name = parse_host_name (cfile, bc);
- do {
- token = peek_token (&val, cfile);
- if (token == SEMI) {
- token = next_token (&val, cfile);
- break;
- }
- parse_host_decl (cfile, bc, &tmp);
- } while (1);
- perm = (struct host_decl *)malloc (sizeof (struct host_decl));
- if (!perm)
- error ("can't allocate host decl struct for %s.", tmp.name);
- *perm = tmp;
- return perm;
-}
-
-/* host_name :== identifier | host_name DOT identifier */
-
-char *parse_host_name (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- int len = 0;
- char *s;
- char *t;
- pair c = (pair)0;
-
- /* Read a dotted hostname... */
- do {
- /* Read a token, which should be an identifier. */
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- parse_warn ("expecting an identifier in hostname");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- /* Store this identifier... */
- if (!(s = (char *)malloc (strlen (val) + 1)))
- error ("can't allocate temp space for hostname.");
- strcpy (s, val);
- c = cons ((caddr_t)s, c);
- len += strlen (s) + 1;
- /* Look for a dot; if it's there, keep going, otherwise
- we're done. */
- token = peek_token (&val, cfile);
- if (token == DOT)
- token = next_token (&val, cfile);
- } while (token == DOT);
-
- /* Assemble the hostname together into a string. */
- if (!(s = (char *)malloc (len)))
- error ("can't allocate space for hostname.");
- t = s + len;
- *--t = 0;
- while (c) {
- pair cdr = c -> cdr;
- int l = strlen ((char *)(c -> car));
- t -= l;
- memcpy (t, (char *)(c -> car), l);
- /* Free up temp space. */
- free (c -> car);
- free (c);
- c = cdr;
- if (t != s)
- *--t = '.';
- }
- return s;
-}
-
-/* class_statement :== VENDOR_CLASS STRING class_declarations SEMI
- | USER_CLASS class_declarations SEMI
- class_declarations :== <nil> | option_declaration
- | option_declarations option_declaration SEMI
-*/
-
-void parse_class_statement (cfile, bc, type)
- FILE *cfile;
- jbp_decl (bc);
- int type;
-{
- char *val;
- int token;
- struct class *class;
-
- token = next_token (&val, cfile);
- if (token != STRING) {
- parse_warn ("Expecting class name");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- class = add_class (type, val);
- if (!class)
- error ("No memory for new class");
-
- do {
- token = peek_token (&val, cfile);
- if (token == SEMI) {
- token = next_token (&val, cfile);
- break;
- } else {
- parse_class_decl (cfile, bc, class);
- }
- } while (1);
-}
-
-/* class_declaration :== filename_declaration
- | option_declaration
- | DEFAULT_LEASE_TIME NUMBER
- | MAX_LEASE_TIME NUMBER */
-
-void parse_class_decl (cfile, bc, class)
- FILE *cfile;
- jbp_decl (bc);
- struct class *class;
-{
- char *val;
- int token;
-
- token = next_token (&val, cfile);
- switch (token) {
- case FILENAME:
- class -> filename = parse_filename_decl (cfile, bc);
- break;
- case OPTION:
- parse_option_decl (cfile, bc, class -> options);
- break;
- default:
- parse_warn ("expecting a dhcp option declaration.");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- break;
- }
-}
-
-/* lease_time :== NUMBER */
-
-void parse_lease_time (cfile, bc, timep)
- FILE *cfile;
- jbp_decl (bc);
- TIME *timep;
-{
- char *val;
- int token;
-
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("Expecting numeric lease time");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- convert_num ((unsigned char *)timep, val, 10, 32);
- /* Unswap the number - convert_num returns stuff in NBO. */
- *timep = ntohl (*timep); /* XXX */
-}
-
-/* shared_network_statement :== SHARED_NETWORK subnet_statements SEMI
- subnet_statements :== subnet_statement |
- subnet_statements subnet_statement */
-
-void parse_shared_net_statement (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- struct shared_network *share;
- struct subnet *first_net = (struct subnet *)0;
- struct subnet *last_net = (struct subnet *)0;
- struct subnet *next_net;
- char *name;
-
- share = new_shared_network ("parse_shared_net_statement");
- if (!share)
- error ("No memory for shared subnet");
- share -> leases = (struct lease *)0;
- share -> last_lease = (struct lease *)0;
- share -> insertion_point = (struct lease *)0;
- share -> next = (struct shared_network *)0;
- share -> default_lease_time = default_lease_time;
- share -> max_lease_time = max_lease_time;
- memcpy (share -> options, global_options, sizeof global_options);
-
- /* Get the name of the shared network... */
- token = next_token (&val, cfile);
- if (!is_identifier (token) && token != STRING) {
- skip_to_semi (cfile);
- parse_warn ("expecting shared network name");
- longjmp (jdref (bc), 1);
- }
- if (val [0] == 0) {
- parse_warn ("zero-length shared network name");
- val = "<no-name-given>";
- }
- name = dmalloc (strlen (val), "parse_shared_net_statement");
- if (!name)
- error ("no memory for shared network name");
- strcpy (name, val);
- share -> name = name;
-
- do {
- token = next_token (&val, cfile);
- switch (token) {
- case SEMI:
- if (!first_net) {
- parse_warn ("empty shared-network decl");
- return;
- }
- share -> subnets = first_net;
- enter_shared_network (share);
- return;
-
- case SUBNET:
- next_net = parse_subnet_statement (cfile, bc, share);
- if (!first_net)
- first_net = next_net;
- if (last_net)
- last_net -> next_sibling = next_net;
- last_net = next_net;
- break;
-
- case OPTION:
- parse_option_decl (cfile, bc, share -> options);
- break;
-
- case DEFAULT_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &share -> default_lease_time);
- break;
-
- case MAX_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &share -> max_lease_time);
- break;
-
- default:
- parse_warn ("expecting subnet declaration");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- } while (1);
-}
-
-/* subnet_statement :== SUBNET net NETMASK netmask declarations
- host_declarations :== <nil> | host_declaration
- | host_declarations host_declaration SEMI */
-
-struct subnet *parse_subnet_statement (cfile, bc, share)
- FILE *cfile;
- jbp_decl (bc);
- struct shared_network *share;
-{
- char *val;
- int token;
- struct subnet *subnet;
- struct iaddr net, netmask;
- unsigned char addr [4];
- int len = sizeof addr;
-
- subnet = new_subnet ("parse_subnet_statement");
- if (!subnet)
- error ("No memory for new subnet");
- subnet -> next_subnet = subnet -> next_sibling = (struct subnet *)0;
- subnet -> shared_network = share;
- subnet -> default_lease_time = share -> default_lease_time;
- subnet -> max_lease_time = share -> max_lease_time;
- memcpy (subnet -> options, share -> options, sizeof subnet -> options);
-
- /* Get the network number... */
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- memcpy (net.iabuf, addr, len);
- net.len = len;
- subnet -> net = net;
-
- token = next_token (&val, cfile);
- if (token != NETMASK) {
- parse_warn ("Expecting netmask");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Get the netmask... */
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- memcpy (netmask.iabuf, addr, len);
- netmask.len = len;
- subnet -> netmask = netmask;
-
- enter_subnet (subnet);
-
- do {
- token = peek_token (&val, cfile);
- if (token == SEMI || token == SUBNET)
- break;
- parse_subnet_decl (cfile, bc, subnet);
- } while (1);
-
- /* If this subnet supports dynamic bootp, flag it so in the
- shared_network containing it. */
- if (subnet -> dynamic_bootp)
- share -> dynamic_bootp = 1;
- return subnet;
-}
-
-/* subnet_declaration :== hardware_declaration | filename_declaration
- | fixed_addr_declaration | option_declaration */
-
-void parse_subnet_decl (cfile, bc, decl)
- FILE *cfile;
- jbp_decl (bc);
- struct subnet *decl;
-{
- char *val;
- int token;
-
- token = next_token (&val, cfile);
- switch (token) {
- case RANGE:
- parse_address_range (cfile, bc, decl);
- break;
-
- case OPTION:
- parse_option_decl (cfile, bc, decl -> options);
- break;
-
- case DEFAULT_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &decl -> default_lease_time);
- break;
-
- case MAX_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &decl -> max_lease_time);
- break;
-
- default:
- parse_warn ("expecting a subnet declaration.");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- break;
- }
-}
-
-/* host_declaration :== hardware_declaration | filename_declaration
- | fixed_addr_declaration | option_declaration
- | max_lease_declaration | default_lease_declaration */
-
-void parse_host_decl (cfile, bc, decl)
- FILE *cfile;
- jbp_decl (bc);
- struct host_decl *decl;
-{
- char *val;
- int token;
-
- token = next_token (&val, cfile);
- switch (token) {
- case HARDWARE:
- parse_hardware_decl (cfile, bc, decl);
- break;
- case FILENAME:
- decl -> filename = parse_filename_decl (cfile, bc);
- break;
- case SERVER_NAME:
- decl -> server_name = parse_servername_decl (cfile, bc);
- break;
- case FIXED_ADDR:
- parse_fixed_addr_decl (cfile, bc, decl);
- break;
- case OPTION:
- parse_option_decl (cfile, bc, decl -> options);
- break;
- case DEFAULT_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &decl -> default_lease_time);
- break;
- case MAX_LEASE_TIME:
- parse_lease_time (cfile, bc,
- &decl -> max_lease_time);
- break;
- case CIADDR:
- decl -> ciaddr =
- tree_cache (parse_ip_addr_or_hostname (cfile, bc, 0));
- break;
- case YIADDR:
- decl -> yiaddr =
- tree_cache (parse_ip_addr_or_hostname (cfile, bc, 0));
- break;
- case SIADDR:
- decl -> siaddr =
- tree_cache (parse_ip_addr_or_hostname (cfile, bc, 0));
- break;
- case GIADDR:
- decl -> giaddr =
- tree_cache (parse_ip_addr_or_hostname (cfile, bc, 0));
- break;
- default:
- parse_warn ("expecting a dhcp option declaration.");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- break;
- }
-}
-
-/* hardware_decl :== HARDWARE ETHERNET NUMBER COLON NUMBER COLON NUMBER COLON
- NUMBER COLON NUMBER COLON NUMBER */
-
-void parse_hardware_decl (cfile, bc, decl)
- FILE *cfile;
- jbp_decl (bc);
- struct host_decl *decl;
-{
- char *val;
- int token;
- struct hardware hw;
-
- hw = parse_hardware_addr (cfile, bc);
-
- /* Copy out the information... */
- decl -> interface.htype = hw.htype;
- decl -> interface.hlen = hw.hlen;
- memcpy (decl -> interface.haddr, &hw.haddr [0], hw.hlen);
-}
-
-struct hardware parse_hardware_addr (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- int hlen;
- struct hardware rv;
-
- token = next_token (&val, cfile);
- switch (token) {
- case ETHERNET:
- rv.htype = ARPHRD_ETHER;
- hlen = 6;
- parse_numeric_aggregate (cfile, bc,
- (unsigned char *)&rv.haddr [0], &hlen,
- COLON, 16, 8);
- rv.hlen = hlen;
- break;
- default:
- parse_warn ("expecting a network hardware type");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- return rv;
-}
-
-/* filename_decl :== FILENAME STRING */
-
-char *parse_filename_decl (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- char *s;
-
- token = next_token (&val, cfile);
- if (token != STRING) {
- parse_warn ("filename must be a string");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- s = (char *)malloc (strlen (val));
- if (!s)
- error ("no memory for filename.");
- strcpy (s, val);
- return s;
-}
-
-/* servername_decl :== SERVER_NAME STRING */
-
-char *parse_servername_decl (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- char *s;
-
- token = next_token (&val, cfile);
- if (token != STRING) {
- parse_warn ("server name must be a string");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- s = (char *)malloc (strlen (val));
- if (!s)
- error ("no memory for server name.");
- strcpy (s, val);
- return s;
-}
-
-/* ip_addr_or_hostname :== ip_address | hostname
- ip_address :== NUMBER DOT NUMBER DOT NUMBER DOT NUMBER
-
- Parse an ip address or a hostname. If uniform is zero, put in
- a TREE_LIMIT node to catch hostnames that evaluate to more than
- one IP address. */
-
-struct tree *parse_ip_addr_or_hostname (cfile, bc, uniform)
- FILE *cfile;
- jbp_decl (bc);
- int uniform;
-{
- char *val;
- int token;
- unsigned char addr [4];
- int len = sizeof addr;
- char *name;
- struct tree *rv;
-
- token = peek_token (&val, cfile);
- if (is_identifier (token)) {
- name = parse_host_name (cfile, bc);
- rv = tree_host_lookup (name);
- if (!uniform)
- rv = tree_limit (rv, 4);
- } else if (token == NUMBER) {
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- rv = tree_const (addr, len);
- } else {
- parse_warn ("%s (%d): expecting IP address or hostname",
- val, token);
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- return rv;
-}
-
-
-/* fixed_addr_clause :==
- FIXED_ADDR fixed_addr_decls
-
- fixed_addr_decls :== ip_addr_or_hostname |
- fixed_addr_decls ip_addr_or_hostname */
-
-void parse_fixed_addr_decl (cfile, bc, decl)
- FILE *cfile;
- jbp_decl (bc);
- struct host_decl *decl;
-{
- char *val;
- int token;
- struct tree *tree = (struct tree *)0;
- struct tree *tmp;
-
- do {
- tmp = parse_ip_addr_or_hostname (cfile, bc, 0);
- if (tree)
- tree = tree_concat (tree, tmp);
- else
- tree = tmp;
- token = peek_token (&val, cfile);
- if (token == COMMA)
- token = next_token (&val, cfile);
- } while (token == COMMA);
- decl -> fixed_addr = tree_cache (tree);
-}
-
-/* option_declaration :== OPTION identifier DOT identifier <syntax> |
- OPTION identifier <syntax>
-
- Option syntax is handled specially through format strings, so it
- would be painful to come up with BNF for it. However, it always
- starts as above. */
-
-void parse_option_decl (cfile, bc, options)
- FILE *cfile;
- jbp_decl (bc);
- struct tree_cache **options;
-{
- char *val;
- int token;
- unsigned char buf [4];
- char *vendor;
- char *fmt;
- struct universe *universe;
- struct option *option;
- struct tree *tree = (struct tree *)0;
-
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- parse_warn ("expecting identifier after option keyword.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- vendor = dmalloc (strlen (val) + 1, "parse_option_decl");
- strcpy (vendor, val);
- token = peek_token (&val, cfile);
- if (token == DOT) {
- /* Go ahead and take the DOT token... */
- token = next_token (&val, cfile);
-
- /* The next token should be an identifier... */
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- parse_warn ("expecting identifier after '.'");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Look up the option name hash table for the specified
- vendor. */
- universe = (struct universe *)hash_lookup (&universe_hash,
- vendor, 0);
- /* If it's not there, we can't parse the rest of the
- statement. */
- if (!universe) {
- parse_warn ("no vendor named %s.", vendor);
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- } else {
- /* Use the default hash table, which contains all the
- standard dhcp option names. */
- val = vendor;
- universe = &dhcp_universe;
- }
-
- /* Look up the actual option info... */
- option = (struct option *)hash_lookup (universe -> hash, val, 0);
-
- /* If we didn't get an option structure, it's an undefined option. */
- if (!option) {
- if (val == vendor)
- parse_warn ("no option named %s", val);
- else
- parse_warn ("no option named %s for vendor %s",
- val, vendor);
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Free the initial identifier token. */
- free (vendor);
-
- /* Parse the option data... */
- do {
- /* Set a flag if this is an array of a simple type (i.e.,
- not an array of pairs of IP addresses, or something
- like that. */
- int uniform = option -> format [1] == 'A';
-
- for (fmt = option -> format; *fmt; fmt++) {
- if (*fmt == 'A')
- break;
- switch (*fmt) {
- case 't': /* Text string... */
- token = next_token (&val, cfile);
- if (token != STRING
- && !is_identifier (token)) {
- parse_warn ("expecting string.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tree = tree_concat (tree,
- tree_const (val,
- strlen (val)));
- break;
-
- case 'I': /* IP address or hostname. */
- tree = tree_concat (tree,
- parse_ip_addr_or_hostname
- (cfile, bc, uniform));
- break;
-
- case 'L': /* Unsigned 32-bit integer... */
- case 'l': /* Signed 32-bit integer... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- need_number:
- parse_warn ("expecting number.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- convert_num (buf, val, 0, 32);
- tree = tree_concat (tree, tree_const (buf, 4));
- break;
- case 's': /* Signed 16-bit integer. */
- case 'S': /* Unsigned 16-bit integer. */
- token = next_token (&val, cfile);
- if (token != NUMBER)
- goto need_number;
- convert_num (buf, val, 0, 16);
- tree = tree_concat (tree, tree_const (buf, 2));
- break;
- case 'b': /* Signed 8-bit integer. */
- case 'B': /* Unsigned 8-bit integer. */
- token = next_token (&val, cfile);
- if (token != NUMBER)
- goto need_number;
- convert_num (buf, val, 0, 8);
- tree = tree_concat (tree, tree_const (buf, 1));
- break;
- case 'f': /* Boolean flag. */
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- parse_warn ("expecting identifier.");
- bad_flag:
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- if (!strcasecmp (val, "true")
- || !strcasecmp (val, "on"))
- buf [0] = 1;
- else if (!strcasecmp (val, "false")
- || !strcasecmp (val, "off"))
- buf [0] = 0;
- else {
- parse_warn ("expecting boolean.");
- goto bad_flag;
- }
- tree = tree_concat (tree, tree_const (buf, 1));
- break;
- default:
- warn ("Bad format %c in parse_option_decl.",
- *fmt);
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- }
- if (*fmt == 'A') {
- token = peek_token (&val, cfile);
- if (token == COMMA) {
- token = next_token (&val, cfile);
- continue;
- }
- break;
- }
- } while (*fmt == 'A');
-
- options [option -> code] = tree_cache (tree);
-}
-
-/* timestamp :== TIMESTAMP date SEMI
-
- Timestamps are actually not used in dhcpd.conf, which is a static file,
- but rather in the database file and the journal file. */
-
-TIME parse_timestamp (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- TIME rv;
- char *val;
- int token;
-
- rv = parse_date (cfile, bc);
- token = next_token (&val, cfile);
- if (token != SEMI) {
- parse_warn ("semicolon expected");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- return rv;
-}
-
-/* lease_decl :== LEASE ip_address lease_modifiers SEMI
- lease_modifiers :== <nil>
- | lease_modifier
- | lease_modifier lease_modifiers
- lease_modifier :== STARTS date
- | ENDS date
- | UID hex_numbers
- | HOST identifier
- | CLASS identifier
- | TIMESTAMP number
- | DYNAMIC_BOOTP */
-
-struct lease *parse_lease_statement (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- char *val;
- int token;
- unsigned char addr [4];
- int len = sizeof addr;
- char *s;
- unsigned char *uid;
- int seenmask = 0;
- int seenbit;
- char tbuf [32];
- char ubuf [1024];
- static struct lease lease;
-
- /* Zap the lease structure... */
- memset (&lease, 0, sizeof lease);
-
- /* Get the address for which the lease has been issued. */
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- memcpy (lease.ip_addr.iabuf, addr, len);
- lease.ip_addr.len = len;
-
- do {
- token = next_token (&val, cfile);
- if (token == SEMI)
- break;
- strncpy (val, tbuf, sizeof tbuf);
- tbuf [(sizeof tbuf) - 1] = 0;
-
- /* Parse any of the times associated with the lease. */
- if (token == STARTS || token == ENDS || token == TIMESTAMP) {
- TIME t;
- t = parse_date (cfile, bc);
- switch (token) {
- case STARTS:
- seenbit = 1;
- lease.starts = t;
- break;
-
- case ENDS:
- seenbit = 2;
- lease.ends = t;
- break;
-
- case TIMESTAMP:
- seenbit = 4;
- lease.timestamp = t;
- break;
- }
- } else {
- switch (token) {
- /* Colon-seperated hexadecimal octets... */
- case UID:
- seenbit = 8;
- lease.uid_len = 0;
- token = peek_token (&val, cfile);
- if (token == STRING) {
- token = next_token (&val, cfile);
- lease.uid_len = strlen (val) + 1;
- s = val;
- } else {
- parse_numeric_aggregate
- (cfile, bc, ubuf,
- &lease.uid_len, ':', 16, 8);
- s = ubuf;
- if (lease.uid_len == 0) {
- parse_warn ("zero-length uid");
- seenbit = 0;
- break;
- }
- }
- lease.uid = (unsigned char *)
- malloc (lease.uid_len);
- if (!lease.uid) {
- error ("No memory for lease uid");
- }
- memcpy (lease.uid, s, lease.uid_len);
- break;
-
-#if 0
- case HOST:
- seenbit = 16;
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- lease.host =
- find_host_by_name (val);
- if (!lease.host)
- parse_warn ("lease host ``%s'' is %s",
- val,
- "no longer known.");
- break;
-#endif
-
- case CLASS:
- seenbit = 32;
- token = next_token (&val, cfile);
- if (!is_identifier (token)) {
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- /* for now, we aren't using this. */
- break;
-
- case HARDWARE:
- seenbit = 64;
- lease.hardware_addr
- = parse_hardware_addr (cfile, bc);
- break;
-
- case DYNAMIC_BOOTP:
- seenbit = 128;
- lease.flags |= BOOTP_LEASE;
- break;
-
- default:
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- }
- if (seenmask & seenbit) {
- parse_warn ("Too many %s declarations in lease %s\n",
- tbuf, piaddr (lease.ip_addr));
- } else
- seenmask |= seenbit;
- } while (1);
- return &lease;
-}
-
-/* address_range :== RANGE ip_address ip_address |
- RANGE dynamic_bootp_statement ip_address ip_address */
-
-void parse_address_range (cfile, bc, subnet)
- FILE *cfile;
- jbp_decl (bc);
- struct subnet *subnet;
-{
- struct iaddr low, high;
- unsigned char addr [4];
- int len = sizeof addr;
- int token;
- char *val;
- int dynamic = 0;
-
- if ((token = peek_token (&val, cfile)) == DYNAMIC_BOOTP) {
- token = next_token (&val, cfile);
- subnet -> dynamic_bootp = dynamic = 1;
- }
-
- /* Get the bottom address in the range... */
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- memcpy (low.iabuf, addr, len);
- low.len = len;
-
- /* Get the top address in the range... */
- parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
- memcpy (high.iabuf, addr, len);
- high.len = len;
-
- /* Create the new address range... */
- new_address_range (low, high, subnet, dynamic);
-}
-
-/* date :== NUMBER NUMBER/NUMBER/NUMBER NUMBER:NUMBER:NUMBER
-
- Dates are always in GMT; first number is day of week; next is
- year/month/day; next is hours:minutes:seconds on a 24-hour
- clock. */
-
-TIME parse_date (cfile, bc)
- FILE *cfile;
- jbp_decl (bc);
-{
- TIME t;
- struct tm tm;
- char *val;
- int token;
-
- /* Day of week... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric day of week expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_wday = atoi (val);
-
- /* Year... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric year expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_year = atoi (val);
- if (tm.tm_year > 1900)
- tm.tm_year -= 1900;
-
- /* Slash seperating year from month... */
- token = next_token (&val, cfile);
- if (token != SLASH) {
- parse_warn ("expected slash seperating year from month.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Month... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric month expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_mon = atoi (val) - 1;
-
- /* Slash seperating month from day... */
- token = next_token (&val, cfile);
- if (token != SLASH) {
- parse_warn ("expected slash seperating month from day.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Month... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric day of month expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_mday = atoi (val);
-
- /* Hour... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric hour expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_hour = atoi (val);
-
- /* Colon seperating hour from minute... */
- token = next_token (&val, cfile);
- if (token != COLON) {
- parse_warn ("expected colon seperating hour from minute.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Minute... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric minute expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_min = atoi (val);
-
- /* Colon seperating minute from second... */
- token = next_token (&val, cfile);
- if (token != COLON) {
- parse_warn ("expected colon seperating hour from minute.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
-
- /* Minute... */
- token = next_token (&val, cfile);
- if (token != NUMBER) {
- parse_warn ("numeric minute expected.");
- if (token != SEMI)
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- tm.tm_sec = atoi (val);
- tm.tm_isdst = 0;
-
- /* XXX */ /* We assume that mktime does not use tm_yday. */
- tm.tm_yday = 0;
-
- return mktime (&tm);
-}
-
-/* No BNF for numeric aggregates - that's defined by the caller. What
- this function does is to parse a sequence of numbers seperated by
- the token specified in seperator. If max is zero, any number of
- numbers will be parsed; otherwise, exactly max numbers are
- expected. Base and size tell us how to internalize the numbers
- once they've been tokenized. */
-
-unsigned char *parse_numeric_aggregate (cfile, bc, buf,
- max, seperator, base, size)
- FILE *cfile;
- jbp_decl (bc);
- unsigned char *buf;
- int *max;
- int seperator;
- int base;
- int size;
-{
- char *val;
- int token;
- unsigned char *bufp = buf, *s, *t;
- int count = 0;
- pair c = (pair)0;
-
- if (!bufp && *max) {
- bufp = (unsigned char *)malloc (*max * size / 8);
- if (!bufp)
- error ("can't allocate space for numeric aggregate");
- } else
- s = bufp;
-
- do {
- if (count) {
- token = peek_token (&val, cfile);
- if (token != seperator) {
- if (!*max)
- break;
- parse_warn ("too few numbers.");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- token = next_token (&val, cfile);
- }
- token = next_token (&val, cfile);
- /* Allow NUMBER_OR_ATOM if base is 16. */
- if (token != NUMBER &&
- (base != 16 || token != NUMBER_OR_ATOM)) {
- parse_warn ("expecting numeric value.");
- skip_to_semi (cfile);
- longjmp (jdref (bc), 1);
- }
- /* If we can, convert the number now; otherwise, build
- a linked list of all the numbers. */
- if (s) {
- convert_num (s, val, base, size);
- s += size / 8;
- } else {
- t = (unsigned char *)malloc (strlen (val) + 1);
- if (!t)
- error ("no temp space for number.");
- strcpy (t, val);
- c = cons (t, c);
- }
- } while (++count != *max);
-
- /* If we had to cons up a list, convert it now. */
- if (c) {
- bufp = (unsigned char *)malloc (count * size / 8);
- if (!bufp)
- error ("can't allocate space for numeric aggregate.");
- s = bufp;
- *max = count;
- }
- while (c) {
- pair cdr = c -> cdr;
- convert_num (s, (char *)(c -> car), base, size);
- s += size / 8;
- /* Free up temp space. */
- free (c -> car);
- free (c);
- c = cdr;
- }
- return bufp;
-}
-
-void convert_num (buf, str, base, size)
- unsigned char *buf;
- char *str;
- int base;
- int size;
-{
- char *ptr = str;
- int negative = 0;
- u_int32_t val = 0;
- int tval;
- int max;
-
- if (*ptr == '-') {
- negative = 1;
- ++ptr;
- }
-
- /* If base wasn't specified, figure it out from the data. */
- if (!base) {
- if (ptr [0] == '0') {
- if (ptr [1] == 'x') {
- base = 16;
- ptr += 2;
- } else if (isascii (ptr [1]) && isdigit (ptr [1])) {
- base = 8;
- ptr += 1;
- } else {
- base = 10;
- }
- } else {
- base = 10;
- }
- }
-
- do {
- tval = *ptr++;
- /* XXX assumes ASCII... */
- if (tval >= 'a')
- tval = tval - 'a' + 10;
- else if (tval >= 'A')
- tval = tval - 'A' + 10;
- else if (tval >= '0')
- tval -= '0';
- else {
- warn ("Bogus number: %s.", str);
- break;
- }
- if (tval >= base) {
- warn ("Bogus number: %s: digit %d not in base %d\n",
- str, tval, base);
- break;
- }
- val = val * base + tval;
- } while (*ptr);
-
- if (negative)
- max = (1 << (size - 1));
- else
- max = (1 << (size - 1)) + ((1 << (size - 1)) - 1);
- if (val > max) {
- switch (base) {
- case 8:
- warn ("value %s%lo exceeds max (%d) for precision.",
- negative ? "-" : "", val, max);
- break;
- case 16:
- warn ("value %s%lx exceeds max (%d) for precision.",
- negative ? "-" : "", val, max);
- break;
- default:
- warn ("value %s%ld exceeds max (%d) for precision.",
- negative ? "-" : "", val, max);
- break;
- }
- }
-
- if (negative) {
- switch (size) {
- case 8:
- *buf = -(unsigned long)val;
- break;
- case 16:
- putShort (buf, -(unsigned long)val);
- break;
- case 32:
- putLong (buf, -(unsigned long)val);
- break;
- default:
- warn ("Unexpected integer size: %d\n");
- break;
- }
- } else {
- switch (size) {
- case 8:
- *buf = (u_int8_t)val;
- break;
- case 16:
- putUShort (buf, (u_int16_t)val);
- break;
- case 32:
- putULong (buf, val);
- break;
- default:
- warn ("Unexpected integer size: %d\n");
- break;
- }
- }
-}
diff --git a/server/db.c b/server/db.c
deleted file mode 100644
index eb70e677..00000000
--- a/server/db.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* db.c
-
- Persistent database management routines for DHCPD... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-FILE *db_file;
-
-/* Write the specified lease to the current lease database file. */
-
-int write_lease (lease)
- struct lease *lease;
-{
- struct tm *t;
- char tbuf [64];
-
- errno = 0;
- fprintf (db_file, "lease %s\n", piaddr (lease -> ip_addr));
-
- t = gmtime (&lease -> starts);
- strftime (tbuf, sizeof tbuf, "%w %Y/%m/%d %H:%M:%S", t);
- fprintf (db_file, "\tstarts %s\n", tbuf);
-
- t = gmtime (&lease -> ends);
- strftime (tbuf, sizeof tbuf, "%w %Y/%m/%d %H:%M:%S", t);
- fprintf (db_file, "\tends %s", tbuf);
-
- if (lease -> hardware_addr.hlen) {
- fprintf (db_file, "\n\thardware %s %s",
- hardware_types [lease -> hardware_addr.htype],
- print_hw_addr (lease -> hardware_addr.htype,
- lease -> hardware_addr.hlen,
- lease -> hardware_addr.haddr));
- }
- if (lease -> uid_len) {
- int i;
- fprintf (db_file, "\n\tuid %x", lease -> uid [0]);
- for (i = 1; i < lease -> uid_len; i++)
- fprintf (db_file, ":%x", lease -> uid [i]);
- }
- if (lease -> flags & BOOTP_LEASE)
- fprintf (db_file, "\n\tdynamic-bootp");
- fputs (";\n", db_file);
- return !errno;
-}
-
-/* Commit any leases that have been written out... */
-
-int commit_leases ()
-{
- if (fflush (db_file) == EOF)
- return 0;
- if (fsync (fileno (db_file)) < 0)
- return 0;
- return 1;
-}
-
-void db_startup ()
-{
- /* Read in the existing lease file... */
- read_leases ();
-
- new_lease_file ();
-}
-
-void new_lease_file ()
-{
- char newfname [512];
- char backfname [512];
- TIME t;
-
- /* If we already have an open database, close it. */
- if (db_file) {
- fclose (db_file);
- }
-
- /* Make a temporary lease file... */
- time (&t);
- sprintf (newfname, "%s.%d", _PATH_DHCPD_DB, (int) (t & 32767));
- if ((db_file = fopen (newfname, "w")) == NULL) {
- error ("Can't start new lease file: %m");
- }
-
- /* Write out all the leases that we know of... */
- write_leases ();
-
- /* Get the old database out of the way... */
- sprintf (backfname, "%s~", _PATH_DHCPD_DB);
- unlink (backfname);
- link (_PATH_DHCPD_DB, backfname);
-
- /* Move in the new file... */
- rename (newfname, _PATH_DHCPD_DB);
-}
diff --git a/server/dhcp.c b/server/dhcp.c
deleted file mode 100644
index 4a4e1300..00000000
--- a/server/dhcp.c
+++ /dev/null
@@ -1,934 +0,0 @@
-/* dhcp.c
-
- DHCP Protocol engine. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static unsigned char dhcp_message [256];
-
-void dhcp (packet)
- struct packet *packet;
-{
- if (!locate_network (packet))
- return;
-
- switch (packet -> packet_type) {
- case DHCPDISCOVER:
- dhcpdiscover (packet);
- break;
-
- case DHCPREQUEST:
- dhcprequest (packet);
- break;
-
- case DHCPRELEASE:
- dhcprelease (packet);
- break;
-
- case DHCPDECLINE:
- dhcpdecline (packet);
- break;
-
- case DHCPINFORM:
- dhcpinform (packet);
- break;
-
- default:
- break;
- }
-}
-
-void dhcpdiscover (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet);
- struct host_decl *hp;
-
- note ("DHCPDISCOVER from %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* If we didn't find a lease, try to allocate one... */
- if (!lease) {
- lease = packet -> shared_network -> last_lease;
-
- /* If there are no leases in that subnet that have
- expired, we have nothing to offer this client. */
- if (lease -> ends > cur_time) {
- note ("no free leases on subnet %s",
- packet -> shared_network -> name);
- return;
- }
-
- /* Try to find a host_decl that matches the client
- identifier or hardware address on the packet, and
- has no fixed IP address. If there is one, hang
- it off the lease so that its option definitions
- can be used. */
- if (((packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len
- != 0) &&
- ((hp = find_hosts_by_uid
- (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len))
- != (struct host_decl *)0)) ||
- ((hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen))
- != (struct host_decl *)0)) {
- for (; hp; hp = hp -> n_ipaddr) {
- if (!hp -> fixed_addr) {
- lease -> host = hp;
- break;
- }
- }
- } else {
- lease -> host = (struct host_decl *)0;
- }
- }
-
- ack_lease (packet, lease, DHCPOFFER, cur_time + 120);
-}
-
-void dhcprequest (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet);
- struct iaddr cip;
- struct subnet *subnet;
- struct lease *ip_lease;
-
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
- cip.len = 4;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- 4);
- } else {
- cip.len = 4;
- memcpy (cip.iabuf, &packet -> raw -> ciaddr.s_addr, 4);
- }
-
- note ("DHCPREQUEST for %s from %s",
- piaddr (cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* If a client on our local network wants to renew a lease on
- an address off our local network, NAK it. */
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
- subnet = find_grouped_subnet (packet -> shared_network, cip);
- if (!subnet) {
- nak_lease (packet, &cip);
- return;
- }
- } else if (packet -> raw -> ciaddr.s_addr) {
- subnet = find_grouped_subnet (packet -> shared_network, cip);
- if (!subnet) {
- nak_lease (packet, &cip);
- return;
- }
- }
-
- /* Look for server identifier... */
- if (packet -> options [DHO_DHCP_SERVER_IDENTIFIER].len) {
- /* If we own the lease that the client is asking for,
- and it's already been assigned to the client,
- ack it regardless. */
- if ((lease -> uid_len && lease -> uid_len ==
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len &&
- !memcmp (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- lease -> uid, lease -> uid_len)) ||
- (lease -> hardware_addr.hlen == packet -> raw -> hlen &&
- lease -> hardware_addr.htype == packet -> raw -> htype &&
- !memcmp (lease -> hardware_addr.haddr,
- packet -> raw -> chaddr,
- packet -> raw -> hlen))) {
- ack_lease (packet, lease, DHCPACK, 0);
- return;
- }
-
- /* Otherwise, if we have a lease for this client,
- release it, and in any case don't reply to the
- DHCPREQUEST. */
- if (memcmp (packet ->
- options [DHO_DHCP_SERVER_IDENTIFIER].data,
- server_identifier.iabuf, server_identifier.len)) {
- if (lease)
- release_lease (lease);
- return;
- }
- } else {
- return;
- }
-
- /* If we didn't find a lease, don't try to allocate one... */
- if (!lease) {
- nak_lease (packet, &cip);
- return;
- }
-
- ack_lease (packet, lease, DHCPACK, 0);
-}
-
-void dhcprelease (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet);
-
- note ("DHCPRELEASE of %s from %s",
- inet_ntoa (packet -> raw -> ciaddr),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* If we found a lease, release it. */
- if (lease) {
- release_lease (lease);
- }
-}
-
-void dhcpdecline (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet);
- struct iaddr cip;
-
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
- cip.len = 4;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- 4);
- } else {
- cip.len = 0;
- }
-
- note ("DHCPDECLINE on %s from %s",
- piaddr (cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* If we found a lease, mark it as unusable and complain. */
- if (lease) {
- abandon_lease (lease);
- }
-}
-
-void dhcpinform (packet)
- struct packet *packet;
-{
- note ("DHCPINFORM from %s",
- inet_ntoa (packet -> raw -> ciaddr));
-
-}
-
-void nak_lease (packet, cip)
- struct packet *packet;
- struct iaddr *cip;
-{
- struct sockaddr_in to;
- int result;
- struct dhcp_packet raw;
- unsigned char nak = DHCPNAK;
- struct packet outgoing;
- struct hardware hto;
-
- struct tree_cache *options [256];
- struct tree_cache dhcpnak_tree;
- struct tree_cache dhcpmsg_tree;
-
- memset (options, 0, sizeof options);
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Set DHCP_MESSAGE_TYPE to DHCPNAK */
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcpnak_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- /* Set DHCP_MESSAGE to whatever the message is */
- options [DHO_DHCP_MESSAGE] = &dhcpmsg_tree;
- options [DHO_DHCP_MESSAGE] -> value = dhcp_message;
- options [DHO_DHCP_MESSAGE] -> len = strlen (dhcp_message);
- options [DHO_DHCP_MESSAGE] -> buf_size = strlen (dhcp_message);
- options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0;
-
- /* Do not use the client's requested parameter list. */
- packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].len = 0;
- packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].data =
- (unsigned char *)0;
-
- /* Set up the option buffer... */
- cons_options (packet, &outgoing, options, 0);
-
-/* memset (&raw.ciaddr, 0, sizeof raw.ciaddr);*/
- memcpy (&raw.siaddr, server_identifier.iabuf, 4);
- raw.giaddr = packet -> raw -> giaddr;
- memcpy (raw.chaddr, packet -> raw -> chaddr, sizeof raw.chaddr);
- raw.hlen = packet -> raw -> hlen;
- raw.htype = packet -> raw -> htype;
-
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = packet -> raw -> flags | htons (BOOTP_BROADCAST);
- raw.hops = packet -> raw -> hops;
- raw.op = BOOTREPLY;
-
- /* Report what we're sending... */
- note ("DHCPNAK on %s to %s",
- piaddr (*cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
-#ifdef DEBUG_PACKET
- dump_packet (packet);
- dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- /* Set up the common stuff... */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- /* If this was gatewayed, send it back to the gateway.
- Otherwise, broadcast it on the local network. */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = server_port;
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
- } else {
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = packet->client_port;
- }
-
- errno = 0;
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, (struct hardware *)0);
- if (result < 0)
- warn ("send_packet: %m");
-}
-
-void ack_lease (packet, lease, offer, when)
- struct packet *packet;
- struct lease *lease;
- unsigned char offer;
- TIME when;
-{
- struct lease lt;
- TIME lease_time;
-
- int bufs = 0;
- struct packet outgoing;
- struct dhcp_packet raw;
- struct tree_cache *options [256];
- struct sockaddr_in to;
- struct hardware hto;
- int result;
-
- struct tree_cache dhcpoffer_tree;
- unsigned char lease_time_buf [4];
- struct tree_cache lease_time_tree;
- struct tree_cache server_id_tree;
- struct tree_cache vendor_class_tree;
- struct tree_cache user_class_tree;
-
- struct class *vendor_class, *user_class;
- char *filename;
- char *server_name;
- int i;
-
- if (packet -> options [DHO_DHCP_CLASS_IDENTIFIER].len) {
- vendor_class =
- find_class (0,
- packet ->
- options [DHO_DHCP_CLASS_IDENTIFIER].data,
- packet ->
- options [DHO_DHCP_CLASS_IDENTIFIER].len);
- } else {
- vendor_class = (struct class *)0;
- }
-
- if (packet -> options [DHO_DHCP_USER_CLASS_ID].len) {
- user_class =
- find_class (0,
- packet ->
- options [DHO_DHCP_USER_CLASS_ID].data,
- packet ->
- options [DHO_DHCP_USER_CLASS_ID].len);
- } else {
- user_class = (struct class *)0;
- }
-
- /* Choose a filename; first from the host_decl, if any, then from
- the user class, then from the vendor class. */
- if (lease -> host && lease -> host -> filename)
- filename = lease -> host -> filename;
- else if (user_class && user_class -> filename)
- filename = user_class -> filename;
- else if (vendor_class && vendor_class -> filename)
- filename = vendor_class -> filename;
- else filename = (char *)0;
-
- /* Choose a server name as above. */
- if (lease -> host && lease -> host -> server_name)
- server_name = lease -> host -> server_name;
- else if (user_class && user_class -> server_name)
- server_name = user_class -> server_name;
- else if (vendor_class && vendor_class -> server_name)
- server_name = vendor_class -> server_name;
- else server_name = (char *)0;
-
- /* At this point, we have a lease that we can offer the client.
- Now we construct a lease structure that contains what we want,
- and call supersede_lease to do the right thing with it. */
-
- memset (&lt, 0, sizeof lt);
-
- /* Use the ip address of the lease that we finally found in
- the database. */
- lt.ip_addr = lease -> ip_addr;
-
- /* Start now. */
- lt.starts = cur_time;
-
- /* Figure out how long a lease to assign. If this is a
- dynamic BOOTP lease, its duration must be infinite. */
- if (offer) {
- if (packet -> options [DHO_DHCP_LEASE_TIME].len == 4) {
- lease_time = getULong
- (packet -> options [DHO_DHCP_LEASE_TIME].data);
-
- /* Don't let the client ask for a longer lease than
- is supported for this subnet or host. */
- if (lease -> host && lease -> host -> max_lease_time) {
- if (lease_time >
- lease -> host -> max_lease_time)
- lease_time = (lease -> host ->
- max_lease_time);
- } else {
- if (lease_time >
- lease -> subnet -> max_lease_time)
- lease_time = (lease -> subnet ->
- max_lease_time);
- }
- } else {
- if (lease -> host
- && lease -> host -> default_lease_time)
- lease_time = (lease -> host ->
- default_lease_time);
- else
- lease_time = (lease -> subnet ->
- default_lease_time);
- }
-
- lt.offered_expiry = cur_time + lease_time;
- if (when)
- lt.ends = when;
- else
- lt.ends = lt.offered_expiry;
- } else {
- lt.offered_expiry = lt.ends = MAX_TIME;
- lt.flags = BOOTP_LEASE;
- }
-
- lt.timestamp = cur_time;
-
- /* Record the uid, if given... */
- if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
- lt.uid_len =
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len;
- lt.uid = packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data;
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data =
- (unsigned char *)0;
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len = 0;
- }
-
- /* Record the hardware address, if given... */
- lt.hardware_addr.hlen = packet -> raw -> hlen;
- lt.hardware_addr.htype = packet -> raw -> htype;
- memcpy (lt.hardware_addr.haddr, packet -> raw -> chaddr,
- packet -> raw -> hlen);
-
- lt.host = lease -> host;
- lt.subnet = lease -> subnet;
- lt.shared_network = lease -> shared_network;
-
- /* Record the transaction id... */
- lt.xid = packet -> raw -> xid;
-
- /* Don't call supersede_lease on a mocked-up lease. */
- if (lease -> flags & STATIC_LEASE)
- ;
- else
- /* Install the new information about this lease in the database.
- If this is a DHCPACK or a dynamic BOOTREPLY and we can't write
- the lease, don't ACK it (or BOOTREPLY it) either. */
- if (!(supersede_lease (lease, &lt, !offer || offer == DHCPACK)
- || (offer && offer != DHCPACK)))
- return;
-
- /* Send a response to the client... */
-
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Copy in the filename if given; otherwise, flag the filename
- buffer as available for options. */
- if (filename)
- strncpy (raw.file, filename, sizeof raw.file);
- else
- bufs |= 1;
-
- /* Copy in the server name if given; otherwise, flag the
- server_name buffer as available for options. */
- if (server_name)
- strncpy (raw.sname, server_name, sizeof raw.sname);
- else
- bufs |= 2; /* XXX */
-
- memcpy (raw.chaddr, packet -> raw -> chaddr, packet -> raw -> hlen);
- raw.hlen = packet -> raw -> hlen;
- raw.htype = packet -> raw -> htype;
-
- /* Start out with the subnet options... */
- memcpy (options, lease -> subnet -> options, sizeof options);
-
- /* Vendor and user classes are only supported for DHCP clients. */
- if (offer) {
- /* If we have a vendor class, install those options,
- superseding any subnet options. */
- if (vendor_class) {
- for (i = 0; i < 256; i++)
- if (vendor_class -> options [i])
- options [i] =
- vendor_class -> options [i];
- }
-
- /* If we have a user class, install those options,
- superseding any subnet and vendor class options. */
- if (user_class) {
- for (i = 0; i < 256; i++)
- if (user_class -> options [i])
- options [i] =
- user_class -> options [i];
- }
-
- }
-
- /* If we have a host_decl structure, install the associated
- options, superseding anything that's in the way. */
- if (lease -> host) {
- for (i = 0; i < 256; i++)
- if (lease -> host -> options [i])
- options [i] = lease -> host -> options [i];
- }
-
- /* Now, if appropriate, put in DHCP-specific options that
- override those. */
- if (offer) {
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcpoffer_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- options [DHO_DHCP_SERVER_IDENTIFIER] = &server_id_tree;
- options [DHO_DHCP_SERVER_IDENTIFIER] ->
- value = server_identifier.iabuf;
- options [DHO_DHCP_SERVER_IDENTIFIER] ->
- len = server_identifier.len;
- options [DHO_DHCP_SERVER_IDENTIFIER] ->
- buf_size = server_identifier.len;
- options [DHO_DHCP_SERVER_IDENTIFIER] ->
- timeout = 0xFFFFFFFF;
- options [DHO_DHCP_SERVER_IDENTIFIER] ->
- tree = (struct tree *)0;
-
- /* Sanity check the lease time. */
- if ((lease->offered_expiry - cur_time) < 0)
- putULong (lease_time_buf,
- lease -> subnet -> default_lease_time);
- else if (lease -> offered_expiry - cur_time >
- lease -> subnet -> max_lease_time)
- putULong (lease_time_buf,
- lease -> subnet -> max_lease_time);
- else
- putULong (lease_time_buf,
- lease -> offered_expiry - cur_time);
-
- putULong (lease_time_buf, lease -> offered_expiry - cur_time);
- options [DHO_DHCP_LEASE_TIME] = &lease_time_tree;
- options [DHO_DHCP_LEASE_TIME] -> value = lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] -> len = sizeof lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] ->
- buf_size = sizeof lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_LEASE_TIME] -> tree = (struct tree *)0;
-
- /* If we used the vendor class the client specified, we
- have to return it. */
- if (vendor_class) {
- options [DHO_DHCP_CLASS_IDENTIFIER] =
- &vendor_class_tree;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- value = (unsigned char *)vendor_class -> name;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- len = strlen (vendor_class -> name);
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- buf_size = strlen (vendor_class -> name);
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- timeout = 0xFFFFFFFF;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- tree = (struct tree *)0;
- }
-
- /* If we used the user class the client specified, we
- have to return it. */
- if (user_class) {
- options [DHO_DHCP_USER_CLASS_ID] = &user_class_tree;
- options [DHO_DHCP_USER_CLASS_ID] ->
- value = (unsigned char *)user_class -> name;
- options [DHO_DHCP_USER_CLASS_ID] ->
- len = strlen (user_class -> name);
- options [DHO_DHCP_USER_CLASS_ID] ->
- buf_size = strlen (user_class -> name);
- options [DHO_DHCP_USER_CLASS_ID] ->
- timeout = 0xFFFFFFFF;
- options [DHO_DHCP_USER_CLASS_ID] ->
- tree = (struct tree *)0;
- }
- }
-
- cons_options (packet, &outgoing, options, bufs);
-
- raw.ciaddr = packet -> raw -> ciaddr;
- memcpy (&raw.yiaddr, lease -> ip_addr.iabuf, 4);
- if (lease -> subnet -> interface_address.len)
- memcpy (&raw.siaddr,
- lease -> subnet -> interface_address.iabuf, 4);
- else
- memcpy (&raw.siaddr, server_identifier.iabuf, 4);
-
- raw.giaddr = packet -> raw -> giaddr;
-
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = packet -> raw -> flags;
- raw.hops = packet -> raw -> hops;
- raw.op = BOOTREPLY;
-
- /* Say what we're doing... */
- note ("%s on %s to %s",
- (offer
- ? (offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
- : "BOOTREPLY"),
- piaddr (lease -> ip_addr),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
-
- /* Set up the hardware address... */
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
-#ifdef DEBUG_PACKET
- dump_packet (packet);
- dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- /* If this was gatewayed, send it back to the gateway... */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = server_port;
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
-
- /* If it comes from a client who already knows its address,
- sent it directly to that client. */
- } else if (raw.ciaddr.s_addr && offer == DHCPACK) {
- to.sin_addr = packet -> raw -> ciaddr;
- to.sin_port = htons (ntohs (server_port) + 1); /* XXX */
-
- /* Otherwise, broadcast it on the local network. */
- } else {
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = htons (ntohs (server_port) + 1); /* XXX */
- }
-
-
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("sendpkt: %m");
-}
-
-struct lease *find_lease (packet)
- struct packet *packet;
-{
- struct lease *uid_lease, *ip_lease, *hw_lease;
- struct lease *lease = (struct lease *)0;
- struct iaddr cip;
- struct host_decl *hp, *host = (struct host_decl *)0;
- struct lease *fixed_lease;
-
- /* Try to find a host or lease that's been assigned to the
- specified unique client identifier. */
- if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
- /* First, try to find a fixed host entry for the specified
- client identifier... */
- hp = find_hosts_by_uid (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].len);
- if (hp) {
- host = hp;
- fixed_lease = mockup_lease (packet, hp);
- } else
- uid_lease = find_lease_by_uid
- (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].len);
- } else {
- uid_lease = (struct lease *)0;
- fixed_lease = (struct lease *)0;
- }
-
- /* If we didn't find a fixed lease using the uid, try doing
- it with the hardware address... */
- if (!fixed_lease) {
- hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen);
- if (hp) {
- host = hp; /* Save it for later. */
- fixed_lease = mockup_lease (packet, hp);
- }
- }
-
- /* Try to find a lease that's been attached to the client's
- hardware address... */
- hw_lease = find_lease_by_hw_addr (packet -> raw -> chaddr,
- packet -> raw -> hlen);
-
- /* Try to find a lease that's been allocated to the client's
- IP address. */
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len &&
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len
- <= sizeof cip.iabuf) {
- cip.len = packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len);
- memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);
- ip_lease = find_lease_by_ip_addr (cip);
- } else
- ip_lease = (struct lease *)0;
-
- /* Toss extra pointers to the same lease... */
- if (ip_lease == hw_lease)
- ip_lease = (struct lease *)0;
- if (hw_lease == uid_lease)
- hw_lease = (struct lease *)0;
- if (ip_lease == uid_lease)
- ip_lease = (struct lease *)0;
-
- /* If we got an ip address lease, make sure it isn't assigned to
- some *other* client! If it was assigned to this client, we'd
- have zeroed it out above, so the only way we can take it at this
- point is if some other client had it but it's timed out, or if no
- other client has ever had it. */
- if (ip_lease &&
- ip_lease -> ends >= cur_time)
- ip_lease = (struct lease *)0;
-
- /* If we've already eliminated the lease, it wasn't there to
- begin with. If we have come up with a matching lease,
- set the message to bad network in case we have to throw it out. */
- if (!ip_lease && !hw_lease && !uid_lease) {
- strcpy (dhcp_message, "requested address not available");
- } else {
- strcpy (dhcp_message, "requested address on bad subnet");
- }
-
- /* Now eliminate leases that are on the wrong network... */
- if (ip_lease &&
- (packet -> shared_network != ip_lease -> shared_network)) {
- release_lease (ip_lease);
- ip_lease = (struct lease *)0;
- }
- if (uid_lease &&
- (packet -> shared_network != uid_lease -> shared_network)) {
- release_lease (uid_lease);
- uid_lease = (struct lease *)0;
- }
- if (hw_lease &&
- (packet -> shared_network != hw_lease -> shared_network)) {
- release_lease (hw_lease);
- hw_lease = (struct lease *)0;
- }
-
- /* At this point, if fixed_lease is nonzero, we can assign it to
- this client. */
- if (fixed_lease)
- lease = fixed_lease;
-
- /* If we got a lease that matched the ip address and don't have
- a better offer, use that; otherwise, release it. */
- if (ip_lease) {
- if (lease) {
- release_lease (ip_lease);
- } else {
- lease = ip_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* If we got a lease that matched the client identifier, we may want
- to use it, but if we already have a lease we like, we must free
- the lease that matched the client identifier. */
- if (uid_lease) {
- if (lease) {
- release_lease (uid_lease);
- } else {
- lease = uid_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* The lease that matched the hardware address is treated likewise. */
- if (hw_lease) {
- if (lease) {
- release_lease (hw_lease);
- } else {
- lease = hw_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* If we found a host_decl but no matching address, try to
- find a host_decl that has no address, and if there is one,
- hang it off the lease so that we can use the supplied
- options. */
- if (lease && host && !lease -> host) {
- for (; host; host = host -> n_ipaddr) {
- if (!host -> fixed_addr) {
- lease -> host = host;
- break;
- }
- }
- }
-
- return lease;
-}
-
-/* Search the provided host_decl structure list for an address that's on
- the specified shared network. If one is found, mock up and return a
- lease structure for it; otherwise return the null pointer. */
-
-struct lease *mockup_lease (packet, hp)
- struct packet *packet;
- struct host_decl *hp;
-{
- static struct lease mock;
-
- mock.subnet = find_host_for_network (&hp, &mock.ip_addr,
- packet -> shared_network);
- if (!mock.subnet)
- return (struct lease *)0;
- mock.next = mock.prev = (struct lease *)0;
- mock.shared_network = mock.subnet -> shared_network;
- mock.host = hp;
- mock.uid_len = 0;
- mock.hardware_addr.hlen = 0;
- mock.uid = (unsigned char *)0;
- mock.starts = mock.timestamp = mock.ends = MIN_TIME;
- mock.flags = STATIC_LEASE;
- return &mock;
-}
diff --git a/server/dhcpd.8 b/server/dhcpd.8
deleted file mode 100644
index 18abfff8..00000000
--- a/server/dhcpd.8
+++ /dev/null
@@ -1,266 +0,0 @@
-.\" dhcpd.8
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\" of its contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises. To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''. To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.Dd March 5, 1996
-.Dt dhcpd 8
-.Sh NAME
-.Nm dhcpd
-.Nd Dynamic Host Configuration Protocol server
-.Sh SYNOPSIS
-.Nm dhcpd
-.Op Fl p port
-.Sh DESCRIPTION
-.Xr dhcpd 8
-implements the Dynamic Host Configuration Protocol (DHCP) and
-the Internet Bootstrap Protocol (BOOTP). DHCP allows hosts on a
-TCP/IP network to request and be assigned IP addresses, and also to
-discover information about the network to which they are attached.
-BOOTP provides similar but much more limited functionality.
-.Sh OPERATION
-.Pp
-The DHCP protocol allows a host which is unknown to the network
-administrator to be automatically assigned a new IP address out of a
-pool of IP addresses for its network. In order for this to work, the
-network administrator allocates address pools in each subnet and
-enters them into the
-.Xr dhcpd.conf 5
-file.
-.Pp
-On startup, dhcpd reads the
-.Nm dhcpd.conf
-file and keeps the list of available addresses on each subnet in
-memory. When a host requests an address using the DHCP protocol,
-dhcpd allocates an address for it. Each such host is assigned a
-lease, which expires after an amount of time chosen by the
-administrator (by default, one day). As leases expire, the hosts to
-which they are assigned are expected to renew the leases if they wish
-to continue to use the addresses. Once a lease has expired, the host
-to which that lease is assigned is no longer permitted to use the IP
-address assigned to it.
-.Pp
-In order to keep track of leases across system reboots and server
-restarts,
-.Nm dhcpd
-keeps a list of leases it has assigned in the
-.Xr dhcpd.leases 5
-file. Before dhcpd grants a lease to a host, it records the lease in
-this file and makes sure that the contents of the file are flushed to
-disk. This ensures that even in the event of a system crash,
-.Nm dhcpd
-will not forget about a lease that it has assigned. On startup,
-after reading the
-.Nm dhcpd.conf
-file,
-.Nm dhcpd
-reads the
-.Nm dhcpd.leases
-file to refresh its memory about what leases have been assigned.
-.Pp
-New leases are appended to the end of the
-.Nm dhcpd.leases
-file. In order to prevent the file from becoming arbitrarily large,
-from time to time
-.Nm dhcpd
-creates a new
-.Nm dhcpd.leases
-file from its in-core lease database. Once this file has been written
-to disk, the old file is renamed
-.Nm dhcpd.leases~ ,
-and the new file is renamed
-.Nm dhcpd.leases .
-If the system crashes in the middle of this process,
-whichever
-.Nm dhcpd.leases
-file remains will contain all the lease information, so there is no
-need for a special crash recovery process.
-.Pp
-BOOTP support is also provided by this server. Unlike DHCP, the
-BOOTP protocol requires that the server know the hardware address of
-the client that is to be booted. The network administrator must
-determine that address, allocate an IP address for the client, and
-enter that information into the
-.Nm dhcpd.conf
-file.
-.Pp
-Whenever changes are made to the
-.Nm dhcpd.conf
-file,
-.Nm dhcpd
-must be restarted. To restart
-.Nm dhcpd ,
-send a SIGTERM (signal 15) to the process ID contained in
-.Nm /var/run/dhcpd.pid ,
-and then re-invoke
-.Nm dhcpd .
-
-.Sh CONFIGURATION
-The syntax of the
-.Xr dhcpd.conf 8
-file is discussed seperately. This section should be used as an
-overview of the configuration process, and the
-.Xr dhcpd.conf 8
-documentation should be consulted for detailed reference information.
-.Pp
-.Sh Subnets
-.Xr dhcpd 8
-needs to know the subnet numbers and netmasks of all subnets for which
-it will be providing service. In addition, in order to dynamically
-allocate addresses, it must be assigned one or more ranges of
-addresses on each subnet which it can in turn assign to client hosts
-as they boot. Thus, a very simple configuration providing DHCP
-support might look like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.250;
-.fi
-.Pp
-Multiple address ranges may be specified like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.107
- range 239.252.197.113 239.252.197.250;
-.fi
-.Pp
-If a subnet will only be provided with BOOTP service and no dynamic
-address assignment, the range clause can be left out entirely, but the
-subnet statement must appear.
-.Pp
-.Sh Lease Lengths
-DHCP leases can be assigned almost any length from zero seconds to
-infinity. What lease length makes sense for any given subnet, or for
-any given installation, will vary depending on the kinds of hosts
-being served.
-.Pp
-For example, in an office environment where systems are added from
-time to time and removed from time to time, but move relatively
-infrequently, it might make sense to allow lease times of a month of
-more. In a final test environment on a manufacturing floor, it may
-make more sense to assign a maximum lease length of 30 minutes -
-enough time to go through a simple test procedure on a network
-appliance before packaging it up for delivery.
-.Pp
-It is possible to specify two lease lengths: the default length that
-will be assigned if a client doesn't ask for any particular lease
-length, and a maximum lease length. These are specified as clauses
-to the subnet command:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.107
- default-lease-time 600
- max-lease-time 7200;
-.fi
-.Pp
-This particular subnet declaration specifies a default lease time of
-600 seconds (ten minutes), and a maximum lease time of 7200 seconds
-(two hours). Other common values would be 86400 (one day), 604800
-(one week) and 2592000 (30 days).
-.Pp
-Each subnet need not have the same lease\(emin the case of an office
-environment and a manufacturing environment served by the same DHCP
-server, it might make sense to have widely disparate values for
-default and maximum lease times on each subnet.
-.Sh BOOTP Support
-Each BOOTP client must be explicitly declared in the
-.Nm dhcpd.conf
-file. A very basic client declaration will specify the client
-network interface's hardware address and the IP address to assign to
-that client. If the client needs to be able to load a boot file from
-the server, that file's name must be specified. A simple bootp
-client declaration might look like this:
-.nf
-.sp 1
- host haagen hardware ethernet 08:00:2b:4c:59:23
- fixed-address 239.252.197.9
- filename "/tftpboot/haagen.boot";
-.fi
-.Sh Options
-DHCP (and also BOOTP with Vendor Extensions) provide a mechanism
-whereby the server can provide the client with information about how
-to configure its network interface (e.g., subnet mask), and also how
-the client can access various network services (e.g., DNS, IP routers,
-and so on).
-.Pp
-These options can be specified on a per-subnet basis, and, for BOOTP
-clients, also on a per-client basis. In the event that a BOOTP
-client declaration specifies options that are also specified in its
-subnet declaration, the options specified in the client declaration
-take precedence. An reasonably complete DHCP configuration might
-look something like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.250
- default-lease-time 600 max-lease-time 7200
- option subnet-mask 255.255.255.0
- option broadcast-address 239.252.197.255
- option routers 239.252.197.1
- option domain-name-servers 239.252.197.2, 239.252.197.3
- option domain-name "isc.org";
-.fi
-.Pp
-A bootp host on that subnet that needs to be in a different domain and
-use a different name server might be declared as follows:
-.nf
-.sp 1
- host haagen hardware ethernet 08:00:2b:4c:59:23
- fixed-address 239.252.197.9
- filename "/tftpboot/haagen.boot"
- option domain-name-servers 192.5.5.1
- option domain-name "vix.com";
-.fi
-.Pp
-A complete list of DHCP Options and their syntaxes is provided in
-.Xr dhcpd.conf 5 .
-.Sh FILES
-.Nm /etc/dhcpd.conf ,
-.Nm /etc/dhcpd.leases ,
-.Nm /var/run/dhcpd.pid ,
-.Nm /etc/dhcpd.leases~ .
-.Sh SEE ALSO
-.Xr dhcpd.conf 5 ,
-.Xr dhcpd.leases 5
-.Sh AUTHOR
-.Xr dhcpd 8
-was written by Ted Lemon
-.Nm <mellon@vix.com>
-under a contract with Vixie Labs. Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.Nm http://www.isc.org/isc .
diff --git a/server/dhcpd.c b/server/dhcpd.c
deleted file mode 100644
index 4fbee245..00000000
--- a/server/dhcpd.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* dhcpd.c
-
- DHCP Server Daemon. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static void usage PROTO ((void));
-
-TIME cur_time;
-TIME default_lease_time = 43200; /* 12 hours... */
-TIME max_lease_time = 86400; /* 24 hours... */
-struct tree_cache *global_options [256];
-
-struct iaddr server_identifier;
-int server_identifier_matched;
-
-#ifdef USE_FALLBACK
-struct interface_info fallback_interface;
-#endif
-
-u_int16_t server_port;
-int log_priority;
-
-int main (argc, argv, envp)
- int argc;
- char **argv, **envp;
-{
- struct in_addr addr;
- int port = 0;
- int i;
- struct sockaddr_in name;
- u_int32_t *addrlist = (u_int32_t *)0;
- int addrcount = 0;
- struct tree *addrtree = (struct tree *)0;
- struct servent *ent;
- int sock;
- int pid;
- int result;
- int flag;
-
-#ifdef SYSLOG_4_2
- openlog ("dhcpd", LOG_NDELAY);
- log_priority = LOG_DAEMON;
-#else
- openlog ("dhcpd", LOG_NDELAY, LOG_DAEMON);
-#endif
-
-#ifndef NO_PUTENV
- /* ensure mktime() calls are processed in UTC */
- putenv("TZ=GMT0");
-#endif /* !NO_PUTENV */
-
-#ifndef DEBUG
- setlogmask (LOG_UPTO (LOG_INFO));
-
- /* Become a daemon... */
- if ((pid = fork ()) < 0)
- error ("Can't fork daemon: %m");
- else if (pid)
- exit (0);
- /* Become session leader and get pid... */
- pid = setsid ();
-#endif
- for (i = 1; i < argc; i++) {
- if (!strcmp (argv [i], "-p")) {
- if (++i == argc)
- usage ();
- server_port = htons (atoi (argv [i]));
- debug ("binding to user-specified port %d",
- ntohs (server_port));
-#if 0
- } else if (!strcmp (argv [i], "-a")) {
- if (++i == argc)
- usage ();
- if (inet_aton (argv [i], &addr)) {
- addrtree =
- tree_concat (addrtree,
- tree_const
- ((unsigned char *)&addr,
- sizeof addr));
- } else {
- addrtree = tree_concat (addrtree,
- tree_host_lookup
- (argv [i]));
- }
-#endif
- } else
- usage ();
- }
-
- /* Default to the DHCP/BOOTP port. */
- if (!server_port)
- {
- ent = getservbyname ("dhcp", "udp");
- if (!ent)
- server_port = htons (67);
- else
- server_port = ent -> s_port;
- endservent ();
- }
-
- /* Get the current time... */
- GET_TIME (&cur_time);
-
- /* Read the dhcpd.conf file... */
- readconf ();
-
- /* Start up the database... */
- db_startup ();
-
- /* Discover all the network interfaces and initialize them. */
- discover_interfaces ();
-
- /* Write a pid file. */
- unlink (_PATH_DHCPD_PID);
- if ((i = open (_PATH_DHCPD_PID, O_WRONLY | O_CREAT, 0640)) >= 0) {
- char obuf [20];
- sprintf (obuf, "%d\n", (int)getpid ());
- write (i, obuf, strlen (obuf));
- close (i);
- }
-
- /* Receive packets and dispatch them... */
- dispatch ();
-
- /* Not reached */
- return 0;
-}
-
-/* Print usage message. */
-
-static void usage ()
-{
- error ("Usage: dhcpd [-p <port>] [-a <ip-addr>]");
-}
-
-void cleanup ()
-{
-}
diff --git a/server/dhcpd.cat8 b/server/dhcpd.cat8
deleted file mode 100644
index 5475f1db..00000000
--- a/server/dhcpd.cat8
+++ /dev/null
@@ -1,182 +0,0 @@
-dhcpd(8) NetBSD System Manager's Manual dhcpd(8)
-
-NNAAMMEE
- ddhhccppdd - Dynamic Host Configuration Protocol server
-
-SSYYNNOOPPSSIISS
- ddhhccppdd [--pp --ppoorrtt]
-
-DDEESSCCRRIIPPTTIIOONN
- dhcpd(8) implements the Dynamic Host Configuration Protocol (DHCP) and
- the Internet Bootstrap Protocol (BOOTP). DHCP allows hosts on a TCP/IP
- network to request and be assigned IP addresses, and also to discover in-
- formation about the network to which they are attached. BOOTP provides
- similar but much more limited functionality.
-
-OOPPEERRAATTIIOONN
- The DHCP protocol allows a host which is unknown to the network adminis-
- trator to be automatically assigned a new IP address out of a pool of IP
- addresses for its network. In order for this to work, the network ad-
- ministrator allocates address pools in each subnet and enters them into
- the dhcpd.conf(5) file.
-
- On startup, dhcpd reads the ddhhccppdd..ccoonnff file and keeps the list of avail-
- able addresses on each subnet in memory. When a host requests an address
- using the DHCP protocol, dhcpd allocates an address for it. Each such
- host is assigned a lease, which expires after an amount of time chosen by
- the administrator (by default, one day). As leases expire, the hosts to
- which they are assigned are expected to renew the leases if they wish to
- continue to use the addresses. Once a lease has expired, the host to
- which that lease is assigned is no longer permitted to use the IP address
- assigned to it.
-
- In order to keep track of leases across system reboots and server
- restarts, ddhhccppdd keeps a list of leases it has assigned in the
- dhcpd.leases(5) file. Before dhcpd grants a lease to a host, it records
- the lease in this file and makes sure that the contents of the file are
- flushed to disk. This ensures that even in the event of a system crash,
- ddhhccppdd will not forget about a lease that it has assigned. On startup,
- after reading the ddhhccppdd..ccoonnff file, ddhhccppdd reads the ddhhccppdd..lleeaasseess file to
- refresh its memory about what leases have been assigned.
-
- New leases are appended to the end of the ddhhccppdd..lleeaasseess file. In order
- to prevent the file from becoming arbitrarily large, from time to time
- ddhhccppdd creates a new ddhhccppdd..lleeaasseess file from its in-core lease database.
- Once this file has been written to disk, the old file is renamed
- ddhhccppdd..lleeaasseess~~, and the new file is renamed ddhhccppdd..lleeaasseess. If the system
- crashes in the middle of this process, whichever ddhhccppdd..lleeaasseess file re-
- mains will contain all the lease information, so there is no need for a
- special crash recovery process.
-
- BOOTP support is also provided by this server. Unlike DHCP, the BOOTP
- protocol requires that the server know the hardware address of the client
- that is to be booted. The network administrator must determine that ad-
- dress, allocate an IP address for the client, and enter that information
- into the ddhhccppdd..ccoonnff file.
-
- Whenever changes are made to the ddhhccppdd..ccoonnff file, ddhhccppdd must be restart-
- ed. To restart ddhhccppdd, send a SIGTERM (signal 15) to the process ID con-
- tained in //vvaarr//rruunn//ddhhccppdd..ppiidd, and then re-invoke ddhhccppdd.
-
-
-CCOONNFFIIGGUURRAATTIIOONN
- The syntax of the dhcpd.conf(8) file is discussed seperately. This sec-
- tion should be used as an overview of the configuration process, and the
- dhcpd.conf(8) documentation should be consulted for detailed reference
- information.
-
-SSuubbnneettss
- dhcpd(8) needs to know the subnet numbers and netmasks of all subnets for
- which it will be providing service. In addition, in order to dynamical-
- ly allocate addresses, it must be assigned one or more ranges of address-
- es on each subnet which it can in turn assign to client hosts as they
- boot. Thus, a very simple configuration providing DHCP support might
- look like this:
-
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.250;
-
- Multiple address ranges may be specified like this:
-
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.107
- range 239.252.197.113 239.252.197.250;
-
- If a subnet will only be provided with BOOTP service and no dynamic ad-
- dress assignment, the range clause can be left out entirely, but the sub-
- net statement must appear.
-
-LLeeaassee LLeennggtthhss
- DHCP leases can be assigned almost any length from zero seconds to infin-
- ity. What lease length makes sense for any given subnet, or for any
- given installation, will vary depending on the kinds of hosts being
- served.
-
- For example, in an office environment where systems are added from time
- to time and removed from time to time, but move relatively infrequently,
- it might make sense to allow lease times of a month of more. In a final
- test environment on a manufacturing floor, it may make more sense to as-
- sign a maximum lease length of 30 minutes - enough time to go through a
- simple test procedure on a network appliance before packaging it up for
- delivery.
-
- It is possible to specify two lease lengths: the default length that will
- be assigned if a client doesn't ask for any particular lease length, and
- a maximum lease length. These are specified as clauses to the subnet
- command:
-
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.107
- default-lease-time 600
- max-lease-time 7200;
-
- This particular subnet declaration specifies a default lease time of 600
- seconds (ten minutes), and a maximum lease time of 7200 seconds (two
- hours). Other common values would be 86400 (one day), 604800 (one week)
- and 2592000 (30 days).
-
- Each subnet need not have the same lease--in the case of an office envi-
- ronment and a manufacturing environment served by the same DHCP server,
- it might make sense to have widely disparate values for default and maxi-
- mum lease times on each subnet.
-
-BBOOOOTTPP SSuuppppoorrtt
- Each BOOTP client must be explicitly declared in the ddhhccppdd..ccoonnff file. A
- very basic client declaration will specify the client network interface's
- hardware address and the IP address to assign to that client. If the
- client needs to be able to load a boot file from the server, that file's
- name must be specified. A simple bootp client declaration might look
- like this:
-
- host haagen hardware ethernet 08:00:2b:4c:59:23
- fixed-address 239.252.197.9
- filename "/tftpboot/haagen.boot";
-
-OOppttiioonnss
- DHCP (and also BOOTP with Vendor Extensions) provide a mechanism whereby
- the server can provide the client with information about how to configure
- its network interface (e.g., subnet mask), and also how the client can
- access various network services (e.g., DNS, IP routers, and so on).
-
- These options can be specified on a per-subnet basis, and, for BOOTP
- clients, also on a per-client basis. In the event that a BOOTP client
- declaration specifies options that are also specified in its subnet dec-
- laration, the options specified in the client declaration take prece-
- dence. An reasonably complete DHCP configuration might look something
- like this:
-
- subnet 239.252.197.0 netmask 255.255.255.0
- range 239.252.197.10 239.252.197.250
- default-lease-time 600 max-lease-time 7200
- option subnet-mask 255.255.255.0
- option broadcast-address 239.252.197.255
- option routers 239.252.197.1
- option domain-name-servers 239.252.197.2, 239.252.197.3
- option domain-name "isc.org";
-
- A bootp host on that subnet that needs to be in a different domain and
- use a different name server might be declared as follows:
-
- host haagen hardware ethernet 08:00:2b:4c:59:23
- fixed-address 239.252.197.9
- filename "/tftpboot/haagen.boot"
- option domain-name-servers 192.5.5.1
- option domain-name "vix.com";
-
- A complete list of DHCP Options and their syntaxes is provided in
- dhcpd.conf(5).
-
-FFIILLEESS
- //eettcc//ddhhccppdd..ccoonnff, //eettcc//ddhhccppdd..lleeaasseess, //vvaarr//rruunn//ddhhccppdd..ppiidd,
- //eettcc//ddhhccppdd..lleeaasseess~~.
-
-SSEEEE AALLSSOO
- dhcpd.conf(5), dhcpd.leases(5)
-
-AAUUTTHHOORR
- dhcpd(8) was written by Ted Lemon <<mmeelllloonn@@vviixx..ccoomm>> under a contract with
- Vixie Labs. Funding for this project was provided by the Internet Soft-
- ware Corporation. Information about the Internet Software Consortium can
- be found at hhttttpp::////wwwwww..iisscc..oorrgg//iisscc.
-
- March 16, 1996 3
diff --git a/server/dhcpd.conf b/server/dhcpd.conf
deleted file mode 100644
index 07d0e953..00000000
--- a/server/dhcpd.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-shared-network FUGUE
- option domain-name-servers 204.254.239.2
- option domain-name "fugue.com"
- option subnet-mask 255.255.255.0 option broadcast-address 204.254.239.255
- default-lease-time 600 max-lease-time 7200
-
- subnet 204.254.239.0 netmask 255.255.255.0
- range 204.254.239.10 204.254.239.20
- option routers 204.254.239.1
- subnet 10.0.1.0 netmask 255.255.255.0
- range dynamic-bootp 10.0.1.1 10.0.1.20
- option routers 10.0.1.254;
-
-subnet 192.5.5.0 netmask 255.255.255.224
- range 192.5.5.26 192.5.5.30
- option routers 192.5.5.1
- option name-servers 192.5.5.15, 192.5.5.1
- option domain-name "vix.com"
- option subnet-mask 255.255.255.224 option broadcast-address 192.5.5.31
- default-lease-time 600 max-lease-time 7200;
-
-host passacaglia hardware ethernet 0:0:c0:5d:bd:95
- filename "vmunix.passacaglia"
- server-name "toccata.fugue.com";
-
-host fantasia hardware ethernet 08:00:07:26:c0:a5
- fixed-address fantasia.fugue.com;
diff --git a/server/dhcpd.conf.5 b/server/dhcpd.conf.5
deleted file mode 100644
index f1f2d920..00000000
--- a/server/dhcpd.conf.5
+++ /dev/null
@@ -1,712 +0,0 @@
-.\" dhcpd.conf.5
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\" of its contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises. To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''. To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.Dd March 5, 1996
-.Dt dhcpd.conf 5
-.Sh NAME
-.Nm dhcpd.conf
-.Nd dhcpd configuration file
-.Sh DESCRIPTION
-The
-.Xr dhcpd.conf 5
-file contains configuration information for
-.Xr dhcpd 8 ,
-the Dynamic Host Configuration Protocol daemon. A primer on
-configuring
-.Nm dhcpd
-is included in
-.Xr dhcpd 8 .
-This document describes the format of the file in detail, and is
-probably a better reference than a primer.
-.Pp
-The
-.Nm dhcpd.conf
-file is a free-form ASCII text file. It is parsed by a
-recursive-descent parser. Statements in the file may contain extra
-tabs and newlines for formatting purposes. Each statement in the
-file is terminated by a semicolon. Keywords in the file are
-case-insensitive.
-.Pp
-There are currently two statements that can
-meaningfully appear in the file\(emthe
-.Nm subnet
-statement, and the
-.Nm host
-statement.
-.Sh The SUBNET statement
-.Nm subnet
-.Ar subnet-number
-.Nm netmask
-.Ar netmask
-.Op Ar clauses ;
-.Pp
-.Ar subnet-number
-should be an IP address or DNS name which resolves to the subnet
-number of the subnet being described.
-.Ar netmask
-should be an IP address or DNS name which resolves to the subnet mask
-of the subnet being described. These are the only required fields
-in a subnet declaration, although it may be desirable to add one or
-more of the following clauses.
-.Pp
-Subnets for which addresses will be dynamically allocated must have
-one or more addresses reserved for future allocation by
-.Nm dhcpd .
-These addresses are allocated using the
-.Nm range
-clause.
-.Pp
-.Nm range
-.Ar lowest-address
-.Ar highest-address
-.Pp
-.Ar Lowest-address
-should be the lowest address in the range that may be assigned by
-.Nm dhcpd
-to a DHCP client.
-.Ar Highest-address
-should be the highest address in the range that may be assigned by
-.Nm dhcpd .
-If there is only one address in a range, it must be specified as both
-the lowest and highest addresses. As many
-.Nm range
-clauses as are needed may be specified in any given
-.Nm subnet
-statement.
-.Pp
-.Nm default-lease-time
-.Ar time
-.Pp
-.Ar Time
-should be the expiration time in seconds that will be assigned to a
-lease if the client requesting the lease does not ask for a specific
-expiration time. This clause may only appear once in each
-.Nm subnet
-statement.
-.Pp
-.Nm max-lease-time
-.Ar time
-.Pp
-.Ar Time
-should be the maximum expiration time in seconds that will be assigned
-to a lease if the client requesting the lease asks for a specific
-expiration time. This clause may only appear once in each
-.Nm subnet
-statement.
-.Pp
-.Nm option
-.Ar option-declaration
-.Pp
-Any number of
-.Nm
-option clauses may appear in a subnet statement. The syntax of
-option declarations is described later in this document.
-.Sh The HOST statement
-.Nm host
-.Ar hostname
-.Op Ar clauses ;
-.Pp
-There must be at least one
-.Nm host
-statement for every BOOTP client that is to be served.
-.Ar hostname
-should be a name identifying the host. It is for labelling purposes
-only, and is not used in the BOOTP protocol.
-.Pp
-.Nm hardware
-.Ar hardware-type
-.Ar hardware-address
-.Pp
-In order for a BOOTP client to be recognized, its network hardware
-address must be declared using a
-.Nm hardware
-clause in the
-.Nm host
-statement. Only one such clause can appear in any host statement.
-.Ar hardware-type
-must be the name of a physical hardware interface type. Currently,
-only the
-.Nm ethernet
-type is recognized, although support for
-.Nm token-ring
-and
-.Nm fddi
-hardware types will be added soon.
-The
-.Ar hardware-address
-should be a set of hexadecimal octets (numbers from 0 through ff)
-seperated by colons.
-.Pp
-.Nm filename
-.Ar filename
-.Pp
-If the BOOTP client needs to load a boot file (for example, a kernel
-or configuration file), the name of this file may be provided to the
-client using the
-.Nm filename
-clause. The
-.Ar filename
-should be a filename recognizable to whatever file transfer protocol
-the client can be expected to use to load the file.
-.Pp
-.Nm fixed-address
-.Ar address
-.Pp
-BOOTP clients must be assigned fixed IP addresses. The
-.Nm fixed-address
-clause is used to associate a fixed IP address with a BOOTP client.
-.Ar Address
-should be either an IP address or a DNS name which resolves to a
-single IP address.
-.Pp
-.Nm option
-.Ar option-declaration
-.Pp
-Any number of
-.Nm
-option clauses may appear in a host statement. The syntax of
-option declarations is described later in this document. If an
-option clause in a
-.Nm host
-statement conflicts with an option clause in the
-.Nm subnet
-statement for the subnet containing that host, the option clause in
-the
-.Nm host
-statement is used.
-.Pp
-.Sh Option Declarations
-.Pp
-Option declarations always start with the
-.Nm option
-keyword, followed by an option name, followed by option data. The
-option names and data formats are described below. Many of the
-options described below which set IP or TCP parameters have default
-values which will generally work perfectly well, so only those options
-whose values must be set explicitly should be included in
-.Nm subnet
-or
-.Nm host
-statements.
-.Pp
-Option data comes in a variety of formats. In order to avoid having
-to explain the formats along with each option definition below, a
-number of data types have been defined.
-.Pp
-The ip-address data type can be entered either as an explicit IP
-address (e.g., 239.254.197.10) or as a domain name (e.g.,
-haagen.isc.org). When entering a domain name, be sure that that
-domain name resolves to a single IP address.
-.Pp
-The int32 data type specifies a signed 32-bit integer. The uint32
-data type specifies an unsigned 32-bit integer. The int16 and uint16
-data types specify signed and unsigned 16-bit integers. The int8 and
-uint8 data types specify signed and unsigned 8-bit integers.
-Unsigned 8-bit integers are also sometimes referred to as octets.
-.Pp
-The string data type specifies an NVT ASCII string, which must be
-enclosed in double quotes - for example, to specify a domain-name
-option, the syntax would be
-.nf
-.sp 1
- option domain-name "isc.org"
-.fi
-.Pp
-The flag data type specifies a one-bit (boolean) number.
-.Pp
-The documentation for the various options mentioned below is taken
-from the latest IETF draft document on DHCP options.
-.Pp
-.Nm option
-.Nm subnet-mask
-.Ar ip-address
-.Pp
-The subnet mask option specifies the client's subnet mask as per RFC
-950.
-.Pp
-.Nm option
-.Nm time-offset
-.Ar int32
-.Pp
-The time-offset option specifies the offset of the client's subnet in
-seconds from Coordinated Universal Time (UTC).
-.Pp
-.Nm option
-.Nm routers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The routers option specifies a list of IP addresses for routers on the
-client's subnet. Routers should be listed in order of preference.
-.Pp
-.Nm option
-.Nm time-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The time-server option specifies a list of RFC 868 time servers
-available to the client. Servers should be listed in order of
-preference.
-.Pp
-.Nm option
-.Nm name-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The name-servers option specifies a list of IEN 116 name servers
-available to the client. Servers should be listed in order of
-preference.
-.Pp
-.Nm option
-.Nm domain-name-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The domain-name-servers option specifies a list of Domain Name System
-(STD 13, RFC 1035) name servers available to the client. Servers
-should be listed in order of preference.
-.Pp
-.Nm option
-.Nm log-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The log-server option specifies a list of MIT-LCS UDP log servers
-available to the client. Servers should be listed in order of
-preference.
-.Pp
-.Nm option
-.Nm cookie-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The cookie server option specifies a list of RFC 865 cookie
-servers available to the client. Servers should be listed in order
-of preference.
-.Pp
-.Nm option
-.Nm lpr-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The LPR server option specifies a list of RFC 1179 line printer
-servers available to the client. Servers should be listed in order
-of preference.
-.Pp
-.Nm option
-.Nm impress-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The impress-server option specifies a list of Imagen Impress servers
-available to the client. Servers should be listed in order of
-preference.
-.Pp
-.Nm option
-.Nm resource-location-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of RFC 887 Resource Location
-servers available to the client. Servers should be listed in order
-of preference.
-.Pp
-.Nm option
-.Nm host-name
-.Ar string
-.Pp
-This option specifies the name of the client. The name may or may
-not be qualified with the local domain name (it is preferable to use
-the domain-name option to specify the domain name). See RFC 1035 for
-character set restrictions.
-.Pp
-.Nm option
-.Nm boot-size
-.Ar uint16
-.Pp
-This option specifies the length in 512-octet blocks of the default
-boot image for the client.
-.Pp
-.Nm option
-.Nm merit-dump
-.Ar string
-.Pp
-This option specifies the path-name of a file to which the client's
-core image should be dumped in the event the client crashes. The
-path is formatted as a character string consisting of characters from
-the NVT ASCII character set.
-.Pp
-.Nm option
-.Nm domain-name
-.Ar string
-.Pp
-This option specifies the domain name that client should use when
-resolving hostnames via the Domain Name System.
-.Pp
-.Nm option
-.Nm swap-server
-.Ar ip-address
-.Pp
-This specifies the IP address of the client's swap server.
-.Pp
-.Nm option
-.Nm root-path
-.Ar string
-.Pp
-This option specifies the path-name that contains the client's root
-disk. The path is formatted as a character string consisting of
-characters from the NVT ASCII character set.
-.Pp
-.Nm option
-.Nm ip-forwarding
-.Ar flag
-.Pp
-This option specifies whether the client should configure its IP
-layer for packet forwarding. A value of 0 means disable IP
-forwarding, and a value of 1 means enable IP forwarding.
-.Pp
-.Nm option
-.Nm non-local-source-routing
-.Ar flag
-.Pp
-This option specifies whether the client should configure its IP
-layer to allow forwarding of datagrams with non-local source routes
-(see Section 3.3.5 of [4] for a discussion of this topic). A value
-of 0 means disallow forwarding of such datagrams, and a value of 1
-means allow forwarding.
-.Pp
-.Nm option
-.Nm policy-filter
-.Ar ip-address ip-address [
-,
-.Ar ip-address ip-address
-.Ar ... ]
-.Pp
-This option specifies policy filters for non-local source routing.
-The filters consist of a list of IP addresses and masks which specify
-destination/mask pairs with which to filter incoming source routes.
-.Pp
-Any source routed datagram whose next-hop address does not match one
-of the filters should be discarded by the client.
-.Pp
-See STD 3 (RFC1122) for further information.
-.Pp
-.Nm option
-.Nm max-dgram-reassembly
-.Ar uint16
-.Pp
-This option specifies the maximum size datagram that the client
-should be prepared to reassemble. The minimum value legal value is
-576.
-.Pp
-.Nm option
-.Nm default-ip-ttl
-.Ar uint8
-.Pp
-This option specifies the default time-to-live that the client should
-use on outgoing datagrams.
-.Pp
-.Nm option
-.Nm path-mtu-aging-timeout
-.Ar uint32
-.Pp
-This option specifies the timeout (in seconds) to use when aging Path
-MTU values discovered by the mechanism defined in RFC 1191.
-.Pp
-.Nm option
-.Nm path-mtu-plateau-table
-.Ar uint16 [
-,
-.Ar uint16
-.Ar ... ]
-.Pp
-This option specifies a table of MTU sizes to use when performing
-Path MTU Discovery as defined in RFC 1191. The table is formatted as
-a list of 16-bit unsigned integers, ordered from smallest to largest.
-The minimum MTU value cannot be smaller than 68.
-.Pp
-.Nm option
-.Nm interface-mtu
-.Ar uint16
-.Pp
-This option specifies the MTU to use on this interface. The minimum
-legal value for the MTU is 68.
-.Pp
-.Nm option
-.Nm all-subnets-local
-.Ar flag
-This option specifies whether or not the client may assume that all
-subnets of the IP network to which the client is connected use the
-same MTU as the subnet of that network to which the client is
-directly connected. A value of 1 indicates that all subnets share
-the same MTU. A value of 0 means that the client should assume that
-some subnets of the directly connected network may have smaller MTUs.
-.Pp
-.Nm option
-.Nm broadcast-address
-.Ar ip-address
-.Pp
-This option specifies the broadcast address in use on the client's
-subnet. Legal values for broadcast addresses are specified in
-section 3.2.1.3 of STD 3 (RFC1122).
-.Pp
-.Nm option
-.Nm perform-mask-discovery
-.Ar flag
-.Pp
-This option specifies whether or not the client should perform subnet
-mask discovery using ICMP. A value of 0 indicates that the client
-should not perform mask discovery. A value of 1 means that the
-client should perform mask discovery.
-.Pp
-.Nm option
-.Nm mask-supplier
-.Ar flag
-.Pp
-This option specifies whether or not the client should respond to
-subnet mask requests using ICMP. A value of 0 indicates that the
-client should not respond. A value of 1 means that the client should
-respond.
-.Pp
-.Nm option
-.Nm router-discovery
-.Ar flag
-.Pp
-This option specifies whether or not the client should solicit
-routers using the Router Discovery mechanism defined in RFC 1256.
-A value of 0 indicates that the client should not perform
-router discovery. A value of 1 means that the client should perform
-router discovery.
-.Pp
-.Nm option
-.Nm router-solicitation-address
-.Ar ip-address
-.Pp
-This option specifies the address to which the client should transmit
-router solicitation requests.
-.Pp
-.Nm option
-.Nm static-routes
-.Ar ip-address ip-address [
-,
-.Ar ip-address ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of static routes that the client should
-install in its routing cache. If multiple routes to the same
-destination are specified, they are listed in descending order of
-priority.
-.Pp
-The routes consist of a list of IP address pairs. The first address
-is the destination address, and the second address is the router for
-the destination.
-.Pp
-The default route (0.0.0.0) is an illegal destination for a static
-route. To specify the default route, use the
-.Nm routers
-option.
-.Pp
-.Nm option
-.Nm trailer-encapsulation
-.Ar flag
-.Pp
-This option specifies whether or not the client should negotiate the
-use of trailers (RFC 893 [14]) when using the ARP protocol. A value
-of 0 indicates that the client should not attempt to use trailers. A
-value of 1 means that the client should attempt to use trailers.
-.Pp
-.Nm option
-.Nm arp-cache-timeout
-.Ar uint32
-.Pp
-This option specifies the timeout in seconds for ARP cache entries.
-.Pp
-.Nm option
-.Nm ieee802.3-encapsulation
-.Ar flag
-.Pp
-This option specifies whether or not the client should use Ethernet
-Version 2 (RFC 894) or IEEE 802.3 (RFC 1042) encapsulation if the
-interface is an Ethernet. A value of 0 indicates that the client
-should use RFC 894 encapsulation. A value of 1 means that the client
-should use RFC 1042 encapsulation.
-.Pp
-.Nm option
-.Nm default-tcp-ttl
-.Ar uint8
-.Pp
-This option specifies the default TTL that the client should use when
-sending TCP segments. The minimum value is 1.
-.Pp
-.Nm option
-.Nm tcp-keepalive-interval
-.Ar uint32
-.Pp
-This option specifies the interval (in seconds) that the client TCP
-should wait before sending a keepalive message on a TCP connection.
-The time is specified as a 32-bit unsigned integer. A value of zero
-indicates that the client should not generate keepalive messages on
-connections unless specifically requested by an application.
-.Pp
-.Nm option
-.Nm tcp-keepalive-garbage
-.Ar flag
-.Pp
-This option specifies the whether or not the client should send TCP
-keepalive messages with a octet of garbage for compatibility with
-older implementations. A value of 0 indicates that a garbage octet
-should not be sent. A value of 1 indicates that a garbage octet
-should be sent.
-.Pp
-.Nm option
-.Nm nis-domain
-.Ar string
-.Pp
-This option specifies the name of the client's NIS (Sun Network
-Information Services) domain. The domain is formatted as a character
-string consisting of characters from the NVT ASCII character set.
-.Pp
-.Nm option
-.Nm nis-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of IP addresses indicating NIS servers
-available to the client. Servers should be listed in order of
-preference.
-.Pp
-.Nm option
-.Nm ntp-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of IP addresses indicating NTP (RFC 1035)
-servers available to the client. Servers should be listed in order
-of preference.
-.Pp
-.Nm option
-.Nm netbios-name-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The NetBIOS name server (NBNS) option specifies a list of RFC
-1001/1002 NBNS name servers listed in order of preference.
-.Pp
-.Nm option
-.Nm netbios-dd-server
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-The NetBIOS datagram distribution server (NBDD) option specifies a
-list of RFC 1001/1002 NBDD servers listed in order of preference.
-.Pp
-.Nm option
-.Nm netbios-node-type
-.Ar uint8
-.Pp
-The NetBIOS node type option allows NetBIOS over TCP/IP clients which
-are configurable to be configured as described in RFC 1001/1002. The
-value is specified as a single octet which identifies the client type.
-A value of 1 corresponds to a NetBIOS B-node; a value of 2 corresponds
-to a P-node; a value of 4 corresponds to an M-node; a value of 8
-corresponds to an H-node.
-.Pp
-.Nm option
-.Nm netbios-scope
-.Ar string
-.Pp
-The NetBIOS scope option specifies the NetBIOS over TCP/IP scope
-parameter for the client as specified in RFC 1001/1002. See RFC1001,
-RFC1002, and RFC1035 for character-set restrictions.
-.Pp
-.Nm option
-.Nm font-servers
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of X Window System Font servers available
-to the client. Servers should be listed in order of preference.
-.Pp
-.Nm option
-.Nm x-display-manager
-.Ar ip-address [
-,
-.Ar ip-address
-.Ar ... ]
-.Pp
-This option specifies a list of systems that are running the X Window
-System Display Manager and are available to the client. Addresses
-should be listed in order of preference.
-.Sh SEE ALSO
-.Xr dhcpd.conf 5 ,
-.Xr dhcpd.leases 5
-.Sh AUTHOR
-.Xr dhcpd 8
-was written by Ted Lemon
-.Nm <mellon@vix.com>
-under a contract with Vixie Labs. Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.Nm http://www.isc.org/isc .
diff --git a/server/dhcpd.conf.cat5 b/server/dhcpd.conf.cat5
deleted file mode 100644
index 1595c58e..00000000
--- a/server/dhcpd.conf.cat5
+++ /dev/null
@@ -1,437 +0,0 @@
-dhcpd.conf(5) NetBSD Programmer's Manual dhcpd.conf(5)
-
-NNAAMMEE
- ddhhccppdd..ccoonnff - dhcpd configuration file
-
-DDEESSCCRRIIPPTTIIOONN
- The dhcpd.conf(5) file contains configuration information for dhcpd(8),
- the Dynamic Host Configuration Protocol daemon. A primer on configuring
- ddhhccppdd is included in dhcpd(8). This document describes the format of the
- file in detail, and is probably a better reference than a primer.
-
- The ddhhccppdd..ccoonnff file is a free-form ASCII text file. It is parsed by a
- recursive-descent parser. Statements in the file may contain extra tabs
- and newlines for formatting purposes. Each statement in the file is
- terminated by a semicolon. Keywords in the file are case-insensitive.
-
- There are currently two statements that can meaningfully appear in the
- file--the ssuubbnneett statement, and the hhoosstt statement.
-
-TThhee SSUUBBNNEETT ssttaatteemmeenntt
- ssuubbnneett _s_u_b_n_e_t_-_n_u_m_b_e_r nneettmmaasskk _n_e_t_m_a_s_k [_c_l_a_u_s_e_s];
-
- _s_u_b_n_e_t_-_n_u_m_b_e_r should be an IP address or DNS name which resolves to the
- subnet number of the subnet being described. _n_e_t_m_a_s_k should be an IP ad-
- dress or DNS name which resolves to the subnet mask of the subnet being
- described. These are the only required fields in a subnet declaration,
- although it may be desirable to add one or more of the following clauses.
-
- Subnets for which addresses will be dynamically allocated must have one
- or more addresses reserved for future allocation by ddhhccppdd. These address-
- es are allocated using the rraannggee clause.
-
- rraannggee _l_o_w_e_s_t_-_a_d_d_r_e_s_s _h_i_g_h_e_s_t_-_a_d_d_r_e_s_s
-
- _L_o_w_e_s_t_-_a_d_d_r_e_s_s should be the lowest address in the range that may be as-
- signed by ddhhccppdd to a DHCP client. _H_i_g_h_e_s_t_-_a_d_d_r_e_s_s should be the highest
- address in the range that may be assigned by ddhhccppdd. If there is only one
- address in a range, it must be specified as both the lowest and highest
- addresses. As many rraannggee clauses as are needed may be specified in any
- given ssuubbnneett statement.
-
- ddeeffaauulltt--lleeaassee--ttiimmee _t_i_m_e
-
- _T_i_m_e should be the expiration time in seconds that will be assigned to a
- lease if the client requesting the lease does not ask for a specific ex-
- piration time. This clause may only appear once in each ssuubbnneett state-
- ment.
-
- mmaaxx--lleeaassee--ttiimmee _t_i_m_e
-
- _T_i_m_e should be the maximum expiration time in seconds that will be as-
- signed to a lease if the client requesting the lease asks for a specific
- expiration time. This clause may only appear once in each ssuubbnneett state-
- ment.
-
- ooppttiioonn _o_p_t_i_o_n_-_d_e_c_l_a_r_a_t_i_o_n
-
- Any number of ddhhccppdd..ccoonnff option clauses may appear in a subnet statement.
- The syntax of option declarations is described later in this document.
-
-TThhee HHOOSSTT ssttaatteemmeenntt
- hhoosstt _h_o_s_t_n_a_m_e [_c_l_a_u_s_e_s];
-
- There must be at least one hhoosstt statement for every BOOTP client that is
- to be served. _h_o_s_t_n_a_m_e should be a name identifying the host. It is
- for labelling purposes only, and is not used in the BOOTP protocol.
-
- hhaarrddwwaarree _h_a_r_d_w_a_r_e_-_t_y_p_e _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s
-
- In order for a BOOTP client to be recognized, its network hardware ad-
- dress must be declared using a hhaarrddwwaarree clause in the hhoosstt statement.
- Only one such clause can appear in any host statement. _h_a_r_d_w_a_r_e_-_t_y_p_e
- must be the name of a physical hardware interface type. Currently, only
- the eetthheerrnneett type is recognized, although support for ttookkeenn--rriinngg and ffddddii
- hardware types will be added soon. The _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s should be a set
- of hexadecimal octets (numbers from 0 through ff) seperated by colons.
-
- ffiilleennaammee _f_i_l_e_n_a_m_e
-
- If the BOOTP client needs to load a boot file (for example, a kernel or
- configuration file), the name of this file may be provided to the client
- using the ffiilleennaammee clause. The _f_i_l_e_n_a_m_e should be a filename recogniz-
- able to whatever file transfer protocol the client can be expected to use
- to load the file.
-
- ffiixxeedd--aaddddrreessss _a_d_d_r_e_s_s
-
- BOOTP clients must be assigned fixed IP addresses. The ffiixxeedd--aaddddrreessss
- clause is used to associate a fixed IP address with a BOOTP client.
- _A_d_d_r_e_s_s should be either an IP address or a DNS name which resolves to a
- single IP address.
-
- ooppttiioonn _o_p_t_i_o_n_-_d_e_c_l_a_r_a_t_i_o_n
-
- Any number of ddhhccppdd..ccoonnff option clauses may appear in a host statement.
- The syntax of option declarations is described later in this document.
- If an option clause in a hhoosstt statement conflicts with an option clause
- in the ssuubbnneett statement for the subnet containing that host, the option
- clause in the hhoosstt statement is used.
-
-OOppttiioonn DDeeccllaarraattiioonnss
- Option declarations always start with the ooppttiioonn keyword, followed by an
- option name, followed by option data. The option names and data formats
- are described below. Many of the options described below which set IP
- or TCP parameters have default values which will generally work perfectly
- well, so only those options whose values must be set explicitly should be
- included in ssuubbnneett or hhoosstt statements.
-
- Option data comes in a variety of formats. In order to avoid having to
- explain the formats along with each option definition below, a number of
- data types have been defined.
-
- The ip-address data type can be entered either as an explicit IP address
- (e.g., 239.254.197.10) or as a domain name (e.g., haagen.isc.org). When
- entering a domain name, be sure that that domain name resolves to a sin-
- gle IP address.
-
- The int32 data type specifies a signed 32-bit integer. The uint32 data
- type specifies an unsigned 32-bit integer. The int16 and uint16 data
- types specify signed and unsigned 16-bit integers. The int8 and uint8
- data types specify signed and unsigned 8-bit integers. Unsigned 8-bit
- integers are also sometimes referred to as octets.
-
- The string data type specifies an NVT ASCII string, which must be en-
- closed in double quotes - for example, to specify a domain-name option,
- the syntax would be
-
- option domain-name "isc.org"
-
- The flag data type specifies a one-bit (boolean) number.
-
-
- The documentation for the various options mentioned below is taken from
- the latest IETF draft document on DHCP options.
-
- ooppttiioonn ssuubbnneett--mmaasskk _i_p_-_a_d_d_r_e_s_s
-
- The subnet mask option specifies the client's subnet mask as per RFC 950.
-
- ooppttiioonn ttiimmee--ooffffsseett _i_n_t_3_2
-
- The time-offset option specifies the offset of the client's subnet in
- seconds from Coordinated Universal Time (UTC).
-
- ooppttiioonn rroouutteerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The routers option specifies a list of IP addresses for routers on the
- client's subnet. Routers should be listed in order of preference.
-
- ooppttiioonn ttiimmee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The time-server option specifies a list of RFC 868 time servers available
- to the client. Servers should be listed in order of preference.
-
- ooppttiioonn nnaammee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The name-servers option specifies a list of IEN 116 name servers avail-
- able to the client. Servers should be listed in order of preference.
-
- ooppttiioonn ddoommaaiinn--nnaammee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The domain-name-servers option specifies a list of Domain Name System
- (STD 13, RFC 1035) name servers available to the client. Servers should
- be listed in order of preference.
-
- ooppttiioonn lloogg--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The log-server option specifies a list of MIT-LCS UDP log servers avail-
- able to the client. Servers should be listed in order of preference.
-
- ooppttiioonn ccooookkiiee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The cookie server option specifies a list of RFC 865 cookie servers
- available to the client. Servers should be listed in order of prefer-
- ence.
-
- ooppttiioonn llpprr--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The LPR server option specifies a list of RFC 1179 line printer servers
- available to the client. Servers should be listed in order of prefer-
- ence.
-
- ooppttiioonn iimmpprreessss--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The impress-server option specifies a list of Imagen Impress servers
- available to the client. Servers should be listed in order of prefer-
- ence.
-
- ooppttiioonn rreessoouurrccee--llooccaattiioonn--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of RFC 887 Resource Location servers avail-
- able to the client. Servers should be listed in order of preference.
-
- ooppttiioonn hhoosstt--nnaammee _s_t_r_i_n_g
-
- This option specifies the name of the client. The name may or may not be
- qualified with the local domain name (it is preferable to use the domain-
- name option to specify the domain name). See RFC 1035 for character set
- restrictions.
-
- ooppttiioonn bboooott--ssiizzee _u_i_n_t_1_6
-
- This option specifies the length in 512-octet blocks of the default boot
- image for the client.
-
- ooppttiioonn mmeerriitt--dduummpp _s_t_r_i_n_g
-
- This option specifies the path-name of a file to which the client's core
- image should be dumped in the event the client crashes. The path is for-
- matted as a character string consisting of characters from the NVT ASCII
- character set.
-
- ooppttiioonn ddoommaaiinn--nnaammee _s_t_r_i_n_g
-
- This option specifies the domain name that client should use when resolv-
- ing hostnames via the Domain Name System.
-
- ooppttiioonn sswwaapp--sseerrvveerr _i_p_-_a_d_d_r_e_s_s
-
- This specifies the IP address of the client's swap server.
-
- ooppttiioonn rroooott--ppaatthh _s_t_r_i_n_g
-
- This option specifies the path-name that contains the client's root disk.
- The path is formatted as a character string consisting of characters from
- the NVT ASCII character set.
-
- ooppttiioonn iipp--ffoorrwwaarrddiinngg _f_l_a_g
-
- This option specifies whether the client should configure its IP layer
- for packet forwarding. A value of 0 means disable IP forwarding, and a
- value of 1 means enable IP forwarding.
-
- ooppttiioonn nnoonn--llooccaall--ssoouurrccee--rroouuttiinngg _f_l_a_g
-
- This option specifies whether the client should configure its IP layer to
- allow forwarding of datagrams with non-local source routes (see Section
- 3.3.5 of [4] for a discussion of this topic). A value of 0 means disal-
- low forwarding of such datagrams, and a value of 1 means allow forward-
- ing.
-
- ooppttiioonn ppoolliiccyy--ffiilltteerr _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies policy filters for non-local source routing. The
- filters consist of a list of IP addresses and masks which specify desti-
- nation/mask pairs with which to filter incoming source routes.
-
- Any source routed datagram whose next-hop address does not match one of
- the filters should be discarded by the client.
-
- See STD 3 (RFC1122) for further information.
-
- ooppttiioonn mmaaxx--ddggrraamm--rreeaasssseemmbbllyy _u_i_n_t_1_6
-
- This option specifies the maximum size datagram that the client should be
- prepared to reassemble. The minimum value legal value is 576.
-
- ooppttiioonn ddeeffaauulltt--iipp--ttttll _u_i_n_t_8
-
- This option specifies the default time-to-live that the client should use
- on outgoing datagrams.
-
-
- ooppttiioonn ppaatthh--mmttuu--aaggiinngg--ttiimmeeoouutt _u_i_n_t_3_2
-
- This option specifies the timeout (in seconds) to use when aging Path MTU
- values discovered by the mechanism defined in RFC 1191.
-
- ooppttiioonn ppaatthh--mmttuu--ppllaatteeaauu--ttaabbllee _u_i_n_t_1_6 [ , _u_i_n_t_1_6 _._._.]
-
- This option specifies a table of MTU sizes to use when performing Path
- MTU Discovery as defined in RFC 1191. The table is formatted as a list
- of 16-bit unsigned integers, ordered from smallest to largest. The mini-
- mum MTU value cannot be smaller than 68.
-
- ooppttiioonn iinntteerrffaaccee--mmttuu _u_i_n_t_1_6
-
- This option specifies the MTU to use on this interface. The minimum le-
- gal value for the MTU is 68.
-
- ooppttiioonn aallll--ssuubbnneettss--llooccaall _f_l_a_g This option specifies whether or not the
- client may assume that all subnets of the IP network to which the client
- is connected use the same MTU as the subnet of that network to which the
- client is directly connected. A value of 1 indicates that all subnets
- share the same MTU. A value of 0 means that the client should assume
- that some subnets of the directly connected network may have smaller
- MTUs.
-
- ooppttiioonn bbrrooaaddccaasstt--aaddddrreessss _i_p_-_a_d_d_r_e_s_s
-
- This option specifies the broadcast address in use on the client's sub-
- net. Legal values for broadcast addresses are specified in section
- 3.2.1.3 of STD 3 (RFC1122).
-
- ooppttiioonn ppeerrffoorrmm--mmaasskk--ddiissccoovveerryy _f_l_a_g
-
- This option specifies whether or not the client should perform subnet
- mask discovery using ICMP. A value of 0 indicates that the client should
- not perform mask discovery. A value of 1 means that the client should
- perform mask discovery.
-
- ooppttiioonn mmaasskk--ssuupppplliieerr _f_l_a_g
-
- This option specifies whether or not the client should respond to subnet
- mask requests using ICMP. A value of 0 indicates that the client should
- not respond. A value of 1 means that the client should respond.
-
- ooppttiioonn rroouutteerr--ddiissccoovveerryy _f_l_a_g
-
- This option specifies whether or not the client should solicit routers
- using the Router Discovery mechanism defined in RFC 1256. A value of 0
- indicates that the client should not perform router discovery. A value
- of 1 means that the client should perform router discovery.
-
- ooppttiioonn rroouutteerr--ssoolliicciittaattiioonn--aaddddrreessss _i_p_-_a_d_d_r_e_s_s
-
- This option specifies the address to which the client should transmit
- router solicitation requests.
-
- ooppttiioonn ssttaattiicc--rroouutteess _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of static routes that the client should in-
- stall in its routing cache. If multiple routes to the same destination
- are specified, they are listed in descending order of priority.
-
- The routes consist of a list of IP address pairs. The first address is
- the destination address, and the second address is the router for the
- destination.
-
-
- The default route (0.0.0.0) is an illegal destination for a static route.
- To specify the default route, use the rroouutteerrss option.
-
- ooppttiioonn ttrraaiilleerr--eennccaappssuullaattiioonn _f_l_a_g
-
- This option specifies whether or not the client should negotiate the use
- of trailers (RFC 893 [14]) when using the ARP protocol. A value of 0 in-
- dicates that the client should not attempt to use trailers. A value of 1
- means that the client should attempt to use trailers.
-
- ooppttiioonn aarrpp--ccaacchhee--ttiimmeeoouutt _u_i_n_t_3_2
-
- This option specifies the timeout in seconds for ARP cache entries.
-
- ooppttiioonn iieeeeee880022..33--eennccaappssuullaattiioonn _f_l_a_g
-
- This option specifies whether or not the client should use Ethernet Ver-
- sion 2 (RFC 894) or IEEE 802.3 (RFC 1042) encapsulation if the interface
- is an Ethernet. A value of 0 indicates that the client should use RFC
- 894 encapsulation. A value of 1 means that the client should use RFC
- 1042 encapsulation.
-
- ooppttiioonn ddeeffaauulltt--ttccpp--ttttll _u_i_n_t_8
-
- This option specifies the default TTL that the client should use when
- sending TCP segments. The minimum value is 1.
-
- ooppttiioonn ttccpp--kkeeeeppaalliivvee--iinntteerrvvaall _u_i_n_t_3_2
-
- This option specifies the interval (in seconds) that the client TCP
- should wait before sending a keepalive message on a TCP connection. The
- time is specified as a 32-bit unsigned integer. A value of zero indi-
- cates that the client should not generate keepalive messages on connec-
- tions unless specifically requested by an application.
-
- ooppttiioonn ttccpp--kkeeeeppaalliivvee--ggaarrbbaaggee _f_l_a_g
-
- This option specifies the whether or not the client should send TCP
- keepalive messages with a octet of garbage for compatibility with older
- implementations. A value of 0 indicates that a garbage octet should not
- be sent. A value of 1 indicates that a garbage octet should be sent.
-
- ooppttiioonn nniiss--ddoommaaiinn _s_t_r_i_n_g
-
- This option specifies the name of the client's NIS (Sun Network Informa-
- tion Services) domain. The domain is formatted as a character string
- consisting of characters from the NVT ASCII character set.
-
- ooppttiioonn nniiss--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of IP addresses indicating NIS servers
- available to the client. Servers should be listed in order of prefer-
- ence.
-
- ooppttiioonn nnttpp--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of IP addresses indicating NTP (RFC 1035)
- servers available to the client. Servers should be listed in order of
- preference.
-
- ooppttiioonn nneettbbiiooss--nnaammee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The NetBIOS name server (NBNS) option specifies a list of RFC 1001/1002
- NBNS name servers listed in order of preference.
-
-
- ooppttiioonn nneettbbiiooss--dddd--sseerrvveerr _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- The NetBIOS datagram distribution server (NBDD) option specifies a list
- of RFC 1001/1002 NBDD servers listed in order of preference.
-
- ooppttiioonn nneettbbiiooss--nnooddee--ttyyppee _u_i_n_t_8
-
- The NetBIOS node type option allows NetBIOS over TCP/IP clients which are
- configurable to be configured as described in RFC 1001/1002. The value
- is specified as a single octet which identifies the client type. A value
- of 1 corresponds to a NetBIOS B-node; a value of 2 corresponds to a P-
- node; a value of 4 corresponds to an M-node; a value of 8 corresponds to
- an H-node.
-
- ooppttiioonn nneettbbiiooss--ssccooppee _s_t_r_i_n_g
-
- The NetBIOS scope option specifies the NetBIOS over TCP/IP scope parame-
- ter for the client as specified in RFC 1001/1002. See RFC1001, RFC1002,
- and RFC1035 for character-set restrictions.
-
- ooppttiioonn ffoonntt--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of X Window System Font servers available to
- the client. Servers should be listed in order of preference.
-
- ooppttiioonn xx--ddiissppllaayy--mmaannaaggeerr _i_p_-_a_d_d_r_e_s_s [ , _i_p_-_a_d_d_r_e_s_s _._._.]
-
- This option specifies a list of systems that are running the X Window
- System Display Manager and are available to the client. Addresses should
- be listed in order of preference.
-
-SSEEEE AALLSSOO
- dhcpd.conf(5), dhcpd.leases(5)
-
-AAUUTTHHOORR
- dhcpd(8) was written by Ted Lemon <<mmeelllloonn@@vviixx..ccoomm>> under a contract with
- Vixie Labs. Funding for this project was provided by the Internet Soft-
- ware Corporation. Information about the Internet Software Consortium can
- be found at hhttttpp::////wwwwww..iisscc..oorrgg//iisscc.
-
- March 6, 1996 7