]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
More portable internet addresses; fix endian bug; fix parser bugs
authorTed Lemon <source@isc.org>
Tue, 6 Feb 1996 20:25:56 +0000 (20:25 +0000)
committerTed Lemon <source@isc.org>
Tue, 6 Feb 1996 20:25:56 +0000 (20:25 +0000)
35 files changed:
Makefile
alloc.c
bootp.c
common/alloc.c
common/conflex.c
common/hash.c
common/inet.c [new file with mode: 0644]
common/memory.c
common/options.c
common/print.c
common/socket.c
common/tables.c
common/tree.c
conflex.c
confpars.c
dhcpd.c
dhcpd.conf
dhcpd.h
dhctoken.h
hash.c
includes/dhcpd.h
includes/dhctoken.h
includes/inet.h
inet.c [new file with mode: 0644]
inet.h
memory.c
options.c
print.c
server/bootp.c
server/confpars.c
server/dhcpd.c
server/dhcpd.conf
socket.c
tables.c
tree.c

index e4a4adda10f8d5af29c8dc36425ffb9af09d2c50..a81468be69ab276d899a959e4785684a72ac4d4f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,9 @@
 SRCS = dhcpd.c options.c errwarn.c convert.c conflex.c confpars.c \
        tree.c memory.c bootp.c dhcp.c alloc.c print.c socket.c \
-       hash.c tables.c
+       hash.c tables.c inet.c
 PROG = dhcpd
 
 .include <bsd.prog.mk>
 
-CFLAGS += -DDEBUG -g
+CFLAGS += -DDEBUG -g -Wall -Wstrict-prototypes -Wno-unused \
+         -Wno-uninitialized -Werror
diff --git a/alloc.c b/alloc.c
index 9dbeadb79273557e4fd7851a5e72744cbb3fc491..d1f06470e96e42c700f30ac1a76c7eb20280c1b9 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -1,6 +1,6 @@
 /* alloc.c
 
-   Memory allocation...
+   Memory allocation... */
 
 /*
  * Copyright (c) 1995 The Internet Software Consortium.  All rights reserved.
@@ -55,7 +55,7 @@ VOIDPTR dmalloc (size, name)
 {
        VOIDPTR foo = (VOIDPTR)malloc (size);
        if (!foo)
-               warn ("No memory for %s.\n");
+               warn ("No memory for %s.", name);
        return foo;
 }
 
diff --git a/bootp.c b/bootp.c
index 6f5d1a5bae42a1aba18da79358f60ccf7305d8ab..348ce0effaaa16dac533926127f1e5009998a199 100644 (file)
--- a/bootp.c
+++ b/bootp.c
@@ -130,7 +130,7 @@ void bootp (packet)
        /* If we got the magic cookie, send it back. */
        if (packet -> options_valid)
                memcpy (reply -> options, packet -> raw -> options, 4);
-       to.sin_port = packet -> client.sin_port;
+       to.sin_port = htons (packet -> client_port);
        to.sin_family = AF_INET;
        to.sin_len = sizeof to;
        memset (to.sin_zero, 0, sizeof to.sin_zero);
index 9dbeadb79273557e4fd7851a5e72744cbb3fc491..d1f06470e96e42c700f30ac1a76c7eb20280c1b9 100644 (file)
@@ -1,6 +1,6 @@
 /* alloc.c
 
-   Memory allocation...
+   Memory allocation... */
 
 /*
  * Copyright (c) 1995 The Internet Software Consortium.  All rights reserved.
@@ -55,7 +55,7 @@ VOIDPTR dmalloc (size, name)
 {
        VOIDPTR foo = (VOIDPTR)malloc (size);
        if (!foo)
-               warn ("No memory for %s.\n");
+               warn ("No memory for %s.", name);
        return foo;
 }
 
index a7b56dd8d6461b899089502ce6cc6aff430ad256..f059a627dd282ff416a46ef0bd7c1b5216deb7b1 100644 (file)
@@ -87,6 +87,9 @@ static int get_token (cfile)
        int c;
        int i;
        int ttok;
+#ifdef DEBUG_TOKENS
+       static char tb [2];
+#endif
 
        do {
                c = get_char (cfile);
@@ -109,7 +112,13 @@ static int get_token (cfile)
                        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;
                }
@@ -131,6 +140,9 @@ int next_token (rval, cfile)
        }
        if (rval)
                *rval = tval;
+#ifdef DEBUG_TOKENS
+       fprintf (stderr, "%s:%d ", tval, rv);
+#endif
        return rv;
 }
 
@@ -142,6 +154,9 @@ int peek_token (rval, cfile)
                token = get_token (cfile);
        if (rval)
                *rval = tval;
+#ifdef DEBUG_TOKENS
+       fprintf (stderr, "(%s:%d) ", tval, token);
+#endif
        return token;
 }
 
@@ -255,11 +270,15 @@ static int intern (atom, dfv)
        int dfv;
 {
        switch (atom [0]) {
-             case 'h':
-               if (!strcasecmp (atom + 1, "ost"))
-                       return HOST;
-               if (!strcasecmp (atom + 1, "ardware"))
-                       return HARDWARE;
+             case 'c':
+               if (!strcasecmp (atom + 1, "lass"))
+                       return CLASS;
+               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"))
@@ -267,14 +286,36 @@ static int intern (atom, dfv)
                if (!strcasecmp (atom + 1, "ixed-address"))
                        return FIXED_ADDR;
                break;
-             case 'e':
-               if (!strcasecmp (atom + 1, "thernet"))
-                       return ETHERNET;
+             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 '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;
+               break;
+             case 't':
+               if (!strcasecmp (atom + 1, "timestamp"))
+                       return TIMESTAMP;
+               break;
+             case 'u':
+               if (!strcasecmp (atom + 1, "id"))
+                       return UID;
+               break;
        }
        return dfv;
 }
index 9b2d5f9e77492de666ad8600c60652bddba27aa4..8bc724e7aa298545beb8e8923e1927bf5cdc47f7 100644 (file)
@@ -46,6 +46,8 @@ static char copyright[] =
 
 #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");
@@ -56,7 +58,7 @@ struct hash_table *new_hash ()
        return rv;
 }
 
-static INLINE do_hash (name, len, size)
+static INLINE int do_hash (name, len, size)
        char *name;
        int len;
        int size;
diff --git a/common/inet.c b/common/inet.c
new file mode 100644 (file)
index 0000000..f221f68
--- /dev/null
@@ -0,0 +1,154 @@
+/* inet.c
+
+   Subroutines to manipulate internet addresses in a safely portable
+   way... */
+
+/*
+ * 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''.
+ */
+
+#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;
+       unsigned long host_address;
+{
+       int i, j, k;
+       unsigned long 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]) {
+                               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;
+               }
+               rv.iabuf [i + j] = habuf [i];
+       }
+               
+       return rv;
+}
+
+unsigned long host_addr (addr, mask)
+       struct iaddr addr;
+       struct iaddr mask;
+{
+       int i;
+       unsigned long 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;
+}
index c3e1abd5087bb8f94d5860a85b2045c1d7c0563f..6c1f5502bb9c22bd9f5c47cc358527f74fea6c12 100644 (file)
@@ -92,11 +92,11 @@ struct host_decl *find_host_by_addr (htype, haddr, hlen)
 }
 
 void new_address_range (low, high, netmask)
-       struct in_addr low, high, netmask;
+       struct iaddr low, high, netmask;
 {
        struct lease *address_range, *lp, *plp;
        struct subnet *subnet;
-       struct in_addr net;
+       struct iaddr net;
        int i, max;
        char lowbuf [16], highbuf [16], netbuf [16];
 
@@ -111,11 +111,11 @@ void new_address_range (low, high, netmask)
                lease_hw_addr_hash = new_hash ();
 
        /* Make sure that high and low addresses are in same subnet. */
-       net.s_addr = SUBNET (low, netmask);
-       if (net.s_addr != SUBNET (high, netmask)) {
-               strcpy (lowbuf, inet_ntoa (low));
-               strcpy (highbuf, inet_ntoa (high));
-               strcpy (netbuf, inet_ntoa (netmask));
+       net = subnet_number (low, netmask);
+       if (!addr_eq (net, subnet_number (high, netmask))) {
+               strcpy (lowbuf, piaddr (low));
+               strcpy (highbuf, piaddr (high));
+               strcpy (netbuf, piaddr (netmask));
                error ("Address range %s to %s, netmask %s spans %s!",
                       lowbuf, highbuf, netbuf, "multiple subnets");
        }
@@ -133,27 +133,28 @@ void new_address_range (low, high, netmask)
        }
 
        /* Get the high and low host addresses... */
-       max = HOST_ADDR (high, netmask);
-       i = HOST_ADDR (low, netmask);
+       max = host_addr (high, netmask);
+       i = host_addr (low, netmask);
 
        /* Allow range to be specified high-to-low as well as low-to-high. */
        if (i > max) {
                max = i;
-               i = HOST_ADDR (high, netmask);
+               i = host_addr (high, netmask);
        }
 
        /* Get a lease structure for each address in the range. */
        address_range = new_leases (max - i + 1, "new_address_range");
        if (!address_range) {
-               strcpy (lowbuf, inet_ntoa (low));
-               strcpy (highbuf, inet_ntoa (high));
+               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 - i + 1));
 
        /* Fill out the lease structures with some minimal information. */
        for (; i <= max; i++) {
-               address_range [i].ip_addr.s_addr = IP_ADDR (subnet -> net, i);
+               address_range [i].ip_addr =
+                       ip_addr (subnet -> net, subnet -> netmask, i);
                address_range [i].starts =
                        address_range [i].timestamp = MIN_TIME;
                address_range [i].ends = MIN_TIME;
@@ -163,7 +164,8 @@ void new_address_range (low, high, netmask)
                address_range [i].next = subnet -> leases;
                address_range [i].prev = (struct lease *)0;
                subnet -> leases = &address_range [i];
-               address_range [i].next -> prev = subnet -> leases;
+               if (address_range [i].next)
+                       address_range [i].next -> prev = subnet -> leases;
                add_hash (lease_ip_addr_hash,
                          (char *)&address_range [i].ip_addr,
                          sizeof address_range [i].ip_addr,
@@ -173,16 +175,16 @@ void new_address_range (low, high, netmask)
        /* Find out if any dangling leases are in range... */
        plp = (struct lease *)0;
        for (lp = dangling_leases; lp; lp = lp -> next) {
-               struct in_addr lnet;
+               struct iaddr lnet;
                int lhost;
 
-               lnet.s_addr = SUBNET (lp -> ip_addr, subnet -> netmask);
-               lhost = HOST_ADDR (lp -> ip_addr, subnet -> netmask);
+               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 (lnet.s_addr == subnet -> net.s_addr &&
+               if (addr_eq (lnet, subnet -> net) &&
                    lhost >= i && lhost <= max) {
                        if (plp) {
                                plp -> next = lp -> next;
@@ -198,12 +200,12 @@ void new_address_range (low, high, netmask)
 }
 
 struct subnet *find_subnet (subnet)
-       struct in_addr subnet;
+       struct iaddr subnet;
 {
        struct subnet *rv;
 
        return (struct subnet *)hash_lookup (subnet_hash,
-                                            (char *)&subnet, sizeof subnet);
+                                            (char *)subnet.iabuf, subnet.len);
 }
 
 /* Enter a new subnet into the subnet hash. */
@@ -211,8 +213,8 @@ struct subnet *find_subnet (subnet)
 void enter_subnet (subnet)
        struct subnet *subnet;
 {
-       add_hash (subnet_hash, (char *)&subnet -> net,
-                 sizeof subnet -> net, (unsigned char *)subnet);
+       add_hash (subnet_hash, (char *)subnet -> net.iabuf,
+                 subnet -> net.len, (unsigned char *)subnet);
 }
        
 /* Enter a lease into the system.   This is called by the parser each
@@ -232,7 +234,7 @@ void enter_lease (lease)
                comp = new_lease ("enter_lease");
                if (!comp) {
                        error ("No memory for lease %s\n",
-                              inet_ntoa (lease -> ip_addr));
+                              piaddr (lease -> ip_addr));
                }
                *comp = *lease;
                lease -> next = dangling_leases;
@@ -273,7 +275,7 @@ void supersede_lease (comp, lease)
                       lease -> hardware_addr.haddr,
                       comp -> hardware_addr.hlen))))) {
                warn ("Lease conflict at %s",
-                     inet_ntoa (comp -> ip_addr));
+                     piaddr (comp -> ip_addr));
        } else {
                /* If there's a Unique ID, dissociate it from the hash
                   table if necessary, and always free it. */
@@ -289,13 +291,13 @@ void supersede_lease (comp, lease)
                        free (comp -> uid);
                }
                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)) {
+                   ((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);
@@ -393,3 +395,24 @@ void supersede_lease (comp, lease)
                comp -> contain -> insertion_point = comp;
        }
 }
+
+/* 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;
+}
+
index 2a632797be776d8ce2bbd68274aee1abaea9c6ec..b9a538a11437213bf399a3e347d82390f9e25297 100644 (file)
@@ -152,7 +152,7 @@ void parse_option_buffer (packet, buffer, length)
 
 void cons_options (inpacket, outpacket, hp, overload)
        struct packet *inpacket;
-       struct dhcp_packet *outpacket;
+       struct packet *outpacket;
        struct host_decl *hp;
        int overload;   /* Overload flags that may be set. */
 {
@@ -163,13 +163,13 @@ void cons_options (inpacket, outpacket, hp, overload)
        unsigned char *priority_list;
        int priority_len;
        unsigned char *buffer = inpacket -> raw -> options;
-       int buflen, bufix;
+       int buflen, bufix = 0;
        int reserved = 3;               /* Reserved space for overload. */
        unsigned char *overload_ptr = (unsigned char *)0;
        int stored_length [256];
        int missed = 0;
-       int missed_code;
-       int missed_length;
+       int missed_code = 0;
+       int missed_length = 0;
        int result;
        int i;
 
index 85e79fc6f9607525e2953c3180479816c11dfcff..55d17159593c031de5ba58e3fc25d0e9b51aa801 100644 (file)
@@ -44,6 +44,8 @@ static char copyright[] =
 "@(#) Copyright (c) 1995 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;
index 1ee6eb78b255186a387f5ed15d2b962a3c06206a..e3e0974e50fe52ecca36f0d0cc67f580278be3f3 100644 (file)
@@ -159,6 +159,7 @@ unsigned char packbuf [65536];      /* Should cover the gnarliest MTU... */
 void dispatch ()
 {
        struct sockaddr_in from;
+       struct iaddr ifrom;
        int fromlen = sizeof from;
        fd_set r, w, x;
        struct socklist *l;
@@ -201,7 +202,10 @@ void dispatch ()
                        note ("request from %s, port %d",
                              inet_ntoa (from.sin_addr),
                              htons (from.sin_port));
-                       do_packet (packbuf, result, &from, fromlen, l -> sock);
+                       ifrom.len = 4;
+                       memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len);
+                       do_packet (packbuf, result, from.sin_port,
+                                  ifrom, l -> sock);
                }
        } while (1);
 }
index 30b1ebd5337faccad477c0528d1b37e4e2855415..8f22295e77f8b23bf160983305f71025bc314bdf 100644 (file)
@@ -65,262 +65,262 @@ static char copyright[] =
 
 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", "t",                  &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,
-       "option-77", "",                                &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,
+       { "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", "t",                &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 },
+       { "option-77", "",                              &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
index 3b3e8941c4f35e827188153f4b73b8b3d7cff48a..102d0efd8cbd55133de0ef7518b65ef25118d0e7 100644 (file)
@@ -138,7 +138,7 @@ struct tree *tree_concat (left, right)
                return left;
 
        /* If both trees are constant, combine them. */
-       if (left -> op = TREE_CONST && right -> op == TREE_CONST) {
+       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");
index a7b56dd8d6461b899089502ce6cc6aff430ad256..f059a627dd282ff416a46ef0bd7c1b5216deb7b1 100644 (file)
--- a/conflex.c
+++ b/conflex.c
@@ -87,6 +87,9 @@ static int get_token (cfile)
        int c;
        int i;
        int ttok;
+#ifdef DEBUG_TOKENS
+       static char tb [2];
+#endif
 
        do {
                c = get_char (cfile);
@@ -109,7 +112,13 @@ static int get_token (cfile)
                        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;
                }
@@ -131,6 +140,9 @@ int next_token (rval, cfile)
        }
        if (rval)
                *rval = tval;
+#ifdef DEBUG_TOKENS
+       fprintf (stderr, "%s:%d ", tval, rv);
+#endif
        return rv;
 }
 
@@ -142,6 +154,9 @@ int peek_token (rval, cfile)
                token = get_token (cfile);
        if (rval)
                *rval = tval;
+#ifdef DEBUG_TOKENS
+       fprintf (stderr, "(%s:%d) ", tval, token);
+#endif
        return token;
 }
 
@@ -255,11 +270,15 @@ static int intern (atom, dfv)
        int dfv;
 {
        switch (atom [0]) {
-             case 'h':
-               if (!strcasecmp (atom + 1, "ost"))
-                       return HOST;
-               if (!strcasecmp (atom + 1, "ardware"))
-                       return HARDWARE;
+             case 'c':
+               if (!strcasecmp (atom + 1, "lass"))
+                       return CLASS;
+               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"))
@@ -267,14 +286,36 @@ static int intern (atom, dfv)
                if (!strcasecmp (atom + 1, "ixed-address"))
                        return FIXED_ADDR;
                break;
-             case 'e':
-               if (!strcasecmp (atom + 1, "thernet"))
-                       return ETHERNET;
+             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 '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;
+               break;
+             case 't':
+               if (!strcasecmp (atom + 1, "timestamp"))
+                       return TIMESTAMP;
+               break;
+             case 'u':
+               if (!strcasecmp (atom + 1, "id"))
+                       return UID;
+               break;
        }
        return dfv;
 }
index 05de62590abedad1a358c43d1f8dae6fb23cd258..4e40217d55295eb9a6e38f2f9566c6efe27a718d 100644 (file)
@@ -126,7 +126,7 @@ void skip_to_semi (cfile)
 
 /* host_statement :== HOST hostname declarations SEMI
    host_declarations :== <nil> | host_declaration
-                              | host_declarations host_declaration */
+                              | host_declarations host_declaration SEMI */
 
 struct host_decl *parse_host_statement (cfile, bc)
        FILE *cfile;
@@ -171,7 +171,7 @@ char *parse_host_name (cfile, bc)
                /* Read a token, which should be an identifier. */
                token = next_token (&val, cfile);
                if (!is_identifier (token)) {
-                       parse_warn ("expecting an identified in hostname");
+                       parse_warn ("expecting an identifier in hostname");
                        skip_to_semi (cfile);
                        longjmp (*bc, 1);
                }
@@ -560,7 +560,7 @@ void parse_option_decl (cfile, bc, decl)
        decl -> options [option -> code] = tree_cache (tree);
 }
 
-/* timestamp :== TIMESTAMP date
+/* 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. */
@@ -569,10 +569,21 @@ TIME parse_timestamp (cfile, bc)
        FILE *cfile;
        jmp_buf *bc;
 {
-       return parse_date (cfile, 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 (*bc, 1);
+       }
+       return rv;
 }
                
-/* lease_decl :== LEASE ip_address lease_modifiers
+/* lease_decl :== LEASE ip_address lease_modifiers SEMI
    lease_modifiers :== <nil>
                |       lease_modifier
                |       lease_modifier lease_modifiers
@@ -601,7 +612,8 @@ struct lease *parse_lease_statement (cfile, bc)
 
        /* Get the address for which the lease has been issued. */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&lease.ip_addr, addr, len);
+       memcpy (lease.ip_addr.iabuf, addr, len);
+       lease.ip_addr.len = len;
 
        do {
                token = next_token (&val, cfile);
@@ -659,7 +671,7 @@ struct lease *parse_lease_statement (cfile, bc)
                                        find_host_by_name (val);
                                if (!lease.host)
                                        parse_warn ("lease host ``%s'' is %s",
-                                                   lease.host,
+                                                   val,
                                                    "no longer known.");
                                break;
                                        
@@ -688,34 +700,47 @@ struct lease *parse_lease_statement (cfile, bc)
                }
                if (seenmask & seenbit) {
                        parse_warn ("Too many %s declarations in lease %s\n",
-                                   tbuf, inet_ntoa (lease.ip_addr));
+                                   tbuf, piaddr (lease.ip_addr));
                } else
                        seenmask |= seenbit;
        } while (1);
        return &lease;
 }
 
-/* address_range :== RANGE ip_address ip_address ip_address */
+/* address_range :== RANGE ip_address ip_address ip_address SEMI */
 
 void parse_address_range (cfile, bc)
        FILE *cfile;
        jmp_buf *bc;
 {
-       struct in_addr low, high, mask;
+       struct iaddr low, high, mask;
        unsigned char addr [4];
        int len = sizeof addr;
+       int token;
+       char *val;
 
        /* Get the bottom address in the range... */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&low, addr, len);
+       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, addr, len);
+       memcpy (high.iabuf, addr, len);
+       high.len = len;
 
        /* Get the netmask of the subnet containing the range... */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&mask, addr, len);
+       memcpy (mask.iabuf, addr, len);
+       mask.len = len;
+
+       /* Snarf the semi... */
+       token = next_token (&val, cfile);
+       if (token != SEMI) {
+               parse_warn ("semicolon expected");
+               skip_to_semi (cfile);
+               longjmp (*bc, 1);
+       }
 
        /* Create the new address range... */
        new_address_range (low, high, mask);
@@ -744,7 +769,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_wday = atoi (token);
+       tm.tm_wday = atoi (val);
 
        /* Year... */
        token = next_token (&val, cfile);
@@ -754,7 +779,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_year = atoi (token);
+       tm.tm_year = atoi (val);
        if (tm.tm_year > 1900)
                tm.tm_year -= 1900;
 
@@ -775,7 +800,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_mon = atoi (token);
+       tm.tm_mon = atoi (val);
 
        /* Slash seperating month from day... */
        token = next_token (&val, cfile);
@@ -794,7 +819,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_mday = atoi (token);
+       tm.tm_mday = atoi (val);
 
        /* Hour... */
        token = next_token (&val, cfile);
@@ -804,7 +829,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_hour = atoi (token);
+       tm.tm_hour = atoi (val);
 
        /* Colon seperating hour from minute... */
        token = next_token (&val, cfile);
@@ -823,7 +848,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_min = atoi (token);
+       tm.tm_min = atoi (val);
 
        /* Colon seperating minute from second... */
        token = next_token (&val, cfile);
@@ -842,7 +867,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_sec = atoi (token);
+       tm.tm_sec = atoi (val);
 
        tm.tm_zone = "GMT";
        tm.tm_isdst = 0;
diff --git a/dhcpd.c b/dhcpd.c
index b2687e65621e88d1367aa9dc6fd9a7ffd38a10a2..d5a199be52bd49eaa9029b9b67a8f057dddf9af2 100644 (file)
--- a/dhcpd.c
+++ b/dhcpd.c
@@ -165,6 +165,9 @@ int main (argc, argv, envp)
 
        /* Receive packets and dispatch them... */
        dispatch ();
+
+       /* Not reached */
+       return 0;
 }
 
 /* Print usage message. */
@@ -178,11 +181,11 @@ void cleanup ()
 {
 }
 
-void do_packet (packbuf, len, from, fromlen, sock)
+void do_packet (packbuf, len, from_port, from, sock)
        unsigned char *packbuf;
        int len;
-       struct sockaddr_in *from;
-       int fromlen;
+       unsigned long from_port;
+       struct iaddr from;
        int sock;
 {
        struct packet *tp;
@@ -198,8 +201,8 @@ void do_packet (packbuf, len, from, fromlen, sock)
        memset (tp, 0, sizeof *tp);
        tp -> raw = tdp;
        tp -> packet_length = len;
-       tp -> client = *from;
-       tp -> client_len = fromlen;
+       tp -> client_port = from_port;
+       tp -> client_addr = from;
        tp -> client_sock = sock;
        parse_options (tp);
        if (tp -> options_valid &&
@@ -209,7 +212,7 @@ void do_packet (packbuf, len, from, fromlen, sock)
                bootp (tp);
 }
 
-dump_packet (tp)
+void dump_packet (tp)
        struct packet *tp;
 {
        struct dhcp_packet *tdp = tp -> raw;
index 36d8f0eebfd50e34f611b98a7d29b472453491aa..4825784069e98e92ce4586016edbbaf0b8510b8d 100644 (file)
@@ -1,3 +1,5 @@
+range 204.254.239.11 204.254.239.254 255.255.255.0;
+
 host minuet
        hardware ethernet 08:00:2b:35:0c:18
        filename "/tftpboot/netbsd.minuet"
@@ -15,3 +17,14 @@ host fantasia
        option name-servers toccata.fugue.com, passacaglia.fugue.com
        option domain-name "fugue.com";
 
+host avogadro
+       hardware ethernet 08:00:2b:4c:39:12
+       option routers prelude.fugue.com
+       option name-servers toccata.fugue.com
+       option domain-name "fugue.com";
+
+lease 204.254.239.11
+       starts 2 96/2/6 10:14:02
+       ends 2 96/2/6 11:15:02
+       uid 08:00:2b:4c:39:12
+       host avogadro;
diff --git a/dhcpd.h b/dhcpd.h
index ac1367cdd1f83915236667113fca0b4adda5e7e4..5a7c07d14d1b1f5abb7670f460814d6f34e3c586 100644 (file)
--- a/dhcpd.h
+++ b/dhcpd.h
 #include <netdb.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <unistd.h>
+#include <strings.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <ctype.h>
+
 #include "dhcp.h"
 #include "cdefs.h"
 #include "osdep.h"
 #include "tree.h"
 #include "hash.h"
+#include "inet.h"
 
 /* A dhcp packet and the pointers to its option values. */
 struct packet {
@@ -59,8 +67,8 @@ struct packet {
        int packet_length;
        int packet_type;
        int options_valid;
-       struct sockaddr_in client;
-       int client_len;
+       int client_port;
+       struct iaddr client_addr;
        int client_sock;
        struct {
                int len;
@@ -90,7 +98,7 @@ struct host_decl {
 struct lease {
        struct lease *next;
        struct lease *prev;
-       struct in_addr ip_addr;
+       struct iaddr ip_addr;
        TIME starts, ends, timestamp;
        unsigned char *uid;
        int uid_len;
@@ -101,8 +109,8 @@ struct lease {
 };
 
 struct subnet {
-       struct in_addr net;
-       struct in_addr netmask;
+       struct iaddr net;
+       struct iaddr netmask;
        struct lease *leases;
        struct lease *insertion_point;
 };
@@ -130,10 +138,6 @@ typedef unsigned char option_mask [16];
 #endif
 #endif
 
-/* Subnet macros... */
-#define SUBNET(addr, mask) ((addr).s_addr & (netmask).s_addr)
-#define IP_ADDR(net, host) ((net).s_addr | i)
-#define HOST_ADDR(addr, mask)  ((addr).s_addr & ~(netmask).s_addr)
 #define MAX_TIME 0x7fffffff
 #define MIN_TIME 0
 
@@ -143,8 +147,10 @@ typedef unsigned char option_mask [16];
 
 void parse_options PROTO ((struct packet *));
 void parse_option_buffer PROTO ((struct packet *, unsigned char *, int));
-void cons_options PROTO ((struct packet *, struct dhcp_packet *,
+void cons_options PROTO ((struct packet *, struct packet *,
                          struct host_decl *, int));
+int store_option PROTO ((struct packet *, unsigned char,
+                        unsigned char *, int, int *));
 char *pretty_print_option PROTO ((unsigned char, unsigned char *, int));
 
 /* errwarn.c */
@@ -161,7 +167,9 @@ extern int server_addrcount;
 extern u_int16_t server_port;
 int main PROTO ((int, char **, char **));
 void cleanup PROTO ((void));
-void do_packet PROTO ((unsigned char *, int, struct sockaddr_in *, int, int));
+void do_packet PROTO ((unsigned char *, int,
+                      unsigned long, struct iaddr, int));
+void dump_packet PROTO ((struct packet *));
 u_int32_t pick_interface PROTO ((struct packet *));
 
 
@@ -179,6 +187,7 @@ void parse_host_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 void parse_hardware_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 struct hardware parse_hardware_addr PROTO ((FILE *, jmp_buf *));
 void parse_filename_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
+struct tree *parse_ip_addr_or_hostname PROTO ((FILE *, jmp_buf *, int));
 void parse_fixed_addr_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 void parse_option_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 TIME parse_timestamp PROTO ((FILE *, jmp_buf *));
@@ -210,13 +219,14 @@ void bootp PROTO ((struct packet *));
 void enter_host PROTO ((struct host_decl *));
 struct host_decl *find_host_by_name PROTO ((char *name));
 struct host_decl *find_host_by_addr PROTO ((int, unsigned char *, int));
-extern struct subnet *find_subnet (struct in_addr);
+void new_address_range PROTO ((struct iaddr, struct iaddr,
+                              struct iaddr));
+extern struct subnet *find_subnet (struct iaddr);
 void enter_subnet (struct subnet *);
 void enter_lease PROTO ((struct lease *));
 void supersede_lease PROTO ((struct lease *, struct lease *));
 struct lease *find_lease_by_uid PROTO ((unsigned char *, int));
-struct lease *find_lease_by_ip_addr PROTO ((struct in_addr));
-struct lease *find_next_expiring_lease PROTO ((void));
+struct lease *find_lease_by_ip_addr PROTO ((struct iaddr));
 
 /* alloc.c */
 VOIDPTR dmalloc PROTO ((int, char *));
@@ -261,3 +271,19 @@ extern struct hash_table universe_hash;
 extern struct universe dhcp_universe;
 void initialize_universes PROTO ((void));
 
+/* convert.c */
+unsigned long getULong PROTO ((unsigned char *));
+long getLong PROTO ((unsigned char *));
+unsigned short getUShort PROTO ((unsigned char *));
+short getShort PROTO ((unsigned char *));
+void putULong PROTO ((unsigned char *, unsigned long));
+void putLong PROTO ((unsigned char *, long));
+void putUShort PROTO ((unsigned char *, unsigned short));
+void putShort PROTO ((unsigned char *, short));
+
+/* inet.c */
+struct iaddr subnet_number (struct iaddr, struct iaddr);
+struct iaddr ip_addr (struct iaddr, struct iaddr, unsigned long);
+unsigned long host_addr (struct iaddr, struct iaddr);
+int addr_eq (struct iaddr, struct iaddr);
+char *piaddr (struct iaddr);
index 04f057ef0dd3f27a2a0d2ca60ab4b678a4d65df1..1f211f1718dad6a18026755a061f4cf6ae60716d 100644 (file)
@@ -66,6 +66,6 @@
 #define LAST_TOKEN     RANGE
 
 #define is_identifier(x)       ((x) >= FIRST_TOKEN &&  \
-                                (x) <= FIRST_TOKEN &&  \
+                                (x) <= LAST_TOKEN &&   \
                                 (x) != STRING &&       \
                                 (x) != NUMBER)
diff --git a/hash.c b/hash.c
index 9b2d5f9e77492de666ad8600c60652bddba27aa4..8bc724e7aa298545beb8e8923e1927bf5cdc47f7 100644 (file)
--- a/hash.c
+++ b/hash.c
@@ -46,6 +46,8 @@ static char copyright[] =
 
 #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");
@@ -56,7 +58,7 @@ struct hash_table *new_hash ()
        return rv;
 }
 
-static INLINE do_hash (name, len, size)
+static INLINE int do_hash (name, len, size)
        char *name;
        int len;
        int size;
index ac1367cdd1f83915236667113fca0b4adda5e7e4..5a7c07d14d1b1f5abb7670f460814d6f34e3c586 100644 (file)
 #include <netdb.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <unistd.h>
+#include <strings.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <ctype.h>
+
 #include "dhcp.h"
 #include "cdefs.h"
 #include "osdep.h"
 #include "tree.h"
 #include "hash.h"
+#include "inet.h"
 
 /* A dhcp packet and the pointers to its option values. */
 struct packet {
@@ -59,8 +67,8 @@ struct packet {
        int packet_length;
        int packet_type;
        int options_valid;
-       struct sockaddr_in client;
-       int client_len;
+       int client_port;
+       struct iaddr client_addr;
        int client_sock;
        struct {
                int len;
@@ -90,7 +98,7 @@ struct host_decl {
 struct lease {
        struct lease *next;
        struct lease *prev;
-       struct in_addr ip_addr;
+       struct iaddr ip_addr;
        TIME starts, ends, timestamp;
        unsigned char *uid;
        int uid_len;
@@ -101,8 +109,8 @@ struct lease {
 };
 
 struct subnet {
-       struct in_addr net;
-       struct in_addr netmask;
+       struct iaddr net;
+       struct iaddr netmask;
        struct lease *leases;
        struct lease *insertion_point;
 };
@@ -130,10 +138,6 @@ typedef unsigned char option_mask [16];
 #endif
 #endif
 
-/* Subnet macros... */
-#define SUBNET(addr, mask) ((addr).s_addr & (netmask).s_addr)
-#define IP_ADDR(net, host) ((net).s_addr | i)
-#define HOST_ADDR(addr, mask)  ((addr).s_addr & ~(netmask).s_addr)
 #define MAX_TIME 0x7fffffff
 #define MIN_TIME 0
 
@@ -143,8 +147,10 @@ typedef unsigned char option_mask [16];
 
 void parse_options PROTO ((struct packet *));
 void parse_option_buffer PROTO ((struct packet *, unsigned char *, int));
-void cons_options PROTO ((struct packet *, struct dhcp_packet *,
+void cons_options PROTO ((struct packet *, struct packet *,
                          struct host_decl *, int));
+int store_option PROTO ((struct packet *, unsigned char,
+                        unsigned char *, int, int *));
 char *pretty_print_option PROTO ((unsigned char, unsigned char *, int));
 
 /* errwarn.c */
@@ -161,7 +167,9 @@ extern int server_addrcount;
 extern u_int16_t server_port;
 int main PROTO ((int, char **, char **));
 void cleanup PROTO ((void));
-void do_packet PROTO ((unsigned char *, int, struct sockaddr_in *, int, int));
+void do_packet PROTO ((unsigned char *, int,
+                      unsigned long, struct iaddr, int));
+void dump_packet PROTO ((struct packet *));
 u_int32_t pick_interface PROTO ((struct packet *));
 
 
@@ -179,6 +187,7 @@ void parse_host_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 void parse_hardware_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 struct hardware parse_hardware_addr PROTO ((FILE *, jmp_buf *));
 void parse_filename_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
+struct tree *parse_ip_addr_or_hostname PROTO ((FILE *, jmp_buf *, int));
 void parse_fixed_addr_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 void parse_option_decl PROTO ((FILE *, jmp_buf *, struct host_decl *));
 TIME parse_timestamp PROTO ((FILE *, jmp_buf *));
@@ -210,13 +219,14 @@ void bootp PROTO ((struct packet *));
 void enter_host PROTO ((struct host_decl *));
 struct host_decl *find_host_by_name PROTO ((char *name));
 struct host_decl *find_host_by_addr PROTO ((int, unsigned char *, int));
-extern struct subnet *find_subnet (struct in_addr);
+void new_address_range PROTO ((struct iaddr, struct iaddr,
+                              struct iaddr));
+extern struct subnet *find_subnet (struct iaddr);
 void enter_subnet (struct subnet *);
 void enter_lease PROTO ((struct lease *));
 void supersede_lease PROTO ((struct lease *, struct lease *));
 struct lease *find_lease_by_uid PROTO ((unsigned char *, int));
-struct lease *find_lease_by_ip_addr PROTO ((struct in_addr));
-struct lease *find_next_expiring_lease PROTO ((void));
+struct lease *find_lease_by_ip_addr PROTO ((struct iaddr));
 
 /* alloc.c */
 VOIDPTR dmalloc PROTO ((int, char *));
@@ -261,3 +271,19 @@ extern struct hash_table universe_hash;
 extern struct universe dhcp_universe;
 void initialize_universes PROTO ((void));
 
+/* convert.c */
+unsigned long getULong PROTO ((unsigned char *));
+long getLong PROTO ((unsigned char *));
+unsigned short getUShort PROTO ((unsigned char *));
+short getShort PROTO ((unsigned char *));
+void putULong PROTO ((unsigned char *, unsigned long));
+void putLong PROTO ((unsigned char *, long));
+void putUShort PROTO ((unsigned char *, unsigned short));
+void putShort PROTO ((unsigned char *, short));
+
+/* inet.c */
+struct iaddr subnet_number (struct iaddr, struct iaddr);
+struct iaddr ip_addr (struct iaddr, struct iaddr, unsigned long);
+unsigned long host_addr (struct iaddr, struct iaddr);
+int addr_eq (struct iaddr, struct iaddr);
+char *piaddr (struct iaddr);
index 04f057ef0dd3f27a2a0d2ca60ab4b678a4d65df1..1f211f1718dad6a18026755a061f4cf6ae60716d 100644 (file)
@@ -66,6 +66,6 @@
 #define LAST_TOKEN     RANGE
 
 #define is_identifier(x)       ((x) >= FIRST_TOKEN &&  \
-                                (x) <= FIRST_TOKEN &&  \
+                                (x) <= LAST_TOKEN &&   \
                                 (x) != STRING &&       \
                                 (x) != NUMBER)
index 72469ebd4591a1c9d37e576057c616be63b23e73..8c8e67172660547d6c40d9e2c980575f18534804 100644 (file)
@@ -41,6 +41,6 @@
 
 struct iaddr {
        int len;
-       char iabuf [16];
+       unsigned char iabuf [16];
 };
 
diff --git a/inet.c b/inet.c
new file mode 100644 (file)
index 0000000..f221f68
--- /dev/null
+++ b/inet.c
@@ -0,0 +1,154 @@
+/* inet.c
+
+   Subroutines to manipulate internet addresses in a safely portable
+   way... */
+
+/*
+ * 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''.
+ */
+
+#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;
+       unsigned long host_address;
+{
+       int i, j, k;
+       unsigned long 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]) {
+                               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;
+               }
+               rv.iabuf [i + j] = habuf [i];
+       }
+               
+       return rv;
+}
+
+unsigned long host_addr (addr, mask)
+       struct iaddr addr;
+       struct iaddr mask;
+{
+       int i;
+       unsigned long 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/inet.h b/inet.h
index 72469ebd4591a1c9d37e576057c616be63b23e73..8c8e67172660547d6c40d9e2c980575f18534804 100644 (file)
--- a/inet.h
+++ b/inet.h
@@ -41,6 +41,6 @@
 
 struct iaddr {
        int len;
-       char iabuf [16];
+       unsigned char iabuf [16];
 };
 
index c3e1abd5087bb8f94d5860a85b2045c1d7c0563f..6c1f5502bb9c22bd9f5c47cc358527f74fea6c12 100644 (file)
--- a/memory.c
+++ b/memory.c
@@ -92,11 +92,11 @@ struct host_decl *find_host_by_addr (htype, haddr, hlen)
 }
 
 void new_address_range (low, high, netmask)
-       struct in_addr low, high, netmask;
+       struct iaddr low, high, netmask;
 {
        struct lease *address_range, *lp, *plp;
        struct subnet *subnet;
-       struct in_addr net;
+       struct iaddr net;
        int i, max;
        char lowbuf [16], highbuf [16], netbuf [16];
 
@@ -111,11 +111,11 @@ void new_address_range (low, high, netmask)
                lease_hw_addr_hash = new_hash ();
 
        /* Make sure that high and low addresses are in same subnet. */
-       net.s_addr = SUBNET (low, netmask);
-       if (net.s_addr != SUBNET (high, netmask)) {
-               strcpy (lowbuf, inet_ntoa (low));
-               strcpy (highbuf, inet_ntoa (high));
-               strcpy (netbuf, inet_ntoa (netmask));
+       net = subnet_number (low, netmask);
+       if (!addr_eq (net, subnet_number (high, netmask))) {
+               strcpy (lowbuf, piaddr (low));
+               strcpy (highbuf, piaddr (high));
+               strcpy (netbuf, piaddr (netmask));
                error ("Address range %s to %s, netmask %s spans %s!",
                       lowbuf, highbuf, netbuf, "multiple subnets");
        }
@@ -133,27 +133,28 @@ void new_address_range (low, high, netmask)
        }
 
        /* Get the high and low host addresses... */
-       max = HOST_ADDR (high, netmask);
-       i = HOST_ADDR (low, netmask);
+       max = host_addr (high, netmask);
+       i = host_addr (low, netmask);
 
        /* Allow range to be specified high-to-low as well as low-to-high. */
        if (i > max) {
                max = i;
-               i = HOST_ADDR (high, netmask);
+               i = host_addr (high, netmask);
        }
 
        /* Get a lease structure for each address in the range. */
        address_range = new_leases (max - i + 1, "new_address_range");
        if (!address_range) {
-               strcpy (lowbuf, inet_ntoa (low));
-               strcpy (highbuf, inet_ntoa (high));
+               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 - i + 1));
 
        /* Fill out the lease structures with some minimal information. */
        for (; i <= max; i++) {
-               address_range [i].ip_addr.s_addr = IP_ADDR (subnet -> net, i);
+               address_range [i].ip_addr =
+                       ip_addr (subnet -> net, subnet -> netmask, i);
                address_range [i].starts =
                        address_range [i].timestamp = MIN_TIME;
                address_range [i].ends = MIN_TIME;
@@ -163,7 +164,8 @@ void new_address_range (low, high, netmask)
                address_range [i].next = subnet -> leases;
                address_range [i].prev = (struct lease *)0;
                subnet -> leases = &address_range [i];
-               address_range [i].next -> prev = subnet -> leases;
+               if (address_range [i].next)
+                       address_range [i].next -> prev = subnet -> leases;
                add_hash (lease_ip_addr_hash,
                          (char *)&address_range [i].ip_addr,
                          sizeof address_range [i].ip_addr,
@@ -173,16 +175,16 @@ void new_address_range (low, high, netmask)
        /* Find out if any dangling leases are in range... */
        plp = (struct lease *)0;
        for (lp = dangling_leases; lp; lp = lp -> next) {
-               struct in_addr lnet;
+               struct iaddr lnet;
                int lhost;
 
-               lnet.s_addr = SUBNET (lp -> ip_addr, subnet -> netmask);
-               lhost = HOST_ADDR (lp -> ip_addr, subnet -> netmask);
+               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 (lnet.s_addr == subnet -> net.s_addr &&
+               if (addr_eq (lnet, subnet -> net) &&
                    lhost >= i && lhost <= max) {
                        if (plp) {
                                plp -> next = lp -> next;
@@ -198,12 +200,12 @@ void new_address_range (low, high, netmask)
 }
 
 struct subnet *find_subnet (subnet)
-       struct in_addr subnet;
+       struct iaddr subnet;
 {
        struct subnet *rv;
 
        return (struct subnet *)hash_lookup (subnet_hash,
-                                            (char *)&subnet, sizeof subnet);
+                                            (char *)subnet.iabuf, subnet.len);
 }
 
 /* Enter a new subnet into the subnet hash. */
@@ -211,8 +213,8 @@ struct subnet *find_subnet (subnet)
 void enter_subnet (subnet)
        struct subnet *subnet;
 {
-       add_hash (subnet_hash, (char *)&subnet -> net,
-                 sizeof subnet -> net, (unsigned char *)subnet);
+       add_hash (subnet_hash, (char *)subnet -> net.iabuf,
+                 subnet -> net.len, (unsigned char *)subnet);
 }
        
 /* Enter a lease into the system.   This is called by the parser each
@@ -232,7 +234,7 @@ void enter_lease (lease)
                comp = new_lease ("enter_lease");
                if (!comp) {
                        error ("No memory for lease %s\n",
-                              inet_ntoa (lease -> ip_addr));
+                              piaddr (lease -> ip_addr));
                }
                *comp = *lease;
                lease -> next = dangling_leases;
@@ -273,7 +275,7 @@ void supersede_lease (comp, lease)
                       lease -> hardware_addr.haddr,
                       comp -> hardware_addr.hlen))))) {
                warn ("Lease conflict at %s",
-                     inet_ntoa (comp -> ip_addr));
+                     piaddr (comp -> ip_addr));
        } else {
                /* If there's a Unique ID, dissociate it from the hash
                   table if necessary, and always free it. */
@@ -289,13 +291,13 @@ void supersede_lease (comp, lease)
                        free (comp -> uid);
                }
                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)) {
+                   ((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);
@@ -393,3 +395,24 @@ void supersede_lease (comp, lease)
                comp -> contain -> insertion_point = comp;
        }
 }
+
+/* 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;
+}
+
index 2a632797be776d8ce2bbd68274aee1abaea9c6ec..b9a538a11437213bf399a3e347d82390f9e25297 100644 (file)
--- a/options.c
+++ b/options.c
@@ -152,7 +152,7 @@ void parse_option_buffer (packet, buffer, length)
 
 void cons_options (inpacket, outpacket, hp, overload)
        struct packet *inpacket;
-       struct dhcp_packet *outpacket;
+       struct packet *outpacket;
        struct host_decl *hp;
        int overload;   /* Overload flags that may be set. */
 {
@@ -163,13 +163,13 @@ void cons_options (inpacket, outpacket, hp, overload)
        unsigned char *priority_list;
        int priority_len;
        unsigned char *buffer = inpacket -> raw -> options;
-       int buflen, bufix;
+       int buflen, bufix = 0;
        int reserved = 3;               /* Reserved space for overload. */
        unsigned char *overload_ptr = (unsigned char *)0;
        int stored_length [256];
        int missed = 0;
-       int missed_code;
-       int missed_length;
+       int missed_code = 0;
+       int missed_length = 0;
        int result;
        int i;
 
diff --git a/print.c b/print.c
index 85e79fc6f9607525e2953c3180479816c11dfcff..55d17159593c031de5ba58e3fc25d0e9b51aa801 100644 (file)
--- a/print.c
+++ b/print.c
@@ -44,6 +44,8 @@ static char copyright[] =
 "@(#) Copyright (c) 1995 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;
index 6f5d1a5bae42a1aba18da79358f60ccf7305d8ab..348ce0effaaa16dac533926127f1e5009998a199 100644 (file)
@@ -130,7 +130,7 @@ void bootp (packet)
        /* If we got the magic cookie, send it back. */
        if (packet -> options_valid)
                memcpy (reply -> options, packet -> raw -> options, 4);
-       to.sin_port = packet -> client.sin_port;
+       to.sin_port = htons (packet -> client_port);
        to.sin_family = AF_INET;
        to.sin_len = sizeof to;
        memset (to.sin_zero, 0, sizeof to.sin_zero);
index 05de62590abedad1a358c43d1f8dae6fb23cd258..4e40217d55295eb9a6e38f2f9566c6efe27a718d 100644 (file)
@@ -126,7 +126,7 @@ void skip_to_semi (cfile)
 
 /* host_statement :== HOST hostname declarations SEMI
    host_declarations :== <nil> | host_declaration
-                              | host_declarations host_declaration */
+                              | host_declarations host_declaration SEMI */
 
 struct host_decl *parse_host_statement (cfile, bc)
        FILE *cfile;
@@ -171,7 +171,7 @@ char *parse_host_name (cfile, bc)
                /* Read a token, which should be an identifier. */
                token = next_token (&val, cfile);
                if (!is_identifier (token)) {
-                       parse_warn ("expecting an identified in hostname");
+                       parse_warn ("expecting an identifier in hostname");
                        skip_to_semi (cfile);
                        longjmp (*bc, 1);
                }
@@ -560,7 +560,7 @@ void parse_option_decl (cfile, bc, decl)
        decl -> options [option -> code] = tree_cache (tree);
 }
 
-/* timestamp :== TIMESTAMP date
+/* 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. */
@@ -569,10 +569,21 @@ TIME parse_timestamp (cfile, bc)
        FILE *cfile;
        jmp_buf *bc;
 {
-       return parse_date (cfile, 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 (*bc, 1);
+       }
+       return rv;
 }
                
-/* lease_decl :== LEASE ip_address lease_modifiers
+/* lease_decl :== LEASE ip_address lease_modifiers SEMI
    lease_modifiers :== <nil>
                |       lease_modifier
                |       lease_modifier lease_modifiers
@@ -601,7 +612,8 @@ struct lease *parse_lease_statement (cfile, bc)
 
        /* Get the address for which the lease has been issued. */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&lease.ip_addr, addr, len);
+       memcpy (lease.ip_addr.iabuf, addr, len);
+       lease.ip_addr.len = len;
 
        do {
                token = next_token (&val, cfile);
@@ -659,7 +671,7 @@ struct lease *parse_lease_statement (cfile, bc)
                                        find_host_by_name (val);
                                if (!lease.host)
                                        parse_warn ("lease host ``%s'' is %s",
-                                                   lease.host,
+                                                   val,
                                                    "no longer known.");
                                break;
                                        
@@ -688,34 +700,47 @@ struct lease *parse_lease_statement (cfile, bc)
                }
                if (seenmask & seenbit) {
                        parse_warn ("Too many %s declarations in lease %s\n",
-                                   tbuf, inet_ntoa (lease.ip_addr));
+                                   tbuf, piaddr (lease.ip_addr));
                } else
                        seenmask |= seenbit;
        } while (1);
        return &lease;
 }
 
-/* address_range :== RANGE ip_address ip_address ip_address */
+/* address_range :== RANGE ip_address ip_address ip_address SEMI */
 
 void parse_address_range (cfile, bc)
        FILE *cfile;
        jmp_buf *bc;
 {
-       struct in_addr low, high, mask;
+       struct iaddr low, high, mask;
        unsigned char addr [4];
        int len = sizeof addr;
+       int token;
+       char *val;
 
        /* Get the bottom address in the range... */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&low, addr, len);
+       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, addr, len);
+       memcpy (high.iabuf, addr, len);
+       high.len = len;
 
        /* Get the netmask of the subnet containing the range... */
        parse_numeric_aggregate (cfile, bc, addr, &len, DOT, 10, 8);
-       memcpy (&mask, addr, len);
+       memcpy (mask.iabuf, addr, len);
+       mask.len = len;
+
+       /* Snarf the semi... */
+       token = next_token (&val, cfile);
+       if (token != SEMI) {
+               parse_warn ("semicolon expected");
+               skip_to_semi (cfile);
+               longjmp (*bc, 1);
+       }
 
        /* Create the new address range... */
        new_address_range (low, high, mask);
@@ -744,7 +769,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_wday = atoi (token);
+       tm.tm_wday = atoi (val);
 
        /* Year... */
        token = next_token (&val, cfile);
@@ -754,7 +779,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_year = atoi (token);
+       tm.tm_year = atoi (val);
        if (tm.tm_year > 1900)
                tm.tm_year -= 1900;
 
@@ -775,7 +800,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_mon = atoi (token);
+       tm.tm_mon = atoi (val);
 
        /* Slash seperating month from day... */
        token = next_token (&val, cfile);
@@ -794,7 +819,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_mday = atoi (token);
+       tm.tm_mday = atoi (val);
 
        /* Hour... */
        token = next_token (&val, cfile);
@@ -804,7 +829,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_hour = atoi (token);
+       tm.tm_hour = atoi (val);
 
        /* Colon seperating hour from minute... */
        token = next_token (&val, cfile);
@@ -823,7 +848,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_min = atoi (token);
+       tm.tm_min = atoi (val);
 
        /* Colon seperating minute from second... */
        token = next_token (&val, cfile);
@@ -842,7 +867,7 @@ TIME parse_date (cfile, bc)
                        skip_to_semi (cfile);
                longjmp (*bc, 1);
        }
-       tm.tm_sec = atoi (token);
+       tm.tm_sec = atoi (val);
 
        tm.tm_zone = "GMT";
        tm.tm_isdst = 0;
index b2687e65621e88d1367aa9dc6fd9a7ffd38a10a2..d5a199be52bd49eaa9029b9b67a8f057dddf9af2 100644 (file)
@@ -165,6 +165,9 @@ int main (argc, argv, envp)
 
        /* Receive packets and dispatch them... */
        dispatch ();
+
+       /* Not reached */
+       return 0;
 }
 
 /* Print usage message. */
@@ -178,11 +181,11 @@ void cleanup ()
 {
 }
 
-void do_packet (packbuf, len, from, fromlen, sock)
+void do_packet (packbuf, len, from_port, from, sock)
        unsigned char *packbuf;
        int len;
-       struct sockaddr_in *from;
-       int fromlen;
+       unsigned long from_port;
+       struct iaddr from;
        int sock;
 {
        struct packet *tp;
@@ -198,8 +201,8 @@ void do_packet (packbuf, len, from, fromlen, sock)
        memset (tp, 0, sizeof *tp);
        tp -> raw = tdp;
        tp -> packet_length = len;
-       tp -> client = *from;
-       tp -> client_len = fromlen;
+       tp -> client_port = from_port;
+       tp -> client_addr = from;
        tp -> client_sock = sock;
        parse_options (tp);
        if (tp -> options_valid &&
@@ -209,7 +212,7 @@ void do_packet (packbuf, len, from, fromlen, sock)
                bootp (tp);
 }
 
-dump_packet (tp)
+void dump_packet (tp)
        struct packet *tp;
 {
        struct dhcp_packet *tdp = tp -> raw;
index 36d8f0eebfd50e34f611b98a7d29b472453491aa..4825784069e98e92ce4586016edbbaf0b8510b8d 100644 (file)
@@ -1,3 +1,5 @@
+range 204.254.239.11 204.254.239.254 255.255.255.0;
+
 host minuet
        hardware ethernet 08:00:2b:35:0c:18
        filename "/tftpboot/netbsd.minuet"
@@ -15,3 +17,14 @@ host fantasia
        option name-servers toccata.fugue.com, passacaglia.fugue.com
        option domain-name "fugue.com";
 
+host avogadro
+       hardware ethernet 08:00:2b:4c:39:12
+       option routers prelude.fugue.com
+       option name-servers toccata.fugue.com
+       option domain-name "fugue.com";
+
+lease 204.254.239.11
+       starts 2 96/2/6 10:14:02
+       ends 2 96/2/6 11:15:02
+       uid 08:00:2b:4c:39:12
+       host avogadro;
index 1ee6eb78b255186a387f5ed15d2b962a3c06206a..e3e0974e50fe52ecca36f0d0cc67f580278be3f3 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -159,6 +159,7 @@ unsigned char packbuf [65536];      /* Should cover the gnarliest MTU... */
 void dispatch ()
 {
        struct sockaddr_in from;
+       struct iaddr ifrom;
        int fromlen = sizeof from;
        fd_set r, w, x;
        struct socklist *l;
@@ -201,7 +202,10 @@ void dispatch ()
                        note ("request from %s, port %d",
                              inet_ntoa (from.sin_addr),
                              htons (from.sin_port));
-                       do_packet (packbuf, result, &from, fromlen, l -> sock);
+                       ifrom.len = 4;
+                       memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len);
+                       do_packet (packbuf, result, from.sin_port,
+                                  ifrom, l -> sock);
                }
        } while (1);
 }
index 30b1ebd5337faccad477c0528d1b37e4e2855415..8f22295e77f8b23bf160983305f71025bc314bdf 100644 (file)
--- a/tables.c
+++ b/tables.c
@@ -65,262 +65,262 @@ static char copyright[] =
 
 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", "t",                  &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,
-       "option-77", "",                                &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,
+       { "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", "t",                &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 },
+       { "option-77", "",                              &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
diff --git a/tree.c b/tree.c
index 3b3e8941c4f35e827188153f4b73b8b3d7cff48a..102d0efd8cbd55133de0ef7518b65ef25118d0e7 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -138,7 +138,7 @@ struct tree *tree_concat (left, right)
                return left;
 
        /* If both trees are constant, combine them. */
-       if (left -> op = TREE_CONST && right -> op == TREE_CONST) {
+       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");