]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Moved to server/
authorTed Lemon <source@isc.org>
Sat, 22 Feb 1997 12:56:43 +0000 (12:56 +0000)
committerTed Lemon <source@isc.org>
Sat, 22 Feb 1997 12:56:43 +0000 (12:56 +0000)
bootp.c [deleted file]
conflex.c [deleted file]
db.c [deleted file]
dhcp.c [deleted file]
dhcpd.8 [deleted file]
dhcpd.c [deleted file]
dhcpd.conf [deleted file]
dhcpd.conf.5 [deleted file]
dhcpd.conf.cat5 [deleted file]

diff --git a/bootp.c b/bootp.c
deleted file mode 100644 (file)
index 7564af4..0000000
--- a/bootp.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/* bootp.c
-
-   BOOTP Protocol support. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises.  To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''.  To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: bootp.c,v 1.24 1997/02/22 08:36:36 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-void bootp (packet)
-       struct packet *packet;
-{
-       int result;
-       struct host_decl *hp;
-       struct host_decl *host = (struct host_decl *)0;
-       struct packet outgoing;
-       struct dhcp_packet raw;
-       struct sockaddr_in to;
-       struct in_addr from;
-       struct hardware hto;
-       struct tree_cache *options [256];
-       struct subnet *subnet;
-       struct lease *lease;
-       struct iaddr ip_address;
-       int i;
-
-       note ("BOOTREQUEST from %s via %s",
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-
-
-       if (!locate_network (packet))
-               return;
-
-       hp = find_hosts_by_haddr (packet -> raw -> htype,
-                                 packet -> raw -> chaddr,
-                                 packet -> raw -> hlen);
-
-       lease = find_lease (packet, packet -> shared_network);
-
-       /* Find an IP address in the host_decl that matches the
-          specified network. */
-       if (hp)
-               subnet = find_host_for_network (&hp, &ip_address,
-                                               packet -> shared_network);
-       else
-               subnet = (struct subnet *)0;
-
-       if (!subnet) {
-               /* We didn't find an applicable host declaration.
-                  Just in case we may be able to dynamically assign
-                  an address, see if there's a host declaration
-                  that doesn't have an ip address associated with it. */
-               if (hp) {
-                       for (; hp; hp = hp -> n_ipaddr) {
-                               if (!hp -> fixed_addr) {
-                                       host = hp;
-                                       break;
-                               }
-                       }
-               }
-
-               if (host && (!host -> group -> allow_booting)) {
-                       note ("Ignoring excluded BOOTP client %s",
-                             host -> name);
-                       return;
-               }
-                       
-               if (host && (!host -> group -> allow_bootp)) {
-                       note ("Ignoring BOOTP request from client %s",
-                             host -> name);
-                       return;
-               }
-                       
-               /* If we've been told not to boot unknown clients,
-                  and we didn't find any host record for this client,
-                  ignore it. */
-               if (!host && !(packet -> shared_network ->
-                              group -> boot_unknown_clients)) {
-                       note ("Ignoring unknown BOOTP client %s via %s",
-                             print_hw_addr (packet -> raw -> htype,
-                                            packet -> raw -> hlen,
-                                            packet -> raw -> chaddr),
-                             packet -> raw -> giaddr.s_addr
-                             ? inet_ntoa (packet -> raw -> giaddr)
-                             : packet -> interface -> name);
-                       return;
-               }
-
-               /* If we've been told not to boot with bootp on this
-                  network, ignore it. */
-               if (!host &&
-                   !(packet -> shared_network -> group -> allow_bootp)) {
-                       note ("Ignoring BOOTP request from client %s via %s",
-                             print_hw_addr (packet -> raw -> htype,
-                                            packet -> raw -> hlen,
-                                            packet -> raw -> chaddr),
-                             packet -> raw -> giaddr.s_addr
-                             ? inet_ntoa (packet -> raw -> giaddr)
-                             : packet -> interface -> name);
-                       return;
-               }
-
-               /* If the packet is from a host we don't know and there
-                  are no dynamic bootp addresses on the network it came
-                  in on, drop it on the floor. */
-               if (!(packet -> shared_network -> group -> dynamic_bootp)) {
-                     lose:
-                       note ("No applicable record for BOOTP host %s via %s",
-                             print_hw_addr (packet -> raw -> htype,
-                                            packet -> raw -> hlen,
-                                            packet -> raw -> chaddr),
-                             packet -> raw -> giaddr.s_addr
-                             ? inet_ntoa (packet -> raw -> giaddr)
-                             : packet -> interface -> name);
-                       return;
-               }
-
-               /* If a lease has already been assigned to this client
-                  and it's still okay to use dynamic bootp on
-                  that lease, reassign it. */
-               if (lease) {
-                       /* If this lease can be used for dynamic bootp,
-                          do so. */
-                       if ((lease -> flags & DYNAMIC_BOOTP_OK)) {
-
-                               /* If it's not a DYNAMIC_BOOTP lease,
-                                  release it before reassigning it
-                                  so that we don't get a lease
-                                  conflict. */
-                               if (!(lease -> flags & BOOTP_LEASE))
-                                       release_lease (lease);
-
-                               lease -> host = host;
-                               ack_lease (packet, lease, 0, 0);
-                               return;
-                       }
-
-                        /* If dynamic BOOTP is no longer allowed for
-                          this lease, set it free. */
-                       release_lease (lease);
-               }
-
-               /* If there are dynamic bootp addresses that might be
-                  available, try to snag one. */
-               for (lease = packet -> shared_network -> last_lease;
-                    lease && lease -> ends <= cur_time;
-                    lease = lease -> prev) {
-                       if ((lease -> flags & DYNAMIC_BOOTP_OK)) {
-                               lease -> host = host;
-                               ack_lease (packet, lease, 0, 0);
-                               return;
-                       }
-               }
-               goto lose;
-       }
-
-       /* Make sure we're allowed to boot this client. */
-       if (hp && (!hp -> group -> allow_booting)) {
-               note ("Ignoring excluded BOOTP client %s",
-                     hp -> name);
-               return;
-       }
-                       
-       /* Make sure we're allowed to boot this client with bootp. */
-       if (hp && (!hp -> group -> allow_bootp)) {
-               note ("Ignoring BOOTP request from client %s",
-                     hp -> name);
-               return;
-       }
-                       
-       /* Set up the outgoing packet... */
-       memset (&outgoing, 0, sizeof outgoing);
-       memset (&raw, 0, sizeof raw);
-       outgoing.raw = &raw;
-
-       /* Come up with a list of options that we want to send to this
-          client.   Start with the per-subnet options, and then override
-          those with client-specific options. */
-
-       memcpy (options, subnet -> group -> options, sizeof options);
-
-       for (i = 0; i < 256; i++) {
-               if (hp -> group -> options [i])
-                       options [i] = hp -> group -> options [i];
-       }
-
-       /* Pack the options into the buffer.   Unlike DHCP, we can't
-          pack options into the filename and server name buffers. */
-
-       outgoing.packet_length =
-               cons_options (packet, outgoing.raw, options, 0, 0);
-       if (outgoing.packet_length < BOOTP_MIN_LEN)
-               outgoing.packet_length = BOOTP_MIN_LEN;
-
-       /* Take the fields that we care about... */
-       raw.op = BOOTREPLY;
-       raw.htype = packet -> raw -> htype;
-       raw.hlen = packet -> raw -> hlen;
-       memcpy (raw.chaddr, packet -> raw -> chaddr, raw.hlen);
-       memset (&raw.chaddr [raw.hlen], 0,
-               (sizeof raw.chaddr) - raw.hlen);
-       raw.hops = packet -> raw -> hops;
-       raw.xid = packet -> raw -> xid;
-       raw.secs = packet -> raw -> secs;
-       raw.flags = 0;
-       raw.ciaddr = packet -> raw -> ciaddr;
-       memcpy (&raw.yiaddr, ip_address.iabuf, sizeof raw.yiaddr);
-
-       /* Figure out the address of the next server. */
-       if (hp  && hp -> group -> next_server.len)
-               memcpy (&raw.siaddr, hp -> group -> next_server.iabuf, 4);
-       else if (subnet -> group -> next_server.len)
-               memcpy (&raw.siaddr, subnet -> group -> next_server.iabuf, 4);
-       else if (subnet -> interface_address.len)
-               memcpy (&raw.siaddr, subnet -> interface_address.iabuf, 4);
-       else
-               raw.siaddr = packet -> interface -> primary_address;
-
-       raw.giaddr = packet -> raw -> giaddr;
-       if (hp -> group -> server_name) {
-               strncpy (raw.sname, hp -> group -> server_name,
-                        (sizeof raw.sname) - 1);
-               raw.sname [(sizeof raw.sname) - 1] = 0;
-       }
-       if (hp -> group -> filename) {
-               strncpy (raw.file, hp -> group -> filename,
-                        (sizeof raw.file) - 1);
-               raw.file [(sizeof raw.file) - 1] = 0;
-       }
-
-       /* Set up the hardware destination address... */
-       hto.htype = packet -> raw -> htype;
-       hto.hlen = packet -> raw -> hlen;
-       memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
-       from = packet -> interface -> primary_address;
-
-       /* Report what we're doing... */
-       note ("BOOTREPLY for %s to %s (%s) via %s",
-             piaddr (ip_address), hp -> name,
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-       /* Set up the parts of the address that are in common. */
-       to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
-       to.sin_len = sizeof to;
-#endif
-       memset (to.sin_zero, 0, sizeof to.sin_zero);
-
-       /* If this was gatewayed, send it back to the gateway... */
-       if (raw.giaddr.s_addr) {
-               to.sin_addr = raw.giaddr;
-               to.sin_port = local_port;
-
-#ifdef USE_FALLBACK
-               result = send_fallback (&fallback_interface,
-                                       (struct packet *)0,
-                                       &raw, outgoing.packet_length,
-                                       from, &to, &hto);
-               if (result < 0)
-                       warn ("send_fallback: %m");
-               return;
-#endif
-       /* Otherwise, broadcast it on the local network. */
-       } else {
-               to.sin_addr.s_addr = INADDR_BROADCAST;
-               to.sin_port = remote_port; /* XXX */
-       }
-
-       errno = 0;
-       result = send_packet (packet -> interface,
-                             packet, &raw, outgoing.packet_length,
-                             from, &to, &hto);
-       if (result < 0)
-               warn ("send_packet: %m");
-}
-
-void relay (ip, packet, length)
-       struct interface_info *ip;
-       struct dhcp_packet *packet;
-       int length;
-{
-}
diff --git a/conflex.c b/conflex.c
deleted file mode 100644 (file)
index a13f266..0000000
--- a/conflex.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/* conflex.c
-
-   Lexical scanner for dhcpd config file... */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises.  To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''.  To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: conflex.c,v 1.22 1997/02/22 12:23:40 mellon Exp $ Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.  All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include "dhctoken.h"
-#include <ctype.h>
-
-int lexline;
-int lexchar;
-char *token_line;
-char *prev_line;
-char *cur_line;
-char *tlname;
-
-static char line1 [81];
-static char line2 [81];
-static int lpos;
-static int line;
-static int tlpos;
-static int tline;
-static int token;
-static int ugflag;
-static char *tval;
-static char tokbuf [1500];
-
-#ifdef OLD_LEXER
-char comments [4096];
-int comment_index;
-#endif
-
-
-static int get_char PROTO ((FILE *));
-static int get_token PROTO ((FILE *));
-static void skip_to_eol PROTO ((FILE *));
-static int read_string PROTO ((FILE *));
-static int read_number PROTO ((int, FILE *));
-static int read_num_or_name PROTO ((int, FILE *));
-static int intern PROTO ((char *, int));
-
-void new_parse (name)
-       char *name;
-{
-       tlname = name;
-       lpos = line = 1;
-       cur_line = line1;
-       prev_line = line2;
-       token_line = cur_line;
-       cur_line [0] = prev_line [0] = 0;
-       warnings_occurred = 0;
-}
-
-static int get_char (cfile)
-       FILE *cfile;
-{
-       int c = getc (cfile);
-       if (!ugflag) {
-               if (c == EOL) {
-                       if (cur_line == line1) {        
-                               cur_line = line2;
-                               prev_line = line1;
-                       } else {
-                               cur_line = line2;
-                               prev_line = line1;
-                       }
-                       line++;
-                       lpos = 1;
-                       cur_line [0] = 0;
-               } else if (c != EOF) {
-                       if (lpos <= 81) {
-                               cur_line [lpos - 1] = c;
-                               cur_line [lpos] = 0;
-                       }
-                       lpos++;
-               }
-       } else
-               ugflag = 0;
-       return c;               
-}
-
-static int get_token (cfile)
-       FILE *cfile;
-{
-       int c;
-       int ttok;
-       static char tb [2];
-       int l, p, u;
-
-       do {
-               l = line;
-               p = lpos;
-               u = ugflag;
-
-               c = get_char (cfile);
-#ifdef OLD_LEXER
-               if (c == '\n' && p == 1 && !u
-                   && comment_index < sizeof comments)
-                       comments [comment_index++] = '\n';
-#endif
-
-               if (isascii (c) && isspace (c))
-                       continue;
-               if (c == '#') {
-#ifdef OLD_LEXER
-                       if (comment_index < sizeof comments)
-                               comments [comment_index++] = '#';
-#endif
-                       skip_to_eol (cfile);
-                       continue;
-               }
-               if (c == '"') {
-                       lexline = l;
-                       lexchar = p;
-                       ttok = read_string (cfile);
-                       break;
-               }
-               if ((isascii (c) && isdigit (c)) || c == '-') {
-                       lexline = l;
-                       lexchar = p;
-                       ttok = read_number (c, cfile);
-                       break;
-               } else if (isascii (c) && isalpha (c)) {
-                       lexline = l;
-                       lexchar = p;
-                       ttok = read_num_or_name (c, cfile);
-                       break;
-               } else {
-                       lexline = l;
-                       lexchar = p;
-                       tb [0] = c;
-                       tb [1] = 0;
-                       tval = tb;
-                       ttok = c;
-                       break;
-               }
-       } while (1);
-       return ttok;
-}
-
-int next_token (rval, cfile)
-       char **rval;
-       FILE *cfile;
-{
-       int rv;
-
-       if (token) {
-               if (lexline != tline)
-                       token_line = cur_line;
-               lexchar = tlpos;
-               lexline = tline;
-               rv = token;
-               token = 0;
-       } else {
-               rv = get_token (cfile);
-               token_line = cur_line;
-       }
-       if (rval)
-               *rval = tval;
-#ifdef DEBUG_TOKENS
-       fprintf (stderr, "%s:%d ", tval, rv);
-#endif
-       return rv;
-}
-
-int peek_token (rval, cfile)
-       char **rval;
-       FILE *cfile;
-{
-       int x;
-
-       if (!token) {
-               tlpos = lexchar;
-               tline = lexline;
-               token = get_token (cfile);
-               if (lexline != tline)
-                       token_line = prev_line;
-               x = lexchar; lexchar = tlpos; tlpos = x;
-               x = lexline; lexline = tline; tline = x;
-       }
-       if (rval)
-               *rval = tval;
-#ifdef DEBUG_TOKENS
-       fprintf (stderr, "(%s:%d) ", tval, token);
-#endif
-       return token;
-}
-
-static void skip_to_eol (cfile)
-       FILE *cfile;
-{
-       int c;
-       do {
-               c = get_char (cfile);
-               if (c == EOF)
-                       return;
-#ifdef OLD_LEXER
-               if (comment_index < sizeof (comments))
-                       comments [comment_index++] = c;
-#endif
-               if (c == EOL) {
-                       return;
-               }
-       } while (1);
-}
-
-static int read_string (cfile)
-       FILE *cfile;
-{
-       int i;
-       int bs = 0;
-       int c;
-
-       for (i = 0; i < sizeof tokbuf; i++) {
-               c = get_char (cfile);
-               if (c == EOF) {
-                       parse_warn ("eof in string constant");
-                       break;
-               }
-               if (bs) {
-                       bs = 0;
-                       tokbuf [i] = c;
-               } else if (c == '\\')
-                       bs = 1;
-               else if (c == '"')
-                       break;
-               else
-                       tokbuf [i] = c;
-       }
-       /* Normally, I'd feel guilty about this, but we're talking about
-          strings that'll fit in a DHCP packet here... */
-       if (i == sizeof tokbuf) {
-               parse_warn ("string constant larger than internal buffer");
-               --i;
-       }
-       tokbuf [i] = 0;
-       tval = tokbuf;
-       return STRING;
-}
-
-static int read_number (c, cfile)
-       int c;
-       FILE *cfile;
-{
-       int seenx = 0;
-       int i = 0;
-       int token = NUMBER;
-
-       tokbuf [i++] = c;
-       for (; i < sizeof tokbuf; i++) {
-               c = get_char (cfile);
-               if (!seenx && c == 'x') {
-                       seenx = 1;
-#ifndef OLD_LEXER
-               } else if (isascii (c) && !isxdigit (c) &&
-                          (c == '-' || c == '_' || isalpha (c))) {
-                       token = NAME;
-               } else if (isascii (c) && !isdigit (c) && isxdigit (c)) {
-                       token = NUMBER_OR_NAME;
-#endif
-               } else if (!isascii (c) || !isxdigit (c)) {
-                       ungetc (c, cfile);
-                       ugflag = 1;
-                       break;
-               }
-               tokbuf [i] = c;
-       }
-       if (i == sizeof tokbuf) {
-               parse_warn ("numeric token larger than internal buffer");
-               --i;
-       }
-       tokbuf [i] = 0;
-       tval = tokbuf;
-       return token;
-}
-
-static int read_num_or_name (c, cfile)
-       int c;
-       FILE *cfile;
-{
-       int i = 0;
-       int rv = NUMBER_OR_NAME;
-       tokbuf [i++] = c;
-       for (; i < sizeof tokbuf; i++) {
-               c = get_char (cfile);
-               if (!isascii (c) ||
-                   (c != '-' && c != '_' && !isalnum (c))) {
-                       ungetc (c, cfile);
-                       ugflag = 1;
-                       break;
-               }
-               if (!isxdigit (c))
-                       rv = NAME;
-               tokbuf [i] = c;
-       }
-       if (i == sizeof tokbuf) {
-               parse_warn ("token larger than internal buffer");
-               --i;
-       }
-       tokbuf [i] = 0;
-       tval = tokbuf;
-       return intern (tval, rv);
-}
-
-static int intern (atom, dfv)
-       char *atom;
-       int dfv;
-{
-       if (!isascii (atom [0]))
-               return dfv;
-
-       switch (tolower (atom [0])) {
-             case 'a':
-               if (!strcasecmp (atom + 1, "llow"))
-                       return ALLOW;
-               if (!strcasecmp (atom + 1, "lias"))
-                       return ALIAS;
-               break;
-             case 'b':
-               if (!strcasecmp (atom + 1, "ootp"))
-                       return BOOTP;
-               if (!strcasecmp (atom + 1, "ooting"))
-                       return BOOTING;
-               if (!strcasecmp (atom + 1, "oot-unknown-clients"))
-                       return BOOT_UNKNOWN_CLIENTS;
-             case 'c':
-               if (!strcasecmp (atom + 1, "lass"))
-                       return CLASS;
-               if (!strcasecmp (atom + 1, "iaddr"))
-                       return CIADDR;
-               if (!strcasecmp (atom + 1, "lient-identifier"))
-                       return CLIENT_IDENTIFIER;
-               break;
-             case 'd':
-               if (!strcasecmp (atom + 1, "eny"))
-                       return DENY;
-               if (!strncasecmp (atom + 1, "efault", 6)) {
-                       if (!atom [7])
-                               return DEFAULT;
-                       if (!strcasecmp (atom + 7, "-lease-time"))
-                               return DEFAULT_LEASE_TIME;
-                       break;
-               }
-               if (!strncasecmp (atom + 1, "ynamic-bootp", 12)) {
-                       if (!atom [13])
-                               return DYNAMIC_BOOTP;
-                       if (!strcasecmp (atom + 13, "-lease-cutoff"))
-                               return DYNAMIC_BOOTP_LEASE_CUTOFF;
-                       if (!strcasecmp (atom + 13, "-lease-length"))
-                               return DYNAMIC_BOOTP_LEASE_LENGTH;
-                       break;
-               }
-               break;
-             case 'e':
-               if (!strcasecmp (atom + 1, "thernet"))
-                       return ETHERNET;
-               if (!strcasecmp (atom + 1, "nds"))
-                       return ENDS;
-               if (!strcasecmp (atom + 1, "xpire"))
-                       return EXPIRE;
-               break;
-             case 'f':
-               if (!strcasecmp (atom + 1, "ilename"))
-                       return FILENAME;
-               if (!strcasecmp (atom + 1, "ixed-address"))
-                       return FIXED_ADDR;
-               break;
-             case 'g':
-               if (!strcasecmp (atom + 1, "iaddr"))
-                       return GIADDR;
-               if (!strcasecmp (atom + 1, "roup"))
-                       return GROUP;
-               if (!strcasecmp (atom + 1, "et-lease-hostnames"))
-                       return GET_LEASE_HOSTNAMES;
-               break;
-             case 'h':
-               if (!strcasecmp (atom + 1, "ost"))
-                       return HOST;
-               if (!strcasecmp (atom + 1, "ardware"))
-                       return HARDWARE;
-               break;
-             case 'i':
-               if (!strcasecmp (atom + 1, "nterface"))
-                       return INTERFACE;
-               break;
-             case 'l':
-               if (!strcasecmp (atom + 1, "ease"))
-                       return LEASE;
-               break;
-             case 'm':
-               if (!strcasecmp (atom + 1, "ax-lease-time"))
-                       return MAX_LEASE_TIME;
-               if (!strncasecmp (atom + 1, "edi", 3)) {
-                       if (!strcasecmp (atom + 4, "a"))
-                               return MEDIA;
-                       if (!strcasecmp (atom + 4, "um"))
-                               return MEDIUM;
-                       break;
-               }
-               break;
-             case 'n':
-               if (!strcasecmp (atom + 1, "etmask"))
-                       return NETMASK;
-               if (!strcasecmp (atom + 1, "ext-server"))
-                       return NEXT_SERVER;
-               break;
-             case 'o':
-               if (!strcasecmp (atom + 1, "ption"))
-                       return OPTION;
-               if (!strcasecmp (atom + 1, "ne-lease-per-client"))
-                       return ONE_LEASE_PER_CLIENT;
-               break;
-             case 'p':
-               if (!strcasecmp (atom + 1, "acket"))
-                       return PACKET;
-               break;
-             case 'r':
-               if (!strcasecmp (atom + 1, "ange"))
-                       return RANGE;
-               if (!strcasecmp (atom + 1, "equest"))
-                       return REQUEST;
-               if (!strcasecmp (atom + 1, "equire"))
-                       return REQUIRE;
-               if (!strcasecmp (atom + 1, "etry"))
-                       return RETRY;
-               if (!strcasecmp (atom + 1, "enew"))
-                       return RENEW;
-               if (!strcasecmp (atom + 1, "ebind"))
-                       return REBIND;
-               break;
-             case 's':
-               if (!strcasecmp (atom + 1, "tarts"))
-                       return STARTS;
-               if (!strcasecmp (atom + 1, "iaddr"))
-                       return SIADDR;
-               if (!strcasecmp (atom + 1, "ubnet"))
-                       return SUBNET;
-               if (!strcasecmp (atom + 1, "hared-network"))
-                       return SHARED_NETWORK;
-               if (!strcasecmp (atom + 1, "erver-name"))
-                       return SERVER_NAME;
-               if (!strcasecmp (atom + 1, "erver-identifier"))
-                       return SERVER_IDENTIFIER;
-               if (!strcasecmp (atom + 1, "elect-timeout"))
-                       return SELECT_TIMEOUT;
-               if (!strcasecmp (atom + 1, "end"))
-                       return SEND;
-               if (!strcasecmp (atom + 1, "cript"))
-                       return SCRIPT;
-               break;
-             case 't':
-               if (!strcasecmp (atom + 1, "imestamp"))
-                       return TIMESTAMP;
-               if (!strcasecmp (atom + 1, "imeout"))
-                       return TIMEOUT;
-               if (!strcasecmp (atom + 1, "oken-ring"))
-                       return TOKEN_RING;
-               break;
-             case 'u':
-               if (!strcasecmp (atom + 1, "id"))
-                       return UID;
-               if (!strcasecmp (atom + 1, "ser-class"))
-                       return USER_CLASS;
-               if (!strcasecmp (atom + 1, "se-host-decl-names"))
-                       return USE_HOST_DECL_NAMES;
-               if (!strcasecmp (atom + 1, "nknown-clients"))
-                       return UNKNOWN_CLIENTS;
-               break;
-             case 'v':
-               if (!strcasecmp (atom + 1, "endor-class"))
-                       return VENDOR_CLASS;
-               break;
-             case 'y':
-               if (!strcasecmp (atom + 1, "iaddr"))
-                       return YIADDR;
-               break;
-       }
-       return dfv;
-}
diff --git a/db.c b/db.c
deleted file mode 100644 (file)
index afdaff2..0000000
--- a/db.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/* db.c
-
-   Persistent database management routines for DHCPD... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises.  To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''.  To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: db.c,v 1.8 1996/09/02 21:16:24 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-FILE *db_file;
-
-static int counting = 0;
-static int count = 0;
-TIME write_time;
-
-/* Write the specified lease to the current lease database file. */
-
-int write_lease (lease)
-       struct lease *lease;
-{
-       struct tm *t;
-       char tbuf [64];
-       int errors = 0;
-
-       if (counting)
-               ++count;
-       errno = 0;
-       fprintf (db_file, "lease %s {\n", piaddr (lease -> ip_addr));
-       if (errno) {
-               ++errors;
-       }
-
-       t = gmtime (&lease -> starts);
-       sprintf (tbuf, "%d %d/%d/%d %02d:%02d:%02d;",
-                t -> tm_wday, t -> tm_year + 1900,
-                t -> tm_mon + 1, t -> tm_mday,
-                t -> tm_hour, t -> tm_min, t -> tm_sec);
-       errno = 0;
-       fprintf (db_file, "\tstarts %s\n", tbuf);
-       if (errno) {
-               ++errors;
-       }
-
-       t = gmtime (&lease -> ends);
-       sprintf (tbuf, "%d %d/%d/%d %02d:%02d:%02d;",
-                t -> tm_wday, t -> tm_year + 1900,
-                t -> tm_mon + 1, t -> tm_mday,
-                t -> tm_hour, t -> tm_min, t -> tm_sec);
-       errno = 0;
-       fprintf (db_file, "\tends %s", tbuf);
-       if (errno) {
-               ++errors;
-       }
-
-       if (lease -> hardware_addr.hlen) {
-               errno = 0;
-               fprintf (db_file, "\n\thardware %s %s;",
-                        hardware_types [lease -> hardware_addr.htype],
-                        print_hw_addr (lease -> hardware_addr.htype,
-                                       lease -> hardware_addr.hlen,
-                                       lease -> hardware_addr.haddr));
-               if (errno) {
-                       ++errors;
-               }
-       }
-       if (lease -> uid_len) {
-               int i;
-               errno = 0;
-               fprintf (db_file, "\n\tuid %x", lease -> uid [0]);
-               if (errno) {
-                       ++errors;
-               }
-               for (i = 1; i < lease -> uid_len; i++) {
-                       errno = 0;
-                       fprintf (db_file, ":%x", lease -> uid [i]);
-                       if (errno) {
-                               ++errors;
-                       }
-               }
-               putc (';', db_file);
-       }
-       if (lease -> flags & BOOTP_LEASE) {
-               errno = 0;
-               fprintf (db_file, "\n\tdynamic-bootp;");
-               if (errno) {
-                       ++errors;
-               }
-       }
-       errno = 0;
-       fputs ("\n}\n", db_file);
-       if (errno) {
-               ++errors;
-       }
-       if (errors)
-               note ("write_lease: unable to write lease %s",
-                     piaddr (lease -> ip_addr));
-       return !errors;
-}
-
-/* Commit any leases that have been written out... */
-
-int commit_leases ()
-{
-       /* Commit any outstanding writes to the lease database file.
-          We need to do this even if we're rewriting the file below,
-          just in case the rewrite fails. */
-       if (fflush (db_file) == EOF) {
-               note ("commit_leases: unable to commit: %m");
-               return 0;
-       }
-       if (fsync (fileno (db_file)) < 0) {
-               note ("commit_leases: unable to commit: %m");
-               return 0;
-       }
-
-       /* If we've written more than a thousand leases or if
-          we haven't rewritten the lease database in over an
-          hour, rewrite it now. */
-       if (count > 1000 || (count && cur_time - write_time > 3600)) {
-               count = 0;
-               write_time = cur_time;
-               new_lease_file ();
-       }
-       return 1;
-}
-
-void db_startup ()
-{
-       /* Read in the existing lease file... */
-       read_leases ();
-
-       new_lease_file ();
-}
-
-void new_lease_file ()
-{
-       char newfname [512];
-       char backfname [512];
-       TIME t;
-
-       /* If we already have an open database, close it. */
-       if (db_file) {
-               fclose (db_file);
-       }
-
-       /* Make a temporary lease file... */
-       time (&t);
-       sprintf (newfname, "%s.%d", path_dhcpd_db, (int) (t & 32767));
-       if ((db_file = fopen (newfname, "w")) == NULL) {
-               error ("Can't start new lease file: %m");
-       }
-
-       /* Write out all the leases that we know of... */
-       counting = 0;
-       write_leases ();
-
-       /* Get the old database out of the way... */
-       sprintf (backfname, "%s~", path_dhcpd_db);
-       if (unlink (backfname) < 0 && errno != ENOENT)
-               error ("Can't remove old lease database backup %s: %m",
-                      backfname);
-       if (link (path_dhcpd_db, backfname) < 0)
-               error ("Can't backup lease database %s to %s: %m",
-                      path_dhcpd_db, backfname);
-       
-       /* Move in the new file... */
-       if (rename (newfname, path_dhcpd_db) < 0)
-               error ("Can't install new lease database %s to %s: %m",
-                      newfname, path_dhcpd_db);
-
-       counting = 1;
-}
diff --git a/dhcp.c b/dhcp.c
deleted file mode 100644 (file)
index ec0ff91..0000000
--- a/dhcp.c
+++ /dev/null
@@ -1,1158 +0,0 @@
-/* dhcp.c
-
-   DHCP Protocol engine. */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises.  To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''.  To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: dhcp.c,v 1.40 1997/02/22 12:25:11 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static unsigned char dhcp_message [256];
-
-void dhcp (packet)
-       struct packet *packet;
-{
-       if (!locate_network (packet) && packet -> packet_type != DHCPREQUEST)
-               return;
-
-       switch (packet -> packet_type) {
-             case DHCPDISCOVER:
-               dhcpdiscover (packet);
-               break;
-
-             case DHCPREQUEST:
-               dhcprequest (packet);
-               break;
-
-             case DHCPRELEASE:
-               dhcprelease (packet);
-               break;
-
-             case DHCPDECLINE:
-               dhcpdecline (packet);
-               break;
-
-             case DHCPINFORM:
-               dhcpinform (packet);
-               break;
-
-             default:
-               break;
-       }
-}
-
-void dhcpdiscover (packet)
-       struct packet *packet;
-{
-       struct lease *lease = find_lease (packet, packet -> shared_network);
-       struct host_decl *hp;
-
-       note ("DHCPDISCOVER from %s via %s",
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-       /* Sourceless packets don't make sense here. */
-       if (!packet -> shared_network) {
-               note ("Packet from unknown subnet: %s",
-                     inet_ntoa (packet -> raw -> giaddr));
-               return;
-       }
-
-       /* If we didn't find a lease, try to allocate one... */
-       if (!lease) {
-               lease = packet -> shared_network -> last_lease;
-
-               /* If there are no leases in that subnet that have
-                  expired, we have nothing to offer this client. */
-               if (!lease || lease -> ends > cur_time) {
-                       note ("no free leases on subnet %s",
-                             packet -> shared_network -> name);
-                       return;
-               }
-
-               /* Try to find a host_decl that matches the client
-                  identifier or hardware address on the packet, and
-                  has no fixed IP address.   If there is one, hang
-                  it off the lease so that its option definitions
-                  can be used. */
-               if (((packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len
-                     != 0) &&
-                    ((hp = find_hosts_by_uid
-                      (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data,
-                       packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len))
-                     != (struct host_decl *)0)) ||
-                   ((hp = find_hosts_by_haddr (packet -> raw -> htype,
-                                               packet -> raw -> chaddr,
-                                               packet -> raw -> hlen))
-                    != (struct host_decl *)0)) {
-                       for (; hp; hp = hp -> n_ipaddr) {
-                               if (!hp -> fixed_addr) {
-                                       lease -> host = hp;
-                                       break;
-                               }
-                       }
-               } else {
-                       lease -> host = (struct host_decl *)0;
-               }
-       }
-
-       /* If this subnet won't boot unknown clients, ignore the
-          request. */
-       if (!lease -> host &&
-           !lease -> subnet -> group -> boot_unknown_clients) {
-               note ("Ignoring unknown client %s",
-                     print_hw_addr (packet -> raw -> htype,
-                                    packet -> raw -> hlen,
-                                    packet -> raw -> chaddr));
-       } else if (lease -> host &&
-                   !lease -> host -> group -> allow_booting) {
-               note ("Declining to boot client %s",
-                     lease -> host -> name);
-       } else
-               ack_lease (packet, lease, DHCPOFFER, cur_time + 120);
-}
-
-void dhcprequest (packet)
-       struct packet *packet;
-{
-       struct lease *lease;
-       struct iaddr cip;
-       struct subnet *subnet;
-
-       if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
-               cip.len = 4;
-               memcpy (cip.iabuf,
-                       packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
-                       4);
-       } else {
-               cip.len = 4;
-               memcpy (cip.iabuf, &packet -> raw -> ciaddr.s_addr, 4);
-       }
-       subnet = find_subnet (cip);
-
-       /* Find the lease that matches the address requested by the
-          client. */
-       if (packet -> shared_network)
-               lease = find_lease (packet, packet -> shared_network);
-       else
-               lease = (struct lease *)0;
-
-       note ("DHCPREQUEST for %s from %s via %s",
-             piaddr (cip),
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-       /* If we found a lease for the client but it's not the one the
-          client asked for, don't send it - some other server probably
-          made the cut. */
-       if (lease && !addr_eq (lease -> ip_addr, cip)) {
-               return;
-       }
-
-       /* If a client on a given network wants to request a lease on
-          an address on a different network, NAK it.   If the Requested
-          Address option was used, the protocol says that it must have
-          been broadcast, so we can trust the source network information.
-
-          If ciaddr was specified and Requested Address was not, then
-          we really only know for sure what network a packet came from
-          if it came through a BOOTP gateway - if it came through an
-          IP router, we'll just have to assume that it's cool.
-
-          This violates the protocol spec in the case that the client
-          is in the REBINDING state and broadcasts a DHCPREQUEST on
-          the local wire.  We're supposed to check ciaddr for
-          validity in that case, but if the packet was unicast
-          through a router from a client in the RENEWING state, it
-          would look exactly the same to us and it would be very
-          bad to send a DHCPNAK.   I think we just have to live with
-          this. */
-       if ((packet -> raw -> ciaddr.s_addr &&
-            packet -> raw -> giaddr.s_addr) ||
-           packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
-               
-               /* If we don't know where it came from but we do know
-                  where it claims to have come from, it didn't come
-                  from there.   Fry it. */
-               if (!packet -> shared_network) {
-                       if (subnet) {
-                               nak_lease (packet, &cip);
-                               return;
-                       }
-                       /* Otherwise, ignore it. */
-                       return;
-               }
-
-               /* If we do know where it came from and we don't know
-                  where it claims to have come from, same deal - fry it. */
-               subnet = find_grouped_subnet (packet -> shared_network, cip);
-               if (!subnet) {
-                       nak_lease (packet, &cip);
-                       return;
-               }
-       }
-
-       /* If we own the lease that the client is asking for,
-          and it's already been assigned to the client, ack it. */
-       if (lease &&
-           ((lease -> uid_len && lease -> uid_len == 
-             packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len &&
-             !memcmp (packet -> options
-                      [DHO_DHCP_CLIENT_IDENTIFIER].data,
-                      lease -> uid, lease -> uid_len)) ||
-            (lease -> hardware_addr.hlen == packet -> raw -> hlen &&
-             lease -> hardware_addr.htype == packet -> raw -> htype &&
-             !memcmp (lease -> hardware_addr.haddr,
-                      packet -> raw -> chaddr,
-                      packet -> raw -> hlen)))) {
-               ack_lease (packet, lease, DHCPACK, 0);
-               return;
-       }
-}
-
-void dhcprelease (packet)
-       struct packet *packet;
-{
-       struct lease *lease = find_lease (packet, packet -> shared_network);
-
-       note ("DHCPRELEASE of %s from %s via %s",
-             inet_ntoa (packet -> raw -> ciaddr),
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-
-       /* If we found a lease, release it. */
-       if (lease) {
-               release_lease (lease);
-       }
-}
-
-void dhcpdecline (packet)
-       struct packet *packet;
-{
-       struct lease *lease = find_lease (packet, packet -> shared_network);
-       struct iaddr cip;
-
-       if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
-               cip.len = 4;
-               memcpy (cip.iabuf,
-                       packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
-                       4);
-       } else {
-               cip.len = 0;
-       }
-
-       note ("DHCPDECLINE on %s from %s via %s",
-             piaddr (cip),
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-
-       /* If we found a lease, mark it as unusable and complain. */
-       if (lease) {
-               abandon_lease (lease);
-       }
-}
-
-void dhcpinform (packet)
-       struct packet *packet;
-{
-       note ("DHCPINFORM from %s",
-             inet_ntoa (packet -> raw -> ciaddr));
-}
-
-void nak_lease (packet, cip)
-       struct packet *packet;
-       struct iaddr *cip;
-{
-       struct sockaddr_in to;
-       struct in_addr from;
-       int result;
-       struct dhcp_packet raw;
-       unsigned char nak = DHCPNAK;
-       struct packet outgoing;
-       struct hardware hto;
-
-       struct tree_cache *options [256];
-       struct tree_cache dhcpnak_tree;
-       struct tree_cache dhcpmsg_tree;
-
-       memset (options, 0, sizeof options);
-       memset (&outgoing, 0, sizeof outgoing);
-       memset (&raw, 0, sizeof raw);
-       outgoing.raw = &raw;
-
-       /* Set DHCP_MESSAGE_TYPE to DHCPNAK */
-       options [DHO_DHCP_MESSAGE_TYPE] = &dhcpnak_tree;
-       options [DHO_DHCP_MESSAGE_TYPE] -> value = &nak;
-       options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof nak;
-       options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof nak;
-       options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
-       options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
-       /* Set DHCP_MESSAGE to whatever the message is */
-       options [DHO_DHCP_MESSAGE] = &dhcpmsg_tree;
-       options [DHO_DHCP_MESSAGE] -> value = dhcp_message;
-       options [DHO_DHCP_MESSAGE] -> len = strlen (dhcp_message);
-       options [DHO_DHCP_MESSAGE] -> buf_size = strlen (dhcp_message);
-       options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF;
-       options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0;
-
-       /* Do not use the client's requested parameter list. */
-       packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].len = 0;
-       packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].data =
-               (unsigned char *)0;
-
-       /* Set up the option buffer... */
-       outgoing.packet_length =
-               cons_options (packet, outgoing.raw, options, 0, 0);
-
-/*     memset (&raw.ciaddr, 0, sizeof raw.ciaddr);*/
-       raw.siaddr = packet -> interface -> primary_address;
-       raw.giaddr = packet -> raw -> giaddr;
-       memcpy (raw.chaddr, packet -> raw -> chaddr, sizeof raw.chaddr);
-       raw.hlen = packet -> raw -> hlen;
-       raw.htype = packet -> raw -> htype;
-
-       raw.xid = packet -> raw -> xid;
-       raw.secs = packet -> raw -> secs;
-       raw.flags = packet -> raw -> flags | htons (BOOTP_BROADCAST);
-       raw.hops = packet -> raw -> hops;
-       raw.op = BOOTREPLY;
-
-       /* Report what we're sending... */
-       note ("DHCPNAK on %s to %s via %s",
-             piaddr (*cip),
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-
-
-#ifdef DEBUG_PACKET
-       dump_packet (packet);
-       dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
-       dump_packet (&outgoing);
-       dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
-       hto.htype = packet -> raw -> htype;
-       hto.hlen = packet -> raw -> hlen;
-       memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
-       /* Set up the common stuff... */
-       to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
-       to.sin_len = sizeof to;
-#endif
-       memset (to.sin_zero, 0, sizeof to.sin_zero);
-
-       from = packet -> interface -> primary_address;
-
-       /* If this was gatewayed, send it back to the gateway.
-          Otherwise, broadcast it on the local network. */
-       if (raw.giaddr.s_addr) {
-               to.sin_addr = raw.giaddr;
-               to.sin_port = local_port;
-
-               if (outgoing.packet_length < BOOTP_MIN_LEN)
-                       outgoing.packet_length = BOOTP_MIN_LEN;
-
-#ifdef USE_FALLBACK
-               result = send_fallback (&fallback_interface,
-                                       packet, &raw, outgoing.packet_length,
-                                       from, &to, &hto);
-               if (result < 0)
-                       warn ("send_fallback: %m");
-               return;
-#endif
-       } else {
-               to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
-               to.sin_port = packet->client_port;
-       }
-
-       errno = 0;
-       result = send_packet (packet -> interface,
-                             packet, &raw, outgoing.packet_length,
-                             from, &to, (struct hardware *)0);
-       if (result < 0)
-               warn ("send_packet: %m");
-}
-
-void ack_lease (packet, lease, offer, when)
-       struct packet *packet;
-       struct lease *lease;
-       unsigned char offer;
-       TIME when;
-{
-       struct lease lt;
-       TIME lease_time;
-       TIME offered_lease_time;
-
-       int bufs = 0;
-       struct packet outgoing;
-       struct dhcp_packet raw;
-       struct tree_cache *options [256];
-       struct sockaddr_in to;
-       struct in_addr from;
-       struct hardware hto;
-       int result;
-
-       unsigned char lease_time_buf [4];
-       unsigned char lease_t1_buf [4];
-       unsigned char lease_t2_buf [4];
-       struct tree_cache lease_time_tree;
-       struct tree_cache lease_t1_tree;
-       struct tree_cache lease_t2_tree;
-       struct tree_cache dhcpoffer_tree;
-       struct tree_cache server_id_tree;
-       struct tree_cache vendor_class_tree;
-       struct tree_cache user_class_tree;
-       struct tree_cache hostname_tree;
-       struct tree_cache netmask_tree;
-
-       struct class *vendor_class, *user_class;
-       char *filename;
-       char *server_name;
-       int i;
-
-       if (packet -> options [DHO_DHCP_CLASS_IDENTIFIER].len) {
-               vendor_class =
-                       find_class (0,
-                                   packet ->
-                                   options [DHO_DHCP_CLASS_IDENTIFIER].data,
-                                   packet ->
-                                   options [DHO_DHCP_CLASS_IDENTIFIER].len);
-       } else {
-               vendor_class = (struct class *)0;
-       }
-
-       if (packet -> options [DHO_DHCP_USER_CLASS_ID].len) {
-               user_class =
-                       find_class (1,
-                                   packet ->
-                                   options [DHO_DHCP_USER_CLASS_ID].data,
-                                   packet ->
-                                   options [DHO_DHCP_USER_CLASS_ID].len);
-       } else {
-               user_class = (struct class *)0;
-       }
-
-       /* Choose a filename; first from the host_decl, if any, then from
-          the user class, then from the vendor class. */
-       if (lease -> host && lease -> host -> group -> filename)
-               filename = lease -> host -> group -> filename;
-       else if (user_class && user_class -> group -> filename)
-               filename = user_class -> group -> filename;
-       else if (vendor_class  && vendor_class -> group -> filename)
-               filename = vendor_class -> group -> filename;
-       else filename = (char *)0;
-
-       /* Choose a server name as above. */
-       if (lease -> host && lease -> host -> group -> server_name)
-               server_name = lease -> host -> group -> server_name;
-       else if (user_class && user_class -> group -> server_name)
-               server_name = user_class -> group -> server_name;
-       else if (vendor_class  && vendor_class -> group -> server_name)
-               server_name = vendor_class -> group -> server_name;
-       else server_name = (char *)0;
-
-       /* At this point, we have a lease that we can offer the client.
-          Now we construct a lease structure that contains what we want,
-          and call supersede_lease to do the right thing with it. */
-
-       memset (&lt, 0, sizeof lt);
-
-       /* Use the ip address of the lease that we finally found in
-          the database. */
-       lt.ip_addr = lease -> ip_addr;
-
-       /* Start now. */
-       lt.starts = cur_time;
-
-       /* Figure out how long a lease to assign.    If this is a
-          dynamic BOOTP lease, its duration must be infinite. */
-       if (offer) {
-               if (packet -> options [DHO_DHCP_LEASE_TIME].len == 4) {
-                       lease_time = getULong
-                               (packet -> options [DHO_DHCP_LEASE_TIME].data);
-                       
-                       /* Don't let the client ask for a longer lease than
-                          is supported for this subnet or host. */
-                       if (lease -> host &&
-                           lease -> host -> group -> max_lease_time) {
-                               if (lease_time >
-                                   lease -> host -> group -> max_lease_time)
-                                       lease_time = (lease -> host ->
-                                                     group -> max_lease_time);
-                       } else {
-                               if (lease_time >
-                                   lease -> subnet -> group -> max_lease_time)
-                                       lease_time = (lease -> subnet ->
-                                                     group -> max_lease_time);
-                       }
-               } else {
-                       if (lease -> host
-                           && lease -> host -> group -> default_lease_time)
-                               lease_time = (lease -> host ->
-                                             group -> default_lease_time);
-                       else
-                               lease_time = (lease -> subnet ->
-                                             group -> default_lease_time);
-               }
-               
-               lt.offered_expiry = cur_time + lease_time;
-               if (when)
-                       lt.ends = when;
-               else
-                       lt.ends = lt.offered_expiry;
-       } else {
-               if (lease -> host &&
-                   lease -> host -> group -> bootp_lease_length)
-                       lt.ends = (cur_time +
-                                  lease -> host ->
-                                  group -> bootp_lease_length);
-               else if (lease -> subnet -> group -> bootp_lease_length)
-                       lt.ends = (cur_time +
-                                  lease -> subnet ->
-                                  group -> bootp_lease_length);
-               else if (lease -> host &&
-                        lease -> host -> group -> bootp_lease_cutoff)
-                       lt.ends = lease -> host -> group -> bootp_lease_cutoff;
-               else
-                       lt.ends = (lease -> subnet ->
-                                  group -> bootp_lease_cutoff);
-               lt.offered_expiry = lt.ends;
-               lt.flags = BOOTP_LEASE;
-       }
-
-       lt.timestamp = cur_time;
-
-       /* Record the uid, if given... */
-       if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
-               lt.uid_len =
-                       packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len;
-               lt.uid = packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data;
-               packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data =
-                       (unsigned char *)0;
-               packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len = 0;
-       }
-
-       /* Record the hardware address, if given... */
-       lt.hardware_addr.hlen = packet -> raw -> hlen;
-       lt.hardware_addr.htype = packet -> raw -> htype;
-       memcpy (lt.hardware_addr.haddr, packet -> raw -> chaddr,
-               packet -> raw -> hlen);
-
-       lt.host = lease -> host;
-       lt.subnet = lease -> subnet;
-       lt.shared_network = lease -> shared_network;
-
-       /* Record the transaction id... */
-       lt.xid = packet -> raw -> xid;
-
-       /* Don't call supersede_lease on a mocked-up lease. */
-       if (lease -> flags & STATIC_LEASE)
-               ;
-       else
-       /* Install the new information about this lease in the database.
-          If this is a DHCPACK or a dynamic BOOTREPLY and we can't write
-          the lease, don't ACK it (or BOOTREPLY it) either. */
-               if (!(supersede_lease (lease, &lt, !offer || offer == DHCPACK)
-                     || (offer && offer != DHCPACK)))
-                       return;
-
-       /* Send a response to the client... */
-
-       memset (&outgoing, 0, sizeof outgoing);
-       memset (&raw, 0, sizeof raw);
-       outgoing.raw = &raw;
-
-       /* Copy in the filename if given; otherwise, flag the filename
-          buffer as available for options. */
-       if (filename)
-               strncpy (raw.file, filename, sizeof raw.file);
-       else
-               bufs |= 1;
-
-       /* Copy in the server name if given; otherwise, flag the
-          server_name buffer as available for options. */
-       if (server_name)
-               strncpy (raw.sname, server_name, sizeof raw.sname);
-       else
-               bufs |= 2; /* XXX */
-
-       memcpy (raw.chaddr, packet -> raw -> chaddr, packet -> raw -> hlen);
-       raw.hlen = packet -> raw -> hlen;
-       raw.htype = packet -> raw -> htype;
-
-       /* Start out with the subnet options... */
-       memcpy (options, lease -> subnet -> group -> options, sizeof options);
-
-       /* Vendor and user classes are only supported for DHCP clients. */
-       if (offer) {
-               /* If we have a vendor class, install those options,
-                  superseding any subnet options. */
-               if (vendor_class) {
-                       for (i = 0; i < 256; i++)
-                               if (vendor_class -> group -> options [i])
-                                       options [i] = (vendor_class -> group ->
-                                                      options [i]);
-               }
-
-               /* If we have a user class, install those options,
-                  superseding any subnet and vendor class options. */
-               if (user_class) {
-                       for (i = 0; i < 256; i++)
-                               if (user_class -> group -> options [i])
-                                       options [i] = (user_class -> group ->
-                                                      options [i]);
-               }
-
-       }
-
-       /* If we have a host_decl structure, install the associated
-          options, superseding anything that's in the way. */
-       if (lease -> host) {
-               for (i = 0; i < 256; i++)
-                       if (lease -> host -> group -> options [i])
-                               options [i] = (lease -> host ->
-                                              group -> options [i]);
-       }
-
-       /* If we didn't get a hostname from an option somewhere, see if
-          we can get one from the lease. */
-       if (!options [DHO_HOST_NAME] && lease -> hostname) {
-               options [DHO_HOST_NAME] = &hostname_tree;
-               options [DHO_HOST_NAME] -> value =
-                       (unsigned char *)lease -> hostname;
-               options [DHO_HOST_NAME] -> buf_size = 
-                       options [DHO_HOST_NAME] -> len =
-                               strlen (lease -> hostname);
-               options [DHO_HOST_NAME] -> timeout = 0xFFFFFFFF;
-               options [DHO_HOST_NAME] -> tree = (struct tree *)0;
-       }
-
-       /* Now, if appropriate, put in DHCP-specific options that
-           override those. */
-       if (offer) {
-               options [DHO_DHCP_MESSAGE_TYPE] = &dhcpoffer_tree;
-               options [DHO_DHCP_MESSAGE_TYPE] -> value = &offer;
-               options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof offer;
-               options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof offer;
-               options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
-               options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
-               options [DHO_DHCP_SERVER_IDENTIFIER] = &server_id_tree;
-               options [DHO_DHCP_SERVER_IDENTIFIER] -> value =
-                       (unsigned char *)
-                               &packet -> interface -> primary_address;
-               options [DHO_DHCP_SERVER_IDENTIFIER] -> len =
-                       sizeof packet -> interface -> primary_address;
-               options [DHO_DHCP_SERVER_IDENTIFIER] -> buf_size =
-                       sizeof packet -> interface -> primary_address;
-               options [DHO_DHCP_SERVER_IDENTIFIER] -> timeout =
-                       0xFFFFFFFF;
-               options [DHO_DHCP_SERVER_IDENTIFIER] -> tree =
-                       (struct tree *)0;
-
-               /* Sanity check the lease time. */
-               if ((lease->offered_expiry - cur_time) < 15)
-                       offered_lease_time = (lease -> subnet ->
-                                             group -> default_lease_time);
-               else if (lease -> offered_expiry - cur_time >
-                        lease -> subnet -> group -> max_lease_time) 
-                       offered_lease_time = (lease -> subnet ->
-                                             group -> max_lease_time);
-               else 
-                       offered_lease_time =
-                               lease -> offered_expiry - cur_time;
-
-               putULong (lease_time_buf, offered_lease_time);
-               options [DHO_DHCP_LEASE_TIME] = &lease_time_tree;
-               options [DHO_DHCP_LEASE_TIME] -> value = lease_time_buf;
-               options [DHO_DHCP_LEASE_TIME] -> len = sizeof lease_time_buf;
-               options [DHO_DHCP_LEASE_TIME] ->
-                       buf_size = sizeof lease_time_buf;
-               options [DHO_DHCP_LEASE_TIME] -> timeout = 0xFFFFFFFF;
-               options [DHO_DHCP_LEASE_TIME] -> tree = (struct tree *)0;
-
-               /* Renewal time is lease time * 0.5. */
-               offered_lease_time /= 2;
-               putULong (lease_t1_buf, offered_lease_time);
-               options [DHO_DHCP_RENEWAL_TIME] = &lease_t1_tree;
-               options [DHO_DHCP_RENEWAL_TIME] -> value = lease_t1_buf;
-               options [DHO_DHCP_RENEWAL_TIME] -> len = sizeof lease_t1_buf;
-               options [DHO_DHCP_RENEWAL_TIME] ->
-                       buf_size = sizeof lease_t1_buf;
-               options [DHO_DHCP_RENEWAL_TIME] -> timeout = 0xFFFFFFFF;
-               options [DHO_DHCP_RENEWAL_TIME] -> tree = (struct tree *)0;
-
-               /* Rebinding time is lease time * 0.875. */
-               offered_lease_time += (offered_lease_time / 2
-                                      + offered_lease_time / 4);
-               putULong (lease_t2_buf, offered_lease_time);
-               options [DHO_DHCP_REBINDING_TIME] = &lease_t2_tree;
-               options [DHO_DHCP_REBINDING_TIME] -> value = lease_t2_buf;
-               options [DHO_DHCP_REBINDING_TIME] -> len = sizeof lease_t2_buf;
-               options [DHO_DHCP_REBINDING_TIME] ->
-                       buf_size = sizeof lease_t2_buf;
-               options [DHO_DHCP_REBINDING_TIME] -> timeout = 0xFFFFFFFF;
-               options [DHO_DHCP_REBINDING_TIME] -> tree = (struct tree *)0;
-
-               /* If we used the vendor class the client specified, we
-                  have to return it. */
-               if (vendor_class) {
-                       options [DHO_DHCP_CLASS_IDENTIFIER] =
-                               &vendor_class_tree;
-                       options [DHO_DHCP_CLASS_IDENTIFIER] ->
-                               value = (unsigned char *)vendor_class -> name;
-                       options [DHO_DHCP_CLASS_IDENTIFIER] ->
-                               len = strlen (vendor_class -> name);
-                       options [DHO_DHCP_CLASS_IDENTIFIER] ->
-                               buf_size = strlen (vendor_class -> name);
-                       options [DHO_DHCP_CLASS_IDENTIFIER] ->
-                               timeout = 0xFFFFFFFF;
-                       options [DHO_DHCP_CLASS_IDENTIFIER] ->
-                               tree = (struct tree *)0;
-               }
-
-               /* If we used the user class the client specified, we
-                  have to return it. */
-               if (user_class) {
-                       options [DHO_DHCP_USER_CLASS_ID] = &user_class_tree;
-                       options [DHO_DHCP_USER_CLASS_ID] ->
-                               value = (unsigned char *)user_class -> name;
-                       options [DHO_DHCP_USER_CLASS_ID] ->
-                               len = strlen (user_class -> name);
-                       options [DHO_DHCP_USER_CLASS_ID] ->
-                               buf_size = strlen (user_class -> name);
-                       options [DHO_DHCP_USER_CLASS_ID] ->
-                               timeout = 0xFFFFFFFF;
-                       options [DHO_DHCP_USER_CLASS_ID] ->
-                               tree = (struct tree *)0;
-               }
-       }
-
-       /* Use the subnet mask from the subnet declaration if no other
-          mask has been provided. */
-       if (!options [DHO_SUBNET_MASK]) {
-               options [DHO_SUBNET_MASK] = &netmask_tree;
-               netmask_tree.value = lease -> subnet -> netmask.iabuf;
-               netmask_tree.len = lease -> subnet -> netmask.len;
-               netmask_tree.buf_size = lease -> subnet -> netmask.len;
-               netmask_tree.timeout = 0xFFFFFFFF;
-               netmask_tree.tree = (struct tree *)0;
-       }
-
-       /* See if this is a Microsoft client that NUL-terminates its
-          strings and expects us to do likewise... */
-       if (packet -> options [DHO_HOST_NAME].data &&
-           packet -> options [DHO_HOST_NAME].data
-           [packet -> options [DHO_HOST_NAME].len - 1] == '\0')
-               outgoing.packet_length =
-                       cons_options (packet, outgoing.raw, options, bufs, 1);
-       else
-               outgoing.packet_length =
-                       cons_options (packet, outgoing.raw, options, bufs, 0);
-       if (!offer && outgoing.packet_length < BOOTP_MIN_LEN)
-               outgoing.packet_length = BOOTP_MIN_LEN;
-
-       raw.ciaddr = packet -> raw -> ciaddr;
-       memcpy (&raw.yiaddr, lease -> ip_addr.iabuf, 4);
-
-       /* Figure out the address of the next server. */
-       if (lease -> host && lease -> host -> group -> next_server.len)
-               memcpy (&raw.siaddr,
-                       lease -> host -> group -> next_server.iabuf, 4);
-       else if (lease -> subnet -> group -> next_server.len)
-               memcpy (&raw.siaddr,
-                       lease -> subnet -> group -> next_server.iabuf, 4);
-       else if (lease -> subnet -> interface_address.len)
-               memcpy (&raw.siaddr,
-                       lease -> subnet -> interface_address.iabuf, 4);
-       else
-               raw.siaddr = packet -> interface -> primary_address;
-
-       raw.giaddr = packet -> raw -> giaddr;
-
-       raw.xid = packet -> raw -> xid;
-       raw.secs = packet -> raw -> secs;
-       raw.flags = packet -> raw -> flags;
-       raw.hops = packet -> raw -> hops;
-       raw.op = BOOTREPLY;
-
-       /* Say what we're doing... */
-       note ("%s on %s to %s via %s",
-             (offer
-              ? (offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
-              : "BOOTREPLY"),
-             piaddr (lease -> ip_addr),
-             print_hw_addr (packet -> raw -> htype,
-                            packet -> raw -> hlen,
-                            packet -> raw -> chaddr),
-             packet -> raw -> giaddr.s_addr
-             ? inet_ntoa (packet -> raw -> giaddr)
-             : packet -> interface -> name);
-
-       /* Set up the hardware address... */
-       hto.htype = packet -> raw -> htype;
-       hto.hlen = packet -> raw -> hlen;
-       memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
-       to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
-       to.sin_len = sizeof to;
-#endif
-       memset (to.sin_zero, 0, sizeof to.sin_zero);
-
-       from = packet -> interface -> primary_address;
-
-#ifdef DEBUG_PACKET
-       dump_packet (packet);
-       dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
-       dump_packet (&outgoing);
-       dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
-       /* If this was gatewayed, send it back to the gateway... */
-       if (raw.giaddr.s_addr) {
-               to.sin_addr = raw.giaddr;
-               to.sin_port = local_port;
-
-               if (outgoing.packet_length < BOOTP_MIN_LEN)
-                       outgoing.packet_length = BOOTP_MIN_LEN;
-
-#ifdef USE_FALLBACK
-               result = send_fallback (&fallback_interface,
-                                       packet, &raw, outgoing.packet_length,
-                                       raw.siaddr, &to, &hto);
-               if (result < 0)
-                       warn ("send_fallback: %m");
-               return;
-#endif
-
-       /* If it comes from a client who already knows its address and
-          is not requesting a broadcast response, sent it directly to
-          that client. */
-       } else if (raw.ciaddr.s_addr && offer == DHCPACK &&
-                  !(raw.flags & htons (BOOTP_BROADCAST))) {
-               to.sin_addr = packet -> raw -> ciaddr;
-               to.sin_port = remote_port; /* XXX */
-
-#ifdef USE_FALLBACK
-               result = send_fallback (&fallback_interface,
-                                       packet, &raw, outgoing.packet_length,
-                                       raw.siaddr, &to, &hto);
-               if (result < 0)
-                       warn ("send_fallback: %m");
-               return;
-#endif
-
-       /* Otherwise, broadcast it on the local network. */
-       } else {
-               to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
-               to.sin_port = remote_port; /* XXX */
-       }
-
-
-       result = send_packet (packet -> interface,
-                             packet, &raw, outgoing.packet_length,
-                             raw.siaddr, &to, &hto);
-       if (result < 0)
-               warn ("sendpkt: %m");
-}
-
-struct lease *find_lease (packet, share)
-       struct packet *packet;
-       struct shared_network *share;
-{
-       struct lease *uid_lease, *ip_lease, *hw_lease;
-       struct lease *lease = (struct lease *)0;
-       struct iaddr cip;
-       struct host_decl *hp, *host = (struct host_decl *)0;
-       struct lease *fixed_lease;
-
-       /* Try to find a host or lease that's been assigned to the
-          specified unique client identifier. */
-       if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
-               /* First, try to find a fixed host entry for the specified
-                  client identifier... */
-               hp = find_hosts_by_uid (packet -> options
-                                       [DHO_DHCP_CLIENT_IDENTIFIER].data,
-                                       packet -> options
-                                       [DHO_DHCP_CLIENT_IDENTIFIER].len);
-               if (hp) {
-                       host = hp;
-                       fixed_lease = mockup_lease (packet, share, hp);
-                       uid_lease = (struct lease *)0;
-               } else {
-                       uid_lease = find_lease_by_uid
-                               (packet -> options
-                                [DHO_DHCP_CLIENT_IDENTIFIER].data,
-                                packet -> options
-                                [DHO_DHCP_CLIENT_IDENTIFIER].len);
-                       /* Find the lease matching this uid that's on the
-                          network the packet came from (if any). */
-                       for (; uid_lease; uid_lease = uid_lease -> n_uid)
-                               if (uid_lease -> shared_network == share)
-                                       break;
-                       fixed_lease = (struct lease *)0;
-               }
-       } else {
-               uid_lease = (struct lease *)0;
-               fixed_lease = (struct lease *)0;
-       }
-
-       /* If we didn't find a fixed lease using the uid, try doing
-          it with the hardware address... */
-       if (!fixed_lease) {
-               hp = find_hosts_by_haddr (packet -> raw -> htype,
-                                         packet -> raw -> chaddr,
-                                         packet -> raw -> hlen);
-               if (hp) {
-                       host = hp; /* Save it for later. */
-                       fixed_lease = mockup_lease (packet, share, hp);
-               }
-       }
-
-       /* Try to find a lease that's been attached to the client's
-          hardware address... */
-       hw_lease = find_lease_by_hw_addr (packet -> raw -> chaddr,
-                                         packet -> raw -> hlen);
-       /* Find the lease that's on the network the packet came from
-          (if any). */
-       for (; hw_lease; hw_lease = hw_lease -> n_hw)
-               if (hw_lease -> shared_network == share)
-                       break;
-
-       /* Try to find a lease that's been allocated to the client's
-          IP address. */
-       if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len &&
-           packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len == 4) {
-               cip.len = 4;
-               memcpy (cip.iabuf,
-                       packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
-                       cip.len);
-               ip_lease = find_lease_by_ip_addr (cip);
-       } else if (packet -> raw -> ciaddr.s_addr) {
-               cip.len = 4;
-               memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);
-               ip_lease = find_lease_by_ip_addr (cip);
-       } else
-               ip_lease = (struct lease *)0;
-
-       /* If the requested IP address isn't on the network the packet
-          came from, don't use it (this is probably taken care of at
-          a higher level, but it's cheap to make sure here too). */
-       if (ip_lease && ip_lease -> shared_network != share)
-               ip_lease = (struct lease *)0;
-
-       /* Toss ip_lease if it hasn't yet expired and the uid doesn't
-          match */
-       if (ip_lease &&
-           ip_lease -> ends >= cur_time &&
-           ip_lease -> uid && ip_lease != uid_lease)
-               ip_lease = (struct lease *)0;
-
-       /* Toss hw_lease if it hasn't yet expired and the uid doesn't
-          match, except that if the hardware address matches and the
-          client is now doing dynamic BOOTP (and thus hasn't provided
-          a uid) we let the client get away with it. */
-       if (hw_lease &&
-           hw_lease -> ends >= cur_time &&
-           hw_lease -> uid && hw_lease != uid_lease &&
-           (packet -> packet_type != 0 ||
-            !(hw_lease -> flags & DYNAMIC_BOOTP_OK)))
-               hw_lease = (struct lease *)0;
-
-       /* Toss extra pointers to the same lease... */
-       if (ip_lease == hw_lease)
-               ip_lease = (struct lease *)0;
-       if (hw_lease == uid_lease)
-               hw_lease = (struct lease *)0;
-       if (ip_lease == uid_lease)
-               ip_lease = (struct lease *)0;
-
-       /* If we got an ip address lease, make sure it isn't assigned to
-          some *other* client!   If it was assigned to this client, we'd
-          have zeroed it out above, so the only way we can take it at this
-          point is if some other client had it but it's timed out, or if no
-          other client has ever had it. */
-       if (ip_lease &&
-           ip_lease -> ends >= cur_time)
-               ip_lease = (struct lease *)0;
-
-       /* If we've already eliminated the lease, it wasn't there to
-          begin with.   If we have come up with a matching lease,
-          set the message to bad network in case we have to throw it out. */
-       if (!ip_lease && !hw_lease && !uid_lease) {
-               strcpy (dhcp_message, "requested address not available");
-       } else {
-               strcpy (dhcp_message, "requested address on bad subnet");
-       }
-
-       /* Now eliminate leases that are on the wrong network... */
-       if (ip_lease &&
-           (share != ip_lease -> shared_network)) {
-               release_lease (ip_lease);
-               ip_lease = (struct lease *)0;
-       }
-       if (uid_lease &&
-           (share != uid_lease -> shared_network)) {
-               release_lease (uid_lease);
-               uid_lease = (struct lease *)0;
-       }
-       if (hw_lease &&
-           (share != hw_lease -> shared_network)) {
-               release_lease (hw_lease);
-               hw_lease = (struct lease *)0;
-       }
-
-       /* At this point, if fixed_lease is nonzero, we can assign it to
-          this client. */
-       if (fixed_lease) {
-               lease = fixed_lease;
-       }
-
-       /* If we got a lease that matched the ip address and don't have
-          a better offer, use that; otherwise, release it. */
-       if (ip_lease) {
-               if (lease) {
-                       release_lease (ip_lease);
-               } else {
-                       lease = ip_lease;
-                       lease -> host = (struct host_decl *)0;
-               }
-       }
-
-       /* If we got a lease that matched the client identifier, we may want
-          to use it, but if we already have a lease we like, we must free
-          the lease that matched the client identifier. */
-       if (uid_lease) {
-               if (lease) {
-                       release_lease (uid_lease);
-               } else {
-                       lease = uid_lease;
-                       lease -> host = (struct host_decl *)0;
-               }
-       }
-
-       /* The lease that matched the hardware address is treated likewise. */
-       if (hw_lease) {
-               if (lease) {
-                       release_lease (hw_lease);
-               } else {
-                       lease = hw_lease;
-                       lease -> host = (struct host_decl *)0;
-               }
-       }
-
-       /* If we found a host_decl but no matching address, try to
-          find a host_decl that has no address, and if there is one,
-          hang it off the lease so that we can use the supplied
-          options. */
-       if (lease && host && !lease -> host) {
-               for (; host; host = host -> n_ipaddr) {
-                       if (!host -> fixed_addr) {
-                               lease -> host = host;
-                               break;
-                       }
-               }
-       }
-
-       return lease;
-}
-
-/* Search the provided host_decl structure list for an address that's on
-   the specified shared network.  If one is found, mock up and return a
-   lease structure for it; otherwise return the null pointer. */
-
-struct lease *mockup_lease (packet, share, hp)
-       struct packet *packet;
-       struct shared_network *share;
-       struct host_decl *hp;
-{
-       static struct lease mock;
-       
-       mock.subnet = find_host_for_network (&hp, &mock.ip_addr, share);
-       if (!mock.subnet)
-               return (struct lease *)0;
-       mock.next = mock.prev = (struct lease *)0;
-       mock.shared_network = mock.subnet -> shared_network;
-       mock.host = hp;
-
-       if (hp -> group -> options [DHO_DHCP_CLIENT_IDENTIFIER]) {
-               mock.uid = hp -> group ->
-                       options [DHO_DHCP_CLIENT_IDENTIFIER] -> value;
-               mock.uid_len = hp -> group ->
-                       options [DHO_DHCP_CLIENT_IDENTIFIER] -> len;
-       } else {
-               mock.uid = (unsigned char *)0;
-               mock.uid_len = 0;
-       }
-
-       mock.hardware_addr = hp -> interface;
-       mock.starts = mock.timestamp = mock.ends = MIN_TIME;
-       mock.flags = STATIC_LEASE;
-       return &mock;
-}
diff --git a/dhcpd.8 b/dhcpd.8
deleted file mode 100644 (file)
index 4bc6ff6..0000000
--- a/dhcpd.8
+++ /dev/null
@@ -1,308 +0,0 @@
-.\"    dhcpd.8
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\"    of its contributors may be used to endorse or promote products derived
-.\"    from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises.  To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''.  To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.TH dhcpd 8
-.SH NAME
-dhcpd - Dynamic Host Configuration Protocol Server
-.SH SYNOPSIS
-.B dhcpd
-[
-.B -p
-.I port
-]
-[
-.B -f
-]
-[
-.B -d
-]
-[
-.B -cf
-.I config-file
-]
-[
-.B -lf
-.I lease-file
-]
-[
-.I if0
-[
-.I ...ifN
-]
-]
-.SH DESCRIPTION
-The Internet Software Consortium DHCP Server, dhcpd, implements the
-Dynamic Host Configuration Protocol (DHCP) and the Internet Bootstrap
-Protocol (BOOTP).  DHCP allows hosts on a TCP/IP network to request
-and be assigned IP addresses, and also to discover information about
-the network to which they are attached.  BOOTP provides similar
-functionality, with certain restrictions.
-.SH OPERATION
-.PP
-The DHCP protocol allows a host which is unknown to the network
-administrator to be automatically assigned a new IP address out of a
-pool of IP addresses for its network.   In order for this to work, the
-network administrator allocates address pools in each subnet and
-enters them into the dhcpd.conf(5) file.
-.PP
-On startup, dhcpd reads the
-.IR dhcpd.conf
-file and stores a list of available addresses on each subnet in
-memory.  When a client requests an address using the DHCP protocol,
-dhcpd allocates an address for it.  Each client is assigned a lease,
-which expires after an amount of time chosen by the administrator (by
-default, one day).  Before leases expire, the clients to which leases
-are assigned are expected to renew them in order to continue to use
-the addresses.  Once a lease has expired, the client to which that
-lease was assigned is no longer permitted to use the leased IP
-address.
-.PP
-In order to keep track of leases across system reboots and server
-restarts, dhcpd keeps a list of leases it has assigned in the
-dhcpd.leases(5) file.   Before dhcpd grants a lease to a host, it
-records the lease in this file and makes sure that the contents of the
-file are flushed to disk.   This ensures that even in the event of a
-system crash, dhcpd will not forget about a lease that it has
-assigned.   On startup, after reading the dhcpd.conf file, dhcpd
-reads the dhcpd.leases file to refresh its memory about what leases
-have been assigned.
-.PP
-New leases are appended to the end of the dhcpd.leases
-file.   In order to prevent the file from becoming arbitrarily large,
-from time to time dhcpd creates a new dhcpd.leases file from its
-in-core lease database.  Once this file has been written to disk, the
-old file is renamed
-.IR dhcpd.leases~ ,
-and the new file is renamed dhcpd.leases.   If the system crashes in
-the middle of this process, whichever dhcpd.leases file remains will
-contain all the lease information, so there is no need for a special
-crash recovery process.
-.PP
-BOOTP support is also provided by this server.  Unlike DHCP, the BOOTP
-protocol does not provide a protocol for recovering
-dynamically-assigned addresses once they are no longer needed.   It is
-still possible to dynamically assign addresses to BOOTP clients, but
-some administrative process for reclaiming addresses is required.   By
-default, leases are granted to BOOTP clients in perpetuity, although
-the network administrator may set an earlier cutoff date or a shorter
-lease length for BOOTP leases if that makes sense.
-.PP
-BOOTP clients may also be served in the old standard way, which is to
-simply provide a declaration in the dhcpd.conf file for each
-BOOTP client, permanently assigning an address to each client.
-.PP
-Whenever changes are made to the dhcpd.conf file, dhcpd must be
-restarted.   To restart dhcpd, send a SIGTERM (signal 15) to the
-process ID contained in
-.IR RUNDIR/dhcpd.pid ,
-and then re-invoke dhcpd.  Because the DHCP server database is not as
-lightweight as a BOOTP database, dhcpd does not automatically restart
-itself when it sees a change to the dhcpd.conf file.
-.SH COMMAND LINE
-.PP
-The names of the network interfaces on which dhcpd should listen for
-broadcasts may be specified on the command line.  This should be done
-on systems where dhcpd is unable to identify non-broadcast interfaces,
-but should not be required on other systems.  If no interface names
-are specified on the command line dhcpd will identify all network
-interfaces which are up, elimininating non-broadcast interfaces if
-possible, and listen for DHCP broadcasts on each interface.
-.PP
-If dhcpd should listen on a port other than the standard (port 67),
-the
-.B -p
-flag may used.  It should be followed by the udp port number on which
-dhcpd should listen.  This is mostly useful for debugging purposes.
-.PP
-To run dhcpd as a foreground process, rather than allowing it to run
-as a daemon in the background, the
-.B -f
-flag should be specified.  This is useful when running dhcpd under a
-debugger, or when running it out of inittab on System V systems.
-.PP
-To have dhcpd log to the standard error descriptor, specify the
-.B -d
-flag.  This can be useful for debugging, and also at sites where a
-complete log of all dhcp activity must be kept but syslogd is not
-reliable or otherwise cannot be used.   Normally, dhcpd will log all
-output using the syslog(3) function with the log facility set to
-LOG_DAEMON.
-.PP
-Dhcpd can be made to use an alternate configuration file with the
-.B -cf
-flag, or an alternate lease file with the
-.B -lf
-flag.   Because of the importance of using the same lease database at
-all times when running dhcpd in production, these options should be
-used \fBonly\fR for testing lease files or database files in a
-non-production environment.
-.SH CONFIGURATION
-The syntax of the dhcpd.conf(8) file is discussed seperately.   This
-section should be used as an overview of the configuration process,
-and the dhcpd.conf(8) documentation should be consulted for detailed
-reference information.
-.PP
-.SH Subnets
-dhcpd needs to know the subnet numbers and netmasks of all subnets for
-which it will be providing service.   In addition, in order to
-dynamically allocate addresses, it must be assigned one or more ranges
-of addresses on each subnet which it can in turn assign to client
-hosts as they boot.   Thus, a very simple configuration providing DHCP
-support might look like this:
-.nf
-.sp 1
-       subnet 239.252.197.0 netmask 255.255.255.0 {
-         range 239.252.197.10 239.252.197.250;
-        }
-.fi
-.PP
-Multiple address ranges may be specified like this:
-.nf
-.sp 1
-       subnet 239.252.197.0 netmask 255.255.255.0 {
-         range 239.252.197.10 239.252.197.107;
-         range 239.252.197.113 239.252.197.250;
-       }
-.fi
-.PP
-If a subnet will only be provided with BOOTP service and no dynamic
-address assignment, the range clause can be left out entirely, but the
-subnet statement must appear.
-.PP
-.SH Lease Lengths
-DHCP leases can be assigned almost any length from zero seconds to
-infinity.   What lease length makes sense for any given subnet, or for
-any given installation, will vary depending on the kinds of hosts
-being served.
-.PP
-For example, in an office environment where systems are added from
-time to time and removed from time to time, but move relatively
-infrequently, it might make sense to allow lease times of a month of
-more.   In a final test environment on a manufacturing floor, it may
-make more sense to assign a maximum lease length of 30 minutes -
-enough time to go through a simple test procedure on a network
-appliance before packaging it up for delivery.
-.PP
-It is possible to specify two lease lengths: the default length that
-will be assigned if a client doesn't ask for any particular lease
-length, and a maximum lease length.   These are specified as clauses
-to the subnet command:
-.nf
-.sp 1
-       subnet 239.252.197.0 netmask 255.255.255.0 {
-         range 239.252.197.10 239.252.197.107;
-         default-lease-time 600;
-         max-lease-time 7200;
-       |
-.fi
-.PP
-This particular subnet declaration specifies a default lease time of
-600 seconds (ten minutes), and a maximum lease time of 7200 seconds
-(two hours).   Other common values would be 86400 (one day), 604800
-(one week) and 2592000 (30 days).
-.PP
-Each subnet need not have the same lease\(emin the case of an office
-environment and a manufacturing environment served by the same DHCP
-server, it might make sense to have widely disparate values for
-default and maximum lease times on each subnet.
-.SH BOOTP Support
-Each BOOTP client must be explicitly declared in the dhcpd.conf
-file.   A very basic client declaration will specify the client
-network interface's hardware address and the IP address to assign to
-that client.   If the client needs to be able to load a boot file from
-the server, that file's name must be specified.   A simple bootp
-client declaration might look like this:
-.nf
-.sp 1
-       host haagen {
-         hardware ethernet 08:00:2b:4c:59:23;
-         fixed-address 239.252.197.9;
-         filename "/tftpboot/haagen.boot";
-       }
-.fi
-.SH Options
-DHCP (and also BOOTP with Vendor Extensions) provide a mechanism
-whereby the server can provide the client with information about how
-to configure its network interface (e.g., subnet mask), and also how
-the client can access various network services (e.g., DNS, IP routers,
-and so on).
-.PP
-These options can be specified on a per-subnet basis, and, for BOOTP
-clients, also on a per-client basis.   In the event that a BOOTP
-client declaration specifies options that are also specified in its
-subnet declaration, the options specified in the client declaration
-take precedence.   An reasonably complete DHCP configuration might
-look something like this:
-.nf
-.sp 1
-       subnet 239.252.197.0 netmask 255.255.255.0 {
-         range 239.252.197.10 239.252.197.250;
-         default-lease-time 600 max-lease-time 7200;
-         option subnet-mask 255.255.255.0;
-         option broadcast-address 239.252.197.255;
-         option routers 239.252.197.1;
-         option domain-name-servers 239.252.197.2, 239.252.197.3;
-         option domain-name "isc.org";
-       }
-.fi
-.PP
-A bootp host on that subnet that needs to be in a different domain and
-use a different name server might be declared as follows:
-.nf
-.sp 1
-       host haagen hardware ethernet 08:00:2b:4c:59:23 {
-         fixed-address 239.252.197.9;
-         filename "/tftpboot/haagen.boot";
-         option domain-name-servers 192.5.5.1;
-         option domain-name "vix.com";
-       }
-.fi
-.PP
-A more complete description of the dhcpd.conf file syntax is provided
-in dhcpd.conf(5).
-.SH FILES
-.B ETCDIR/dhcpd.conf, DBDIR/dhcpd.leases, RUNDIR/dhcpd.pid,
-.B DBDIR/dhcpd.leases~.
-.SH SEE ALSO
-dhclient(8), dhcrelay(8), dhcpd.conf(5), dhcpd.leases(5)
-.SH AUTHOR
-.B dhcpd(8)
-was written by Ted Lemon <mellon@vix.com>
-under a contract with Vixie Labs.   Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.B http://www.isc.org/isc.
diff --git a/dhcpd.c b/dhcpd.c
deleted file mode 100644 (file)
index b063c30..0000000
--- a/dhcpd.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* dhcpd.c
-
-   DHCP Server Daemon. */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises.  To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''.  To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char ocopyright[] =
-"$Id: dhcpd.c,v 1.38 1997/02/22 08:49:44 mellon Exp $ Copyright 1995, 1996 The Internet Software Consortium.";
-#endif
-
-static char copyright[] =
-"Copyright 1995, 1996 The Internet Software Consortium.";
-static char arr [] = "All rights reserved.";
-static char message [] = "Internet Software Consortium DHCPD $Name:  $";
-
-#include "dhcpd.h"
-
-static void usage PROTO ((void));
-
-TIME cur_time;
-struct group root_group;
-
-struct iaddr server_identifier;
-int server_identifier_matched;
-
-#ifdef USE_FALLBACK
-struct interface_info fallback_interface;
-#endif
-
-u_int16_t local_port;
-u_int16_t remote_port;
-
-int log_priority;
-#ifdef DEBUG
-int log_perror = -1;
-#else
-int log_perror = 1;
-#endif
-
-char *path_dhcpd_conf = _PATH_DHCPD_CONF;
-char *path_dhcpd_db = _PATH_DHCPD_DB;
-char *path_dhcpd_pid = _PATH_DHCPD_PID;
-
-int main (argc, argv, envp)
-       int argc;
-       char **argv, **envp;
-{
-       int i, status;
-       struct servent *ent;
-       char *s;
-#ifndef DEBUG
-       int pidfilewritten = 0;
-       int pid;
-       char pbuf [20];
-       int daemon = 1;
-#endif
-
-       /* Initially, log errors to stderr as well as to syslogd. */
-#ifdef SYSLOG_4_2
-       openlog ("dhcpd", LOG_NDELAY);
-       log_priority = DHCPD_LOG_FACILITY;
-#else
-       openlog ("dhcpd", LOG_NDELAY, DHCPD_LOG_FACILITY);
-#endif
-
-#ifndef DEBUG
-#ifndef SYSLOG_4_2
-       setlogmask (LOG_UPTO (LOG_INFO));
-#endif
-#endif 
-       note (message);
-       note (copyright);
-       note (arr);
-
-       for (i = 1; i < argc; i++) {
-               if (!strcmp (argv [i], "-p")) {
-                       if (++i == argc)
-                               usage ();
-                       for (s = argv [i]; *s; s++)
-                               if (!isdigit (*s))
-                                       error ("%s: not a valid UDP port",
-                                              argv [i]);
-                       status = atoi (argv [i]);
-                       if (status < 1 || status > 65535)
-                               error ("%s: not a valid UDP port",
-                                      argv [i]);
-                       local_port = htons (status);
-                       debug ("binding to user-specified port %d",
-                              ntohs (local_port));
-               } else if (!strcmp (argv [i], "-f")) {
-#ifndef DEBUG
-                       daemon = 0;
-#endif
-               } else if (!strcmp (argv [i], "-d")) {
-#ifndef DEBUG
-                       daemon = 0;
-#endif
-                       log_perror = -1;
-               } else if (!strcmp (argv [i], "-cf")) {
-                       if (++i == argc)
-                               usage ();
-                       path_dhcpd_conf = argv [i];
-               } else if (!strcmp (argv [i], "-lf")) {
-                       if (++i == argc)
-                               usage ();
-                       path_dhcpd_db = argv [i];
-               } else if (argv [i][0] == '-') {
-                       usage ();
-               } else {
-                       struct interface_info *tmp =
-                               ((struct interface_info *)
-                                dmalloc (sizeof *tmp, "get_interface_list"));
-                       if (!tmp)
-                               error ("Insufficient memory to %s %s",
-                                      "record interface", argv [i]);
-                       memset (tmp, 0, sizeof *tmp);
-                       strcpy (tmp -> name, argv [i]);
-                       tmp -> next = interfaces;
-                       tmp -> flags = INTERFACE_REQUESTED;
-                       interfaces = tmp;
-               }
-       }
-
-#ifndef DEBUG
-       if (daemon) {
-               /* First part of becoming a daemon... */
-               if ((pid = fork ()) < 0)
-                       error ("Can't fork daemon: %m");
-               else if (pid)
-                       exit (0);
-       }
-
-       /* Read previous pid file. */
-       if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
-               status = read (i, pbuf, (sizeof pbuf) - 1);
-               close (i);
-               pbuf [status] = 0;
-               pid = atoi (pbuf);
-
-               /* If the previous server process is not still running,
-                  write a new pid file immediately. */
-               if (pid && kill (pid, 0) < 0) {
-                       unlink (path_dhcpd_pid);
-                       if ((i = open (path_dhcpd_pid,
-                                      O_WRONLY | O_CREAT, 0640)) >= 0) {
-                               sprintf (pbuf, "%d\n", (int)getpid ());
-                               write (i, pbuf, strlen (pbuf));
-                               close (i);
-                               pidfilewritten = 1;
-                       }
-               }
-       }
-#endif /* !DEBUG */
-
-       /* Default to the DHCP/BOOTP port. */
-       if (!local_port)
-       {
-               ent = getservbyname ("dhcp", "udp");
-               if (!ent)
-                       local_port = htons (67);
-               else
-                       local_port = ent -> s_port;
-               endservent ();
-       }
-  
-       remote_port = htons (ntohs (local_port) + 1);
-
-       /* Get the current time... */
-       GET_TIME (&cur_time);
-
-       /* Read the dhcpd.conf file... */
-       if (!readconf ())
-               error ("Configuration file errors encountered -- exiting");
-
-       /* Start up the database... */
-       db_startup ();
-
-       /* Discover all the network interfaces and initialize them. */
-       discover_interfaces (1);
-
-#ifndef DEBUG
-       /* If we were requested to log to stdout on the command line,
-          keep doing so; otherwise, stop. */
-       if (log_perror == -1)
-               log_perror = 1;
-       else
-               log_perror = 0;
-
-       if (daemon) {
-               /* Become session leader and get pid... */
-               close (0);
-               close (1);
-               close (2);
-               pid = setsid ();
-       }
-
-       /* If we didn't write the pid file earlier because we found a
-          process running the logged pid, but we made it to here,
-          meaning nothing is listening on the bootp port, then write
-          the pid file out - what's in it now is bogus anyway. */
-       if (!pidfilewritten) {
-               unlink (path_dhcpd_pid);
-               if ((i = open (path_dhcpd_pid,
-                              O_WRONLY | O_CREAT, 0640)) >= 0) {
-                       sprintf (pbuf, "%d\n", (int)getpid ());
-                       write (i, pbuf, strlen (pbuf));
-                       close (i);
-                       pidfilewritten = 1;
-               }
-       }
-#endif /* !DEBUG */
-
-       /* Receive packets and dispatch them... */
-       dispatch (1);
-
-       /* Not reached */
-       return 0;
-}
-
-/* Print usage message. */
-
-static void usage ()
-{
-       error ("Usage: dhcpd [-p <UDP port #>] [-d] [-f] [-cf config-file]%s",
-              "\n            [-lf lease-file] [if0 [...ifN]]");
-}
-
-void cleanup ()
-{
-}
diff --git a/dhcpd.conf b/dhcpd.conf
deleted file mode 100644 (file)
index a50dee0..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-# dhcpd.conf
-#
-# Configuration file for ISC dhcpd
-#
-
-# Hosts with more than one interface MUST specify a ``server-identifier'',
-# which should be the IP address of the server's primary network interface,
-# or if there is no interface that can be described that way, at least an
-# interface whose address isn't likely to change.
-
-server-identifier toccata.fugue.com;
-
-# option definitions common to all supported networks...
-option domain-name "fugue.com";
-option domain-name-servers toccata.fugue.com;
-
-# Shared network declaration is used to group subnets which share the same
-# physical network together.   The name is specified so that the shared
-# network can be referred to in log messages - it serves no other function.
-
-shared-network FUGUE {
-
-# option definitions common to this shared network.
-  option subnet-mask 255.255.255.224;
-  default-lease-time 600;
-  max-lease-time 7200;
-
-# One of the two IP subnets that share this physical network
-#
-# Address ranges can be specified for each subnet attached to
-# a shared network.   Since these subnets share the same physical
-# network, addresses are pooled together, and assignments are made
-# without regard to the actual subnet.   If the optional dynamic-bootp
-# keyword is given in the address range declaration, then addresses
-# in that range can be assigned either with the DHCP protocol or the
-# BOOTP protocol; otherwise, only DHCP clients will have addresses
-# allocated from the address range.
-#
-# Note that each IP subnet can have its own options specific to that subnet.
-# options that aren't specified in the subnet are taken from the shared
-# network (if any) and then from the global option list.
-
-  subnet 204.254.239.0 netmask 255.255.255.224 {
-    range 204.254.239.10 204.254.239.20;
-    option broadcast-address 204.254.239.31;
-    option routers prelude.fugue.com;
-  }
-
-# The other subnet that shares this physical network
-  subnet 204.254.239.32 netmask 255.255.255.224 {
-    range dynamic-bootp 204.254.239.10 204.254.239.20;
-    option broadcast-address 204.254.239.31;
-    option routers snarg.fugue.com;
-  }
-}
-
-# IP subnets that are alone on their physical wire should be declared by
-# themselves.   ISC dhcpd may still refer to them as shared networks in
-# log messages, but this is simply an artifact of the underlying data
-# structures.
-#
-# Note that options can be specified in the subnet declaration which
-# supersede the global options specified earlier.
-
-subnet 192.5.5.0 netmask 255.255.255.224 {
-  range 192.5.5.26 192.5.5.30;
-  option name-servers bb.home.vix.com, gw.home.vix.com;
-  option domain-name "vix.com";
-  option routers 192.5.5.1;
-  option subnet-mask 255.255.255.224;
-  option broadcast-address 192.5.5.31;
-  default-lease-time 600;
-  max-lease-time 7200;
-}
-
-# Hosts which require special configuration options can be listed in
-# host statements.   If no address is specified, the address will be
-# allocated dynamically (if possible), but the host-specific information
-# will still come from the host declaration.
-
-host passacaglia {
-  hardware ethernet 0:0:c0:5d:bd:95;
-  filename "vmunix.passacaglia";
-  server-name "toccata.fugue.com";
-}
-
-# Fixed IP addresses can also be specified for hosts.   These addresses
-# should not also be listed as being available for dynamic assignment.
-# Hosts for which fixed IP addresses have been specified can boot using
-# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
-# be booted with DHCP, unless there is an address range on the subnet
-# to which a BOOTP client is connected which has the dynamic-bootp flag
-# set.
-host fantasia {
-  hardware ethernet 08:00:07:26:c0:a5;
-  fixed-address fantasia.fugue.com;
-}
-
-# If a DHCP or BOOTP client is mobile and might be connected to a variety
-# of networks, more than one fixed address for that host can be specified.
-# Hosts can have fixed addresses on some networks, but receive dynamically
-# allocated address on other subnets; in order to support this, a host
-# declaration for that client must be given which does not have a fixed
-# address.   If a client should get different parameters depending on
-# what subnet it boots on, host declarations for each such network should
-# be given.   Finally, if a domain name is given for a host's fixed address
-# and that domain name evaluates to more than one address, the address
-# corresponding to the network to which the client is attached, if any,
-# will be assigned.
-host confusia {
-  hardware ethernet 02:03:04:05:06:07;
-  fixed-address confusia-1.fugue.com, confusia-2.fugue.com;
-  filename "vmunix.confusia";
-  server-name "toccata.fugue.com";
-}
-
-host confusia {
-  hardware ethernet 02:03:04:05:06:07;
-  fixed-address confusia-3.fugue.com;
-  filename "vmunix.confusia";
-  server-name "snarg.fugue.com";
-}
-
-host confusia {
-  hardware ethernet 02:03:04:05:06:07;
-  filename "vmunix.confusia";
-  server-name "bb.home.vix.com";
-}
diff --git a/dhcpd.conf.5 b/dhcpd.conf.5
deleted file mode 100644 (file)
index 0f93d92..0000000
+++ /dev/null
@@ -1,1081 +0,0 @@
-.\"    dhcpd.conf.5
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\"    of its contributors may be used to endorse or promote products derived
-.\"    from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises.  To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''.  To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.TH dhcpd.conf 5
-.SH NAME
-dhcpd.conf - dhcpd configuration file
-.SH DESCRIPTION
-The dhcpd.conf file contains configuration information for
-.IR dhcpd,
-the Internet Software Consortium DHCP Server.
-.PP
-The dhcpd.conf file is a free-form ASCII text file.   It is parsed by
-the recursive-descent parser built into dhcpd.   The file may contain
-extra tabs and newlines for formatting purposes.  Keywords in the file
-are case-insensitive.   Comments may be placed anywhere within the
-file (except within quotes).   Comments begin with the # character and
-end at the end of the line.
-.PP
-The file essentially consists of a list of statements.   Statements
-fall into two broad categories - parameters and declarations.
-.PP
-Parameter statements either say how to do something (e.g., how long a
-lease to offer), whether to do something (e.g., should dhcpd provide
-addresses to unknown clients), or what parameters to provide to the
-client (e.g., use gateway 220.177.244.7).
-.PP
-Declarations are used to describe the topology of the
-network, to describe clients on the network, to provide addresses that
-can be assigned to clients, or to apply a group of parameters to a
-group of declarations.   In any group of parameters and declarations,
-all parameters must be specified before any declarations which depend
-on those parameters may be specified.
-.PP
-Declarations about network topology include the
-\fIserver-identifier\fR, the \fIshared-network\fR and the \fIsubnet\fR
-declarations.   If clients on a subnet are to be assigned addresses
-dynamically, a \fIrange\fR declaration must appear within the
-\fIsubnet\fR declaration.   For clients with statically assigned
-addresses, or for installations where only known clients will be
-served, each such client must have a \fIhost\fR declaration.   If
-parameters are to be applied to a group of declarations which are not
-related strictly on a per-subnet basis, the \fIgroup\fR declaration
-can be used.
-.PP
-Each dhcpd.conf file must have one (and only one)
-.I server-identifier
-declaration, which tells dhcpd the identifier to use when issuing
-leases.  For every subnet which will be served, and for every subnet
-to which the dhcp server is connected, there must be one \fIsubnet\fR
-declaration, which tells dhcpd how to recognize that an address is on
-that subnet.  A \fIsubnet\fR declaration is required for each subnet
-even if no addresses will be dynamically allocated on that subnet.
-.PP
-Some installations have physical networks on which more than one IP
-subnet operates.   For example, if there is a site-wide requirement
-that 8-bit subnet masks be used, but a department with a single
-physical ethernet network expands to the point where it has more than
-254 nodes, it may be necessary to run two 8-bit subnets on the same
-ethernet until such time as a new physical network can be added.   In
-this case, the \fIsubnet\fR declarations for these two networks may be
-enclosed in a \fIshared-network\fR declaration.
-.PP
-Some sites may have departments which have clients on more than one
-subnet, but it may be desirable to offer those clients a uniform set
-of parameters which are different than what would be offered to
-clients from other departments on the same subnet.   For clients which
-will be declared explicitly with \fIhost\fR declarations, these
-declarations can be enclosed in a \fIgroup\fR declaration along with
-the parameters which are common to that department.   For clients
-whose addresses will be dynamically assigned, there is currently no
-way to group parameter assignments other than by network topology.
-.PP
-When a client is to be booted, its boot parameters are determined by
-first consulting that client's \fIhost\fR declaration (if any), then
-consulting the \fIgroup\fR declaration (if any) which enclosed that
-\fIhost\fR declaration, then consulting the \fIsubnet\fR declaration
-for the subnet on which the client is booting, then consulting the
-\fIshared-network\fR declaration (if any) containing that subnet, and
-finally consulting the top-level parameters which may be specified
-outside of any declaration.
-.PP
-When dhcpd tries to find a \fIhost\fR declaration for a client, it
-first looks for a \fIhost\fR declaration which has a
-\fIfixed-address\fR parameter which matches the subnet or shared
-network on which the client is booting.   If it doesn't find any such
-entry, it then tries to find an entry which has no \fIfixed-address\fR
-parameter.   If no such entry is found, then dhcpd acts as if there is
-no entry in the dhcpd.conf file for that client, even if there is an
-entry for that client on a different subnet or shared network.
-.SH EXAMPLES
-.PP
-A typical dhcpd.conf file will look something like this:
-.nf
-
-server-identifier dhcps.isc.org;
-.I global parameters...
-
-shared-network ISC-BIGGIE {
-  \fIshared-network-specific parameters...\fR
-  subnet 204.254.239.0 netmask 255.255.255.224 {
-    \fIsubnet-specific parameters...\fR
-    range 204.254.239.10 204.254.239.30;
-  }
-  subnet 204.254.239.32 netmask 255.255.255.224 {
-    \fIsubnet-specific parameters...\fR
-    range 204.254.239.42 204.254.239.62;
-  }
-}
-
-subnet 204.254.239.64 netmask 255.255.255.224 {
-  \fIsubnet-specific parameters...\fR
-  range 204.254.239.74 204.254.239.94;
-}
-
-group {
-  \fIgroup-specific parameters...\fR
-  host zappo.test.isc.org {
-    \fIhost-specific parameters...\fR
-  }
-  host beppo.test.isc.org {
-    \fIhost-specific parameters...\fR
-  }
-  host harpo.test.isc.org {
-    \fIhost-specific parameters...\fR
-  }
-}
-
-.ce 1
-Figure 1
-
-.fi
-.PP
-Notice that after the server-identifier declaration, there's a place
-for global parameters.   These might be things like the organization's
-domain name, the addresses of the name servers (if they are common to
-the entire organization), and so on.   So, for example:
-.nf
-
-       option domain-name "isc.org";
-       option name-servers ns1.isc.org, ns2.isc.org;
-
-.ce 1
-Figure 2
-.fi
-.PP
-As you can see in Figure 2, it's legal to specify host addresses in
-parameters as domain names rather than as numeric IP addresses.  If a
-given hostname resolves to more than one IP address (for example, if
-that host has two ethernet interfaces), both addresses are supplied to
-the client.
-.PP
-In Figure 1, you can see that both the shared-network statement and
-the subnet statements can have parameters.   Let us say that the
-shared network \fIISC-BIGGIE\fR supports an entire department -
-perhaps the accounting department.   If accounting has its own domain,
-then a shared-network-specific parameter might be:
-.nf
-
-       option domain-name "accounting.isc.org";
-.fi
-.PP
-All subnet declarations appearing in the shared-network declaration
-would then have the domain-name option set to "accounting.isc.org"
-instead of just "isc.org".
-.PP
-The most obvious reason for having subnet-specific parameters as
-shown in Figure 1 is that each subnet, of necessity, has its own
-router.   So for the first subnet, for example, there should be
-something like:
-.nf
-
-       option routers 204.254.239.1;
-.fi
-.PP
-Note that the address here is specified numerically.   This is not
-required - if you have a different domain name for each interface on
-your router, it's perfectly legitimate to use the domain name for that
-interface instead of the numeric address.   However, in many cases
-there may be only one domain name for all of a router's IP addresses, and
-it would not be appropriate to use that name here.
-.PP
-In Figure 1 there is also a \fIgroup\fR statement, which provides
-common parameters for a set of three hosts - zappo, beppo and harpo.
-As you can see, these hosts are all in the test.isc.org domain, so it
-might make sense for a group-specific parameter to override the domain
-name supplied to these hosts:
-.nf
-
-       option domain-name "test.isc.org";
-.fi
-.PP
-Also, given the domain they're in, these are probably test machines.
-If we wanted to test the DHCP leasing mechanism, we might set the
-lease timeout somewhat shorter than the default:
-
-.nf
-       max-lease-time 120;
-       default-lease-time 120;
-.fi
-.PP
-You may have noticed that while some parameters start with the
-\fIoption\fR keyword, some do not.   Parameters starting with the
-\fIoption\fR keyword correspond to actual DHCP options, while
-parameters that do not start with the option keyword either control
-the behaviour of the DHCP server (e.g., how long a lease dhcpd will
-give out), or specify client parameters that are not optional in the
-DHCP protocol (for example, server-name and filename).
-.PP
-In Figure 1, each host had \fIhost-specific parameters\fR.   These
-could include such things as the \fIhostname\fR option, the name of a
-file to upload (the \fIfilename parameter) and the address of the
-server from which to upload the file (the \fInext-server\fR
-parameter).   In general, any parameter can appear anywhere that
-parameters are allowed, and will be applied according to the scope in
-which the parameter appears.
-.PP
-Imagine that you have a site with a lot of NCD X-Terminals.   These
-terminals come in a variety of models, and you want to specify the
-boot files for each models.   One way to do this would be to have host
-declarations for each server and group them by model:
-.nf
-
-group {
-  filename "Xncd19r";
-  next-server ncd-booter;
-
-  host ncd1 { hardware ethernet 0:c0:c3:49:2b:57; }
-  host ncd4 { hardware ethernet 0:c0:c3:80:fc:32; }
-  host ncd8 { hardware ethernet 0:c0:c3:22:46:81; }
-}
-
-group {
-  filename "Xncd19c";
-  next-server ncd-booter;
-
-  host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
-  host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
-}
-
-group {
-  filename "XncdHMX";
-  next-server ncd-booter;
-
-  host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
-  host ncd4 { hardware ethernet 0:c0:c3:91:a7:8; }
-  host ncd8 { hardware ethernet 0:c0:c3:cc:a:8f; }
-}
-.fi
-.SH REFERENCE: DECLARATIONS
-.PP
-.B The
-.I server-identifier
-.B statement
-.PP
- \fBserver-identifier \fIhostname\fR\fB;\fR
-.PP
-The server-identifier declaration must be used exactly once in each
-dhcpd.conf file to tell dhcpd what IP address to use as its server
-identifier, as required by the DHCP protocol.   On a machine with a
-single interface, the server identifier should be the primary address
-of that interface.   On machines with multiple interfaces, the address
-of one such interface must be chosen.   Any address may be chosen, as
-long as it is the address of one of the interfaces of that machine.
-.PP
-.B The 
-.I shared-network
-.B statement
-.PP
-.nf
- \fBshared-network\fR \fIname\fR \fB{\fR
-   [ \fIparameters\fR ]
-   [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The \fIshared-network\fR statement is used to inform the DHCP server
-that some IP subnets actually share the same physical network.  Any
-subnets in a shared network should be declared within a
-\fIshared-network\fR statement.  Parameters specified in the
-\fIshared-network\fR statement will be used when booting clients on
-those subnets unless parameters provided at the subnet or host level
-override them.  If any subnet in a shared network has addresses
-available for dynamic allocation, those addresses are collected into a
-common pool for that shared network and assigned to clients as needed.
-There is no way to distinguish on which subnet of a shared network a
-client should boot.
-.PP
-.I Name
-should be the name of the shared network.   This name is used when
-printing debugging messages, so it should be descriptive for the
-shared network.   The name may have the syntax of a valid domain name
-(although it will never be used as such), or it may be any arbitrary
-name, enclosed in quotes.
-.PP
-.B The 
-.I subnet
-.B statement
-.PP
-.nf
- \fBsubnet\fR \fIsubnet-number\fR \fBnetmask\fR \fInetmask\fR \fB{\fR
-   [ \fIparameters\fR ]
-   [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The \fIsubnet\fR statement is used to provide dhcpd with enough
-information to tell whether or not an IP address is on that subnet.
-It may also be used to provide subnet-specific parameters and to
-specify what addresses may be dynamically allocated to clients booting
-on that subnet.   Such addresses are specified using the \fIrange\fR
-declaration.
-.PP
-The
-.I subnet-number
-should be an IP address or domain name which resolves to the subnet
-number of the subnet being described.   The 
-.I netmask
-should be an IP address or domain name which resolves to the subnet mask
-of the subnet being described.   The subnet number, together with the
-netmask, are sufficient to determine whether any given IP address is
-on the specified subnet.
-.PP
-Although a netmask must be given with every subnet declaration, it is
-recommended that if there is any variance in subnet masks at a site, a
-subnet-mask option statement be used in each subnet declaration to set
-the desired subnet mask, since any subnet-mask option statement will
-override the subnet mask declared in the subnet statement.
-.PP
-.B The
-.I range
-.B statement
-.PP
-.nf
- \fBrange\fR [ \fBdynamic-bootp\fR ] \fIlow-address\fR [ \fIhigh-address\fR]\fB;\fR
-.fi
-.PP
-For any subnet on which addresses will be assigned dynamically, there
-must be at least one \fIrange\fR statement.   The range statement
-gives the lowest and highest IP addresses in a range.   All IP
-addresses in the range should be in the subnet in which the
-\fIrange\fR statement is declared.   The \fIdynamic-bootp\fR flag may
-be specified if addresses in the specified range may be dynamically
-assigned to BOOTP clients as well as DHCP clients.   When specifying a
-single address, \fIhigh-address\fR can be omitted.
-.PP
-.B The
-.I host
-.B statement
-.PP
-.nf
- \fBhost\fR \fIhostname\fR {
-   [ \fIparameters\fR ]
-   [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-There must be at least one
-.B host
-statement for every BOOTP client that is to be served.   
-.B host
-statements may also be specified for DHCP clients, although this is
-not required unless booting is only enabled for known hosts.
-.PP
-If it is desirable to be able to boot a DHCP or BOOTP
-client on more than one subnet with fixed addresses, more than one
-address may be specified in the
-.I fixed-address
-parameter, or more than one
-.B host
-statement may be specified.
-.PP
-If client-specific boot parameters must change based on the network
-to which the client is attached, then multiple 
-.B host
-statements should
-be used.
-.PP
-If a client is to be booted using a fixed address if it's
-possible, but should be allocated a dynamic address otherwise, then a
-.B host
-statement must be specified without a
-.B fixed-address
-clause.
-.I hostname
-should be a name identifying the host.  If a \fIhostname\fR option is
-not specified for the host, \fIhostname\fR is used.
-.PP
-\fIHost\fR declarations are matched to actual DHCP or BOOTP clients
-by matching the \fRdhcp-client-identifier\fR option specified in the
-\fIhost\fR declaration to the one supplied by the client, or, if the
-\fIhost\fR declaration or the client does not provide a
-\fRdhcp-client-identifier\fR option, by matching the \fIhardware\fR
-parameter in the \fIhost\fR declaration to the network hardware
-address supplied by the client.   BOOTP clients do not normally
-provide a \fIdhcp-client-identifier\fR, so the hardware address must
-be used for all clients that may boot using the BOOTP protocol.
-.PP
-.B The
-.I group
-.B statement
-.PP
-.nf
- \fBgroup\fR {
-   [ \fIparameters\fR ]
-   [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The group statement is used simply to apply one or more parameters to
-a group of declarations.   It can be used to group hosts, shared
-networks, subnets, or even other groups.
-.SH REFERENCE: ALLOW and DENY
-.PP
-The
-.I allow
-and
-.I deny
-statements can be used to control the behaviour of dhcpd to various
-sorts of requests.
-.PP
-.PP
-.B The
-.I unknown-clients
-.B keyword
-.PP
- \fBallow unknown-clients;\fR
- \fBdeny unknown-clients;\fR
-.PP
-The \fBunknown-clients\fR flag is used to tell dhcpd whether
-or not to dynamically assign addresses to unknown clients.   Dynamic
-address assignment to unknown clients is \fBallow\fRed by default.
-.PP
-.B The
-.I bootp
-.B keyword
-.PP
- \fBallow bootp;\fR
- \fBdeny bootp;\fR
-.PP
-The \fBunknown-clients\fR flag is used to tell dhcpd whether
-or not to respond to bootp queries.  Bootp queries are \fBallow\fRed
-by default.
-.PP
-.B The
-.I booting
-.B keyword
-.PP
- \fBallow booting;\fR
- \fBdeny booting;\fR
-.PP
-The \fBbooting\fR flag is used to tell dhcpd whether or not to respond
-to queries from a particular client.  This keyword only has meaning
-when it appears in a host declaration.   By default, booting is
-\fBallow\fRed, but if it is disabled for a particular client, then
-that client will not be able to get and address from the DHCP server.
-.SH REFERENCE: PARAMETERS
-.PP
-.B The
-.I default-lease-time
-.B statement
-.PP
- \fBdefault-lease-time\fR \fItime\fR\fB;\fR
-.PP
-.I Time
-should be the length in seconds that will be assigned to a lease if
-the client requesting the lease does not ask for a specific expiration
-time.
-.PP
-.B The
-.I max-lease-time
-.B statement
-.PP
- \fBmax-lease-time\fR \fItime\fR\fB;\fR
-.PP
-.I Time
-should be the maximum length in seconds that will be assigned to a
-lease if the client requesting the lease asks for a specific
-expiration time.
-.PP
-.B The 
-.I hardware
-.B statement
-.PP
- \fBhardware\fR \fIhardware-type\fR \fIhardware-address\fR\fB;\fR
-.PP
-In order for a BOOTP client to be recognized, its network hardware
-address must be declared using a \fIhardware\fR clause in the
-.I host
-statement.
-.I hardware-type
-must be the name of a physical hardware interface type.   Currently,
-only the
-.B ethernet
-type is recognized, although support for
-.B token-ring
-and
-.B fddi
-hardware types would also be desirable.
-The
-.I hardware-address
-should be a set of hexadecimal octets (numbers from 0 through ff)
-seperated by colons.   The \fIhardwarefR statement may also be used
-for DHCP clients.
-.PP
-.B The
-.I filename
-.B statement
-.PP
- \fBfilename\fR \fB"\fR\fIfilename\fR\fB";\fR
-.PP
-The \fIfilename\fR statement can be used to specify the name of the
-initial boot file which is to be loaded by a client.  The
-.I filename
-should be a filename recognizable to whatever file transfer protocol
-the client can be expected to use to load the file.
-.PP
-.B The
-.I server-name
-.B statement
-.PP
- \fBserver-name\fR \fB"\fR\fIname\fR\fB";\fR
-.PP
-The \fIserver-name\fR statement can be used to inform the client of
-the name of the server from which it is booting.   \fIName\fR should
-be the name that will be provided to the client.
-.PP
-.B The
-.I next-server
-.B statement
-.PP
- \fBnext-server\fR \fIserver-name\fR\fB;\fR
-.PP
-The \fInext-server\fR statement is used to specify the host address of
-the server from which the initial boot file (specified in the
-\fIfilename\fR statement) is to be loaded.   \fIServer-name\fR should
-be a numeric IP address or a domain name.   If no \fInext-server\fR
-parameter applies to a given client, the address specified in the
-\fIserver-identifier\fR statement is used.
-.PP
-.B The
-.I fixed-address
-.B statement
-.PP
- \fBfixed-address\fR \fIaddress\fR [\fB,\fR \fIaddress\fR ... ]\fB;\fR
-.PP
-The \fIfixed-address\fR statement is used to assign one or more fixed
-IP addresses to a client.  It should only appear in a \fIhost\fR
-declaration.  If more than one address is supplied, then when the
-client boots, it will be assigned the address which corresponds to the
-network on which it is booting.  If none of the addresses in the
-\fIfixed-address\fR statement are on the network on which the client
-is booting, that client will not match the \fIhost\fR declaration
-containing that \fIfixed-address\fR statement.  Each \fIaddress\fR
-should be either an IP address or a domain name which resolves to one
-or more IP addresses.
-.PP
-.B The
-.I dynamic-bootp-lease-cutoff
-.B statement
-.PP
- \fBdynamic-bootp-lease-cutoff\fR \fIdate\fR\fB;\fR
-.PP
-The \fIdynamic-bootp-lease-cutoff\fR statement sets the ending time
-for all leases assigned dynamically to BOOTP clients.  Because BOOTP
-clients do not have any way of renewing leases, and don't know that
-their leases could expire, by default dhcpd assignes infinite leases
-to all BOOTP clients.  However, it may make sense in some situations
-to set a cutoff date for all BOOTP leases - for example, the end of a
-school term, or the time at night when a facility is closed and all
-machines are required to be powered off.
-.PP
-.I Date
-should be the date on which all assigned BOOTP leases will end.  The
-date is specified in the form:
-.PP
-.ce 1
-W YYYY/MM/DD HH:MM:SS
-.PP
-W is the day of the week expressed as a number
-from zero (Sunday) to six (Saturday).  YYYY is the year, including the
-century.  MM is the month expressed as a number from 1 to 12.  DD is
-the day of the month, counting from 1.  HH is the hour, from zero to
-23.  MM is the minute and SS is the second.  The time is always in
-Greenwich Mean Time (GMT), not local time.
-.PP
-.B The
-.I dynamic-bootp-lease-length
-.B statement
-.PP
- \fBdynamic-bootp-lease-length\fR \fIlength\fR\fB;\fR
-.PP
-The \fIdynamic-bootp-lease-length\fR statement is used to set the
-length of leases dynamically assigned to BOOTP clients.   At some
-sites, it may be possible to assume that a lease is no longer in
-use if its holder has not used BOOTP or DHCP to get its address within
-a certain time period.   The period is specified in \fIlength\fR as a
-number of seconds.   If a client reboots using BOOTP during the
-timeout period, the lease duration is reset to \fIlength\fR, so a
-BOOTP client that boots frequently enough will never lose its lease.
-Needless to say, this parameter should be adjusted with extreme
-caution.
-.PP
-.B The
-.I get-lease-hostnames
-.B statement
-.PP
- \fBget-lease-hostnames\fR \fIflag\fR\fB;\fR
-.PP
-The \fIget-lease-hostnames\fR statement is used to tell dhcpd whether
-or not to look up the domain name corresponding to the IP address of
-each address in the lease pool and use that address for the DHCP
-\fIhostname\fR option.  If \fIflag\fR is true, then this lookup is
-done for all addresses in the current scope.   By default, or if
-\fIflag\fR is false, no lookups are done.
-.PP
-.B The
-.I use-host-decl-names
-.B statement
-.PP
- \fBuse-host-decl-names\fR \fIflag\fR\fB;\fR
-.PP
-If the \fIuse-host-decl-names\fR parameter is true in a given scope,
-then for every host declaration within that scope, the name provided
-for the host declaration will be supplied to the client as its
-hostname.   So, for example,
-.PP
-.nf
-    group {
-      use-host-decl-names on;
-
-      host joe {
-       hardware ethernet 08:00:2b:4c:29:32;
-       fixed-address joe.fugue.com;
-      }
-    }
-
-is equivalent to
-
-      host joe {
-       hardware ethernet 08:00:2b:4c:29:32;
-       fixed-address joe.fugue.com;
-        option host-name "joe";
-      }
-.fi
-.PP
-An \fIoption host-name\fR statement within a host declaration will
-override the use of the name in the host declaration.
-.SH REFERENCE: OPTION STATEMENTS
-.PP
-DHCP \fIoption\fR statements always start with the \fIoption\fR
-keyword, followed by an option name, followed by option data.  The
-option names and data formats are described below.   It is not
-necessary to exhaustively specify all DHCP options - only those
-options which are needed by clients must be specified.
-.PP
-Option data comes in a variety of formats, as defined below:
-.PP
-The
-.B ip-address
-data type can be entered either as an explicit IP
-address (e.g., 239.254.197.10) or as a domain name (e.g.,
-haagen.isc.org).  When entering a domain name, be sure that that
-domain name resolves to a single IP address.
-.PP
-The
-.B int32
-data type specifies a signed 32-bit integer.   The 
-.B uint32
-data type specifies an unsigned 32-bit integer.   The 
-.B int16
-and
-.B uint16
-data types specify signed and unsigned 16-bit integers.   The 
-.B int8
-and
-.B uint8
-data types specify signed and unsigned 8-bit integers.
-Unsigned 8-bit integers are also sometimes referred to as octets.
-.PP
-The
-.B string
-data type specifies an NVT ASCII string, which must be
-enclosed in double quotes - for example, to specify a domain-name
-option, the syntax would be
-.nf
-.sp 1
-       option domain-name "isc.org";
-.fi
-.PP
-The
-.B flag
-data type specifies a boolean value.   Booleans can be either true or
-false (or on or off, if that makes more sense to you).
-.PP
-The
-.B data-string
-data type specifies either an NVT ASCII string
-enclosed in double quotes, or a series of octets specified in
-hexadecimal, seperated by colons.   For example:
-.nf
-.sp 1
-       option client-identifier "CLIENT-FOO";
-or
-       option client-identifier 43:4c:49:45:54:2d:46:4f:4f;
-.fi
-.PP
-The documentation for the various options mentioned below is taken
-from the latest IETF draft document on DHCP options.   Options which
-are not listed by name may be defined by the name option-\fInnn\fR,
-where \fInnn\fI is the decimal number of the option code.   These
-options may be followed either by a string, enclosed in quotes, or by
-a series of octets, expressed as two-digit hexadecimal numbers seperated
-by colons.   For example:
-.PP
-.nf
-       option option-133 "my-option-133-text";
-       option option-129 1:54:c9:2b:47;
-.fi
-.PP
-Because dhcpd does not know the format of these undefined option codes,
-no checking is done to ensure the correctness of the entered data.
-.PP
-The standard options are:
-.PP
- \fBoption subnet-mask\fR \fIip-address\fR\fB;\fR
-.PP
-The subnet mask option specifies the client's subnet mask as per RFC
-950.  If no subnet mask option is provided anywhere in scope, as a
-last resort dhcpd will use the subnet mask from the subnet declaration
-for the network on which an address is being assigned.  However,
-.I any
-subnet-mask option declaration that is in scope for the address being
-assigned will override the subnet mask specified in the subnet
-declaration.
-.PP
- \fBoption time-offset\fR \fIint32\fR\fB;\fR
-.PP
-The time-offset option specifies the offset of the client's subnet in
-seconds from Coordinated Universal Time (UTC).
-.PP
- \fBoption routers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The routers option specifies a list of IP addresses for routers on the
-client's subnet.  Routers should be listed in order of preference.
-.PP
- \fBoption time-servers\fR \fIip-address [, \fIip-address\fR ... ]\fB;\fR
-.PP
-The time-server option specifies a list of RFC 868 time servers
-available to the client.  Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBname-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ];
-.PP
-The name-servers option specifies a list of IEN 116 name servers
-available to the client.  Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBdomain-name-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The domain-name-servers option specifies a list of Domain Name System
-(STD 13, RFC 1035) name servers available to the client.  Servers
-should be listed in order of preference.
-.PP
- \fBoption\fR \fBlog-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The log-server option specifies a list of MIT-LCS UDP log servers
-available to the client.  Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBcookie-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The cookie server option specifies a list of RFC 865 cookie
-servers available to the client.  Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBlpr-servers\fR \fIip-address \fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The LPR server option specifies a list of RFC 1179 line printer
-servers available to the client.  Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBimpress-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The impress-server option specifies a list of Imagen Impress servers
-available to the client.  Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBresource-location-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of RFC 887 Resource Location
-servers available to the client.  Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBhost-name\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the name of the client.  The name may or may
-not be qualified with the local domain name (it is preferable to use
-the domain-name option to specify the domain name).  See RFC 1035 for
-character set restrictions.
-.PP
- \fBoption\fR \fBboot-size\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the length in 512-octet blocks of the default
-boot image for the client.
-.PP
- \fBoption\fR \fBmerit-dump\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the path-name of a file to which the client's
-core image should be dumped in the event the client crashes.  The
-path is formatted as a character string consisting of characters from
-the NVT ASCII character set.
-.PP
- \fBoption\fR \fBdomain-name\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the domain name that client should use when
-resolving hostnames via the Domain Name System.
-.PP
- \fBoption\fR \fBswap-server\fR \fIip-address\fR\fB;\fR
-.PP
-This specifies the IP address of the client's swap server.
-.PP
- \fBoption\fR \fBroot-path\fR \fIstring\fB;\fR\fR
-.PP
-This option specifies the path-name that contains the client's root
-disk.  The path is formatted as a character string consisting of
-characters from the NVT ASCII character set.
-.PP
- \fBoption\fR \fBip-forwarding\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether the client should configure its IP
-layer for packet forwarding.  A value of 0 means disable IP
-forwarding, and a value of 1 means enable IP forwarding.
-.PP
- \fBoption\fR \fBnon-local-source-routing\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether the client should configure its IP
-layer to allow forwarding of datagrams with non-local source routes
-(see Section 3.3.5 of [4] for a discussion of this topic).  A value
-of 0 means disallow forwarding of such datagrams, and a value of 1
-means allow forwarding.
-.PP
- \fBoption\fR \fBpolicy-filter\fR \fIip-address ip-address\fR [\fB,\fR \fIip-address ip-address\fR ... ]\fB;\fR
-.PP
-This option specifies policy filters for non-local source routing.
-The filters consist of a list of IP addresses and masks which specify
-destination/mask pairs with which to filter incoming source routes.
-.PP
-Any source routed datagram whose next-hop address does not match one
-of the filters should be discarded by the client.
-.PP
-See STD 3 (RFC1122) for further information.
-.PP
- \fBoption\fR \fBmax-dgram-reassembly\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the maximum size datagram that the client
-should be prepared to reassemble.  The minimum value legal value is
-576.
-.PP
- \fBoption\fR \fBdefault-ip-ttl\fR \fIuint8;\fR
-.PP
-This option specifies the default time-to-live that the client should
-use on outgoing datagrams.
-.PP
- \fBoption\fR \fBpath-mtu-aging-timeout\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the timeout (in seconds) to use when aging Path
-MTU values discovered by the mechanism defined in RFC 1191.
-.PP
- \fBoption\fR \fBpath-mtu-plateau-table\fR \fIuint16\fR [\fB,\fR \fIuint16\fR ... ]\fB;\fR
-.PP
-This option specifies a table of MTU sizes to use when performing
-Path MTU Discovery as defined in RFC 1191.  The table is formatted as
-a list of 16-bit unsigned integers, ordered from smallest to largest.
-The minimum MTU value cannot be smaller than 68.
-.PP
- \fBoption\fR \fBinterface-mtu\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the MTU to use on this interface.   The minimum
-legal value for the MTU is 68.
-.PP
- \fBoption\fR \fBall-subnets-local\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client may assume that all
-subnets of the IP network to which the client is connected use the
-same MTU as the subnet of that network to which the client is
-directly connected.  A value of 1 indicates that all subnets share
-the same MTU.  A value of 0 means that the client should assume that
-some subnets of the directly connected network may have smaller MTUs.
-.PP
- \fBoption\fR \fBbroadcast-address\fR \fIip-address\fR\fB;\fR
-.PP
-This option specifies the broadcast address in use on the client's
-subnet.  Legal values for broadcast addresses are specified in
-section 3.2.1.3 of STD 3 (RFC1122).
-.PP
- \fBoption\fR \fBperform-mask-discovery\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should perform subnet
-mask discovery using ICMP.  A value of 0 indicates that the client
-should not perform mask discovery.  A value of 1 means that the
-client should perform mask discovery.
-.PP
- \fBoption\fR \fBmask-supplier\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should respond to
-subnet mask requests using ICMP.  A value of 0 indicates that the
-client should not respond.  A value of 1 means that the client should
-respond.
-.PP
- \fBoption\fR \fBrouter-discovery\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should solicit
-routers using the Router Discovery mechanism defined in RFC 1256.
-A value of 0 indicates that the client should not perform
-router discovery.  A value of 1 means that the client should perform
-router discovery.
-.PP
- \fBoption\fR \fBrouter-solicitation-address\fR \fIip-address\fR\fB;\fR
-.PP
-This option specifies the address to which the client should transmit
-router solicitation requests.
-.PP
- \fBoption\fR \fBstatic-routes\fR \fIip-address ip-address\fR [\fB,\fR \fIip-address ip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of static routes that the client should
-install in its routing cache.  If multiple routes to the same
-destination are specified, they are listed in descending order of
-priority.
-.PP
-The routes consist of a list of IP address pairs.  The first address
-is the destination address, and the second address is the router for
-the destination.
-.PP
-The default route (0.0.0.0) is an illegal destination for a static
-route.  To specify the default route, use the
-.B routers
-option.
-.PP
- \fBoption\fR \fBtrailer-encapsulation\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should negotiate the
-use of trailers (RFC 893 [14]) when using the ARP protocol.  A value
-of 0 indicates that the client should not attempt to use trailers.  A
-value of 1 means that the client should attempt to use trailers.
-.PP
- \fBoption\fR \fBarp-cache-timeout\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the timeout in seconds for ARP cache entries.
-.PP
- \fBoption\fR \fBieee802-3-encapsulation\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should use Ethernet
-Version 2 (RFC 894) or IEEE 802.3 (RFC 1042) encapsulation if the
-interface is an Ethernet.  A value of 0 indicates that the client
-should use RFC 894 encapsulation.  A value of 1 means that the client
-should use RFC 1042 encapsulation.
-.PP
- \fBoption\fR \fBdefault-tcp-ttl\fR \fIuint8\fR\fB;\fR
-.PP
-This option specifies the default TTL that the client should use when
-sending TCP segments.  The minimum value is 1.
-.PP
- \fBoption\fR \fBtcp-keepalive-interval\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the interval (in seconds) that the client TCP
-should wait before sending a keepalive message on a TCP connection.
-The time is specified as a 32-bit unsigned integer.  A value of zero
-indicates that the client should not generate keepalive messages on
-connections unless specifically requested by an application.
-.PP
- \fBoption\fR \fBtcp-keepalive-garbage\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies the whether or not the client should send TCP
-keepalive messages with a octet of garbage for compatibility with
-older implementations.  A value of 0 indicates that a garbage octet
-should not be sent. A value of 1 indicates that a garbage octet
-should be sent.
-.PP
- \fBoption\fR \fBnis-domain\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the name of the client's NIS (Sun Network
-Information Services) domain.  The domain is formatted as a character
-string consisting of characters from the NVT ASCII character set.
-.PP
- \fBoption\fR \fBnis-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of IP addresses indicating NIS servers
-available to the client.  Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBntp-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of IP addresses indicating NTP (RFC 1035)
-servers available to the client.  Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBnetbios-name-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The NetBIOS name server (NBNS) option specifies a list of RFC
-1001/1002 NBNS name servers listed in order of preference.
-.PP
- \fBoption\fR \fBnetbios-dd-server\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The NetBIOS datagram distribution server (NBDD) option specifies a
-list of RFC 1001/1002 NBDD servers listed in order of preference.
-.PP
- \fBoption\fR \fBnetbios-node-type\fR \fIuint8\fR\fB;\fR
-.PP
-The NetBIOS node type option allows NetBIOS over TCP/IP clients which
-are configurable to be configured as described in RFC 1001/1002.  The
-value is specified as a single octet which identifies the client type.
-A value of 1 corresponds to a NetBIOS B-node; a value of 2 corresponds
-to a P-node; a value of 4 corresponds to an M-node; a value of 8
-corresponds to an H-node.
-.PP
- \fBoption\fR \fBnetbios-scope\fR \fIstring\fR\fB;\fR
-.PP
-The NetBIOS scope option specifies the NetBIOS over TCP/IP scope
-parameter for the client as specified in RFC 1001/1002. See RFC1001,
-RFC1002, and RFC1035 for character-set restrictions.
-.PP
- \fBoption\fR \fBfont-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of X Window System Font servers available
-to the client. Servers should be listed in order of preference.
-.PP
- \fBoption\fR \fBx-display-manager\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of systems that are running the X Window
-System Display Manager and are available to the client.  Addresses
-should be listed in order of preference.
-.PP
- \fBoption\fR \fBdhcp-client-identifier\fR \fIdata-string\fR\fB;\fR
-.PP
-This option can be used to specify the a DHCP client identifier in a
-host declaration, so that dhcpd can find the host record by matching
-against the client identifier.
-.SH SEE ALSO
-dhcpd.conf(5), dhcpd.leases(5),
-draft-ietf-dhc-options-1533update-04.txt, draft-ietf-dhc-dhcp-07.txt.
-.SH AUTHOR
-.B dhcpd(8)
-was written by Ted Lemon <mellon@vix.com>
-under a contract with Vixie Labs.   Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.B http://www.isc.org/isc.
diff --git a/dhcpd.conf.cat5 b/dhcpd.conf.cat5
deleted file mode 100644 (file)
index ddbe2fb..0000000
+++ /dev/null
@@ -1,1254 +0,0 @@
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-N\bNA\bAM\bME\bE
-       dhcpd.conf - dhcpd configuration file
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The dhcpd.conf file contains configuration information for
-       _\bd_\bh_\bc_\bp_\bd_\b, the Internet Software Consortium DHCP Server.
-
-       The dhcpd.conf file is a free-form ASCII text  file.    It
-       is  parsed  by  the  recursive-descent  parser  built into
-       dhcpd.   The file may contain extra tabs and newlines  for
-       formatting purposes.  Keywords in the file are case-insen-
-       sitive.   Comments may be placed anywhere within the  file
-       (except  within quotes).   Comments begin with the # char-
-       acter and end at the end of the line.
-
-       The file essentially consists of  a  list  of  statements.
-       Statements fall into two broad categories - parameters and
-       declarations.
-
-       Parameter statements either say how to do something (e.g.,
-       how long a lease to offer), whether to do something (e.g.,
-       should dhcpd provide addresses  to  unknown  clients),  or
-       what  parameters to provide to the client (e.g., use gate-
-       way 220.177.244.7).
-
-       Declarations are used to describe the topology of the net-
-       work,  to  describe  clients  on  the  network, to provide
-       addresses that can be assigned to clients, or to  apply  a
-       group  of  parameters to a group of declarations.   In any
-       group of parameters and declarations, all parameters  must
-       be specified before any declarations which depend on those
-       parameters may be specified.
-
-       Declarations about network topology  include  the  _\bs_\be_\br_\bv_\be_\br_\b-
-       _\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br,  the  _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk  and  the _\bs_\bu_\bb_\bn_\be_\bt declara-
-       tions.   If  clients  on  a  subnet  are  to  be  assigned
-       addresses  dynamically,  a  _\br_\ba_\bn_\bg_\be  declaration must appear
-       within the _\bs_\bu_\bb_\bn_\be_\bt declaration.   For clients  with  stati-
-       cally  assigned addresses, or for installations where only
-       known clients will be served, each such client must have a
-       _\bh_\bo_\bs_\bt  declaration.    If parameters are to be applied to a
-       group of declarations which are not related strictly on  a
-       per-subnet basis, the _\bg_\br_\bo_\bu_\bp declaration can be used.
-
-       Each  dhcpd.conf file must have one (and only one) _\bs_\be_\br_\bv_\be_\br_\b-
-       _\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br declaration, which tells dhcpd  the  identifier
-       to  use  when issuing leases.  For every subnet which will
-       be served, and for every subnet to which the  dhcp  server
-       is  connected, there must be one _\bs_\bu_\bb_\bn_\be_\bt declaration, which
-       tells dhcpd how to recognize that an address  is  on  that
-       subnet.   A _\bs_\bu_\bb_\bn_\be_\bt declaration is required for each subnet
-       even if no addresses will be dynamically allocated on that
-       subnet.
-
-
-
-
-                                                                1
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       Some  installations  have  physical networks on which more
-       than one IP subnet operates.   For example, if there is  a
-       site-wide requirement that 8-bit subnet masks be used, but
-       a department  with  a  single  physical  ethernet  network
-       expands  to the point where it has more than 254 nodes, it
-       may be necessary to run two 8-bit subnets on the same eth-
-       ernet  until  such  time  as a new physical network can be
-       added.   In this case, the _\bs_\bu_\bb_\bn_\be_\bt declarations  for  these
-       two  networks may be enclosed in a _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk declara-
-       tion.
-
-       Some sites may have departments which have clients on more
-       than  one  subnet,  but it may be desirable to offer those
-       clients a uniform set of parameters  which  are  different
-       than  what  would be offered to clients from other depart-
-       ments on the same subnet.    For  clients  which  will  be
-       declared explicitly with _\bh_\bo_\bs_\bt declarations, these declara-
-       tions can be enclosed in a _\bg_\br_\bo_\bu_\bp  declaration  along  with
-       the  parameters which are common to that department.   For
-       clients whose  addresses  will  be  dynamically  assigned,
-       there  is  currently no way to group parameter assignments
-       other than by network topology.
-
-       When a client is to be booted,  its  boot  parameters  are
-       determined by first consulting that client's _\bh_\bo_\bs_\bt declara-
-       tion (if any), then consulting the _\bg_\br_\bo_\bu_\bp  declaration  (if
-       any) which enclosed that _\bh_\bo_\bs_\bt declaration, then consulting
-       the _\bs_\bu_\bb_\bn_\be_\bt declaration for the subnet on which the  client
-       is booting, then consulting the _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk declaration
-       (if any) containing that subnet,  and  finally  consulting
-       the top-level parameters which may be specified outside of
-       any declaration.
-
-       When dhcpd tries to find a _\bh_\bo_\bs_\bt declaration for a  client,
-       it  first  looks for a _\bh_\bo_\bs_\bt declaration which has a _\bf_\bi_\bx_\be_\bd_\b-
-       _\ba_\bd_\bd_\br_\be_\bs_\bs parameter which matches the subnet or shared  net-
-       work  on which the client is booting.   If it doesn't find
-       any such entry, it then tries to find an entry  which  has
-       no  _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs  parameter.   If no such entry is found,
-       then dhcpd acts as if there is no entry in the  dhcpd.conf
-       file  for  that client, even if there is an entry for that
-       client on a different subnet or shared network.
-
-E\bEX\bXA\bAM\bMP\bPL\bLE\bES\bS
-       A typical dhcpd.conf file will look something like this:
-
-       server-identifier dhcps.isc.org;
-       _\bg_\bl_\bo_\bb_\ba_\bl _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-
-       shared-network ISC-BIGGIE {
-         _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         subnet 204.254.239.0 netmask 255.255.255.224 {
-           _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-           range 204.254.239.10 204.254.239.30;
-
-
-
-                                                                2
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-         }
-         subnet 204.254.239.32 netmask 255.255.255.224 {
-           _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-           range 204.254.239.42 204.254.239.62;
-         }
-       }
-
-       subnet 204.254.239.64 netmask 255.255.255.224 {
-         _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         range 204.254.239.74 204.254.239.94;
-       }
-
-       group {
-         _\bg_\br_\bo_\bu_\bp_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         host zappo.test.isc.org {
-           _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         }
-         host beppo.test.isc.org {
-           _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         }
-         host harpo.test.isc.org {
-           _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-         }
-       }
-
-                                Figure 1
-
-
-       Notice  that  after  the  server-identifier   declaration,
-       there's  a  place  for global parameters.   These might be
-       things like the organization's domain name, the  addresses
-       of  the  name  servers  (if  they are common to the entire
-       organization), and so on.   So, for example:
-
-            option domain-name "isc.org";
-            option name-servers ns1.isc.org, ns2.isc.org;
-
-                                Figure 2
-
-       As you can see in Figure 2, it's  legal  to  specify  host
-       addresses  in  parameters  as  domain names rather than as
-       numeric IP addresses.  If a  given  hostname  resolves  to
-       more  than  one  IP address (for example, if that host has
-       two ethernet interfaces), both addresses are  supplied  to
-       the client.
-
-       In  Figure  1,  you  can  see that both the shared-network
-       statement and the subnet statements can  have  parameters.
-       Let  us say that the shared network _\bI_\bS_\bC_\b-_\bB_\bI_\bG_\bG_\bI_\bE supports an
-       entire department -  perhaps  the  accounting  department.
-       If  accounting  has its own domain, then a shared-network-
-       specific parameter might be:
-
-            option domain-name "accounting.isc.org";
-
-
-
-                                                                3
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       All subnet declarations appearing  in  the  shared-network
-       declaration  would then have the domain-name option set to
-       "accounting.isc.org" instead of just "isc.org".
-
-       The most obvious reason for having subnet-specific parame-
-       ters  as  shown in Figure 1 is that each subnet, of neces-
-       sity, has its own router.   So for the first  subnet,  for
-       example, there should be something like:
-
-            option routers 204.254.239.1;
-
-       Note  that  the  address  here  is  specified numerically.
-       This is not required - if you have a different domain name
-       for  each interface on your router, it's perfectly legiti-
-       mate to use the domain name for that interface instead  of
-       the numeric address.   However, in many cases there may be
-       only one domain name for all of a router's  IP  addresses,
-       and it would not be appropriate to use that name here.
-
-       In  Figure  1  there is also a _\bg_\br_\bo_\bu_\bp statement, which pro-
-       vides common parameters for a set of three hosts -  zappo,
-       beppo  and  harpo.  As you can see, these hosts are all in
-       the test.isc.org domain, so it  might  make  sense  for  a
-       group-specific  parameter to override the domain name sup-
-       plied to these hosts:
-
-            option domain-name "test.isc.org";
-
-       Also, given the domain they're in, these are probably test
-       machines.   If  we  wanted to test the DHCP leasing mecha-
-       nism, we might set the lease timeout somewhat shorter than
-       the default:
-
-            max-lease-time 120;
-            default-lease-time 120;
-
-       You may have noticed that while some parameters start with
-       the _\bo_\bp_\bt_\bi_\bo_\bn keyword, some  do  not.    Parameters  starting
-       with the _\bo_\bp_\bt_\bi_\bo_\bn keyword correspond to actual DHCP options,
-       while parameters that do not start with the option keyword
-       either control the behaviour of the DHCP server (e.g., how
-       long a lease dhcpd  will  give  out),  or  specify  client
-       parameters that are not optional in the DHCP protocol (for
-       example, server-name and filename).
-
-       In Figure  1,  each  host  had  _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs.
-       These  could  include  such things as the _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option,
-       the name of a file to upload (the _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\b)  _\ba_\bn_\bd
-       _\bt_\bh_\be  _\ba_\bd_\bd_\br_\be_\bs_\bs  _\bo_\bf  _\bt_\bh_\be _\bs_\be_\br_\bv_\be_\br _\bf_\br_\bo_\bm _\bw_\bh_\bi_\bc_\bh _\bt_\bo _\bu_\bp_\bl_\bo_\ba_\bd _\bt_\bh_\be _\bf_\bi_\bl_\be
-       _\b(_\bt_\bh_\be _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br parameter).   In general,  any  parameter
-       can  appear anywhere that parameters are allowed, and will
-       be applied according to the scope in which  the  parameter
-       appears.
-
-
-
-
-                                                                4
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       Imagine  that  you  have a site with a lot of NCD X-Termi-
-       nals.   These terminals come in a variety of  models,  and
-       you  want to specify the boot files for each models.   One
-       way to do this would be to have host declarations for each
-       server and group them by model:
-
-       group {
-         filename "Xncd19r";
-         next-server ncd-booter;
-
-         host ncd1 { hardware ethernet 0:c0:c3:49:2b:57; }
-         host ncd4 { hardware ethernet 0:c0:c3:80:fc:32; }
-         host ncd8 { hardware ethernet 0:c0:c3:22:46:81; }
-       }
-
-       group {
-         filename "Xncd19c";
-         next-server ncd-booter;
-
-         host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
-         host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
-       }
-
-       group {
-         filename "XncdHMX";
-         next-server ncd-booter;
-
-         host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
-         host ncd4 { hardware ethernet 0:c0:c3:91:a7:8; }
-         host ncd8 { hardware ethernet 0:c0:c3:cc:a:8f; }
-       }
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: D\bDE\bEC\bCL\bLA\bAR\bRA\bAT\bTI\bIO\bON\bNS\bS
-       T\bTh\bhe\be _\bs_\be_\br_\bv_\be_\br_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        s\bse\ber\brv\bve\ber\br-\b-i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be;\b;
-
-       The  server-identifier  declaration  must  be used exactly
-       once in each dhcpd.conf file to tell dhcpd what IP address
-       to  use  as its server identifier, as required by the DHCP
-       protocol.   On a machine  with  a  single  interface,  the
-       server  identifier  should  be the primary address of that
-       interface.   On machines  with  multiple  interfaces,  the
-       address  of  one  such  interface  must  be  chosen.   Any
-       address may be chosen, as long as it is the address of one
-       of the interfaces of that machine.
-
-       T\bTh\bhe\be _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        s\bsh\bha\bar\bre\bed\bd-\b-n\bne\bet\btw\bwo\bor\brk\bk _\bn_\ba_\bm_\be {\b{
-          [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
-          [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
-        }\b}
-
-
-
-
-                                                                5
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       The  _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk  statement  is used to inform the DHCP
-       server that some IP subnets actually share the same physi-
-       cal  network.   Any  subnets in a shared network should be
-       declared within a  _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk  statement.   Parameters
-       specified  in  the  _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk  statement will be used
-       when booting clients on those  subnets  unless  parameters
-       provided  at  the  subnet or host level override them.  If
-       any subnet in a shared network has addresses available for
-       dynamic  allocation,  those addresses are collected into a
-       common pool  for  that  shared  network  and  assigned  to
-       clients  as  needed.   There  is  no way to distinguish on
-       which subnet of a shared network a client should boot.
-
-       _\bN_\ba_\bm_\be should be the name of the shared network.   This name
-       is  used when printing debugging messages, so it should be
-       descriptive for the shared network.   The  name  may  have
-       the  syntax of a valid domain name (although it will never
-       be used as  such),  or  it  may  be  any  arbitrary  name,
-       enclosed in quotes.
-
-       T\bTh\bhe\be _\bs_\bu_\bb_\bn_\be_\bt s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        s\bsu\bub\bbn\bne\bet\bt _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bn_\bu_\bm_\bb_\be_\br n\bne\bet\btm\bma\bas\bsk\bk _\bn_\be_\bt_\bm_\ba_\bs_\bk {\b{
-          [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
-          [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
-        }\b}
-
-       The  _\bs_\bu_\bb_\bn_\be_\bt statement is used to provide dhcpd with enough
-       information to tell whether or not an  IP  address  is  on
-       that  subnet.   It may also be used to provide subnet-spe-
-       cific parameters and to  specify  what  addresses  may  be
-       dynamically  allocated  to clients booting on that subnet.
-       Such addresses are specified using the _\br_\ba_\bn_\bg_\be  declaration.
-
-       The  _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bn_\bu_\bm_\bb_\be_\br  should be an IP address or domain name
-       which resolves to the subnet number of  the  subnet  being
-       described.   The _\bn_\be_\bt_\bm_\ba_\bs_\bk should be an IP address or domain
-       name which resolves to the subnet mask of the subnet being
-       described.   The subnet number, together with the netmask,
-       are sufficient to determine whether any given  IP  address
-       is on the specified subnet.
-
-       Although  a netmask must be given with every subnet decla-
-       ration, it is recommended that if there is any variance in
-       subnet  masks at a site, a subnet-mask option statement be
-       used in each subnet declaration to set the desired  subnet
-       mask, since any subnet-mask option statement will override
-       the subnet mask declared in the subnet statement.
-
-       T\bTh\bhe\be _\br_\ba_\bn_\bg_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        r\bra\ban\bng\bge\be [ d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp ] _\bl_\bo_\bw_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [ _\bh_\bi_\bg_\bh_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs];\b;
-
-       For  any  subnet  on  which  addresses  will  be  assigned
-
-
-
-                                                                6
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       dynamically,  there  must be at least one _\br_\ba_\bn_\bg_\be statement.
-       The range  statement  gives  the  lowest  and  highest  IP
-       addresses  in  a  range.    All  IP addresses in the range
-       should be in the subnet in which the  _\br_\ba_\bn_\bg_\be  statement  is
-       declared.    The  _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp  flag  may be specified if
-       addresses  in  the  specified  range  may  be  dynamically
-       assigned  to BOOTP clients as well as DHCP clients.   When
-       specifying a single address, _\bh_\bi_\bg_\bh_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs can be  omitted.
-
-       T\bTh\bhe\be _\bh_\bo_\bs_\bt s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        h\bho\bos\bst\bt _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be {
-          [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
-          [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
-        }\b}
-
-       There  must be at least one h\bho\bos\bst\bt statement for every BOOTP
-       client that is to be served.  h\bho\bos\bst\bt statements may also  be
-       specified  for DHCP clients, although this is not required
-       unless booting is only enabled for known hosts.
-
-       If it is desirable to be able to  boot  a  DHCP  or  BOOTP
-       client  on more than one subnet with fixed addresses, more
-       than one address may be  specified  in  the  _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
-       parameter,  or  more than one h\bho\bos\bst\bt statement may be speci-
-       fied.
-
-       If client-specific boot parameters must  change  based  on
-       the network to which the client is attached, then multiple
-       h\bho\bos\bst\bt statements should be used.
-
-       If a client is to be booted using a fixed address if  it's
-       possible, but should be allocated a dynamic address other-
-       wise, then a h\bho\bos\bst\bt statement must be  specified  without  a
-       f\bfi\bix\bxe\bed\bd-\b-a\bad\bdd\bdr\bre\bes\bss\bs clause.  _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be should be a name identify-
-       ing the host.  If a _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option is not  specified  for
-       the host, _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be is used.
-
-       _\bH_\bo_\bs_\bt  declarations  are  matched  to  actual DHCP or BOOTP
-       clients  by  matching  the  dhcp-client-identifier  option
-       specified  in  the _\bh_\bo_\bs_\bt declaration to the one supplied by
-       the client, or, if the _\bh_\bo_\bs_\bt declaration or the client does
-       not  provide  a dhcp-client-identifier option, by matching
-       the _\bh_\ba_\br_\bd_\bw_\ba_\br_\be parameter in the _\bh_\bo_\bs_\bt declaration to the net-
-       work  hardware  address  supplied  by  the client.   BOOTP
-       clients do not normally provide a  _\bd_\bh_\bc_\bp_\b-_\bc_\bl_\bi_\be_\bn_\bt_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br,
-       so  the hardware address must be used for all clients that
-       may boot using the BOOTP protocol.
-
-       T\bTh\bhe\be _\bg_\br_\bo_\bu_\bp s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        g\bgr\bro\bou\bup\bp {
-          [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
-          [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
-
-
-
-                                                                7
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-        }\b}
-
-       The group statement is used simply to apply  one  or  more
-       parameters to a group of declarations.   It can be used to
-       group hosts,  shared  networks,  subnets,  or  even  other
-       groups.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: A\bAL\bLL\bLO\bOW\bW a\ban\bnd\bd D\bDE\bEN\bNY\bY
-       The  _\ba_\bl_\bl_\bo_\bw  and _\bd_\be_\bn_\by statements can be used to control the
-       behaviour of dhcpd to various sorts of requests.
-
-
-       T\bTh\bhe\be _\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b-_\bc_\bl_\bi_\be_\bn_\bt_\bs k\bke\bey\byw\bwo\bor\brd\bd
-
-        a\bal\bll\blo\bow\bw u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs;\b;
-        d\bde\ben\bny\by u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs;\b;
-
-       The u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs flag is used to tell dhcpd whether  or
-       not  to  dynamically  assign addresses to unknown clients.
-       Dynamic address assignment to unknown clients  is  a\bal\bll\blo\bow\bwed
-       by default.
-
-       T\bTh\bhe\be _\bb_\bo_\bo_\bt_\bp k\bke\bey\byw\bwo\bor\brd\bd
-
-        a\bal\bll\blo\bow\bw b\bbo\boo\bot\btp\bp;\b;
-        d\bde\ben\bny\by b\bbo\boo\bot\btp\bp;\b;
-
-       The  u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs flag is used to tell dhcpd whether or
-       not to  respond  to  bootp  queries.   Bootp  queries  are
-       a\bal\bll\blo\bow\bwed by default.
-
-       T\bTh\bhe\be _\bb_\bo_\bo_\bt_\bi_\bn_\bg k\bke\bey\byw\bwo\bor\brd\bd
-
-        a\bal\bll\blo\bow\bw b\bbo\boo\bot\bti\bin\bng\bg;\b;
-        d\bde\ben\bny\by b\bbo\boo\bot\bti\bin\bng\bg;\b;
-
-       The  b\bbo\boo\bot\bti\bin\bng\bg  flag is used to tell dhcpd whether or not to
-       respond to queries from a particular client.  This keyword
-       only  has  meaning  when it appears in a host declaration.
-       By default, booting is a\bal\bll\blo\bow\bwed, but if it is disabled  for
-       a  particular client, then that client will not be able to
-       get and address from the DHCP server.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS
-       T\bTh\bhe\be _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bt_\bi_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        d\bde\bef\bfa\bau\bul\blt\bt-\b-l\ble\bea\bas\bse\be-\b-t\bti\bim\bme\be _\bt_\bi_\bm_\be;\b;
-
-       _\bT_\bi_\bm_\be should be the length in seconds that will be assigned
-       to a lease if the client requesting the lease does not ask
-       for a specific expiration time.
-
-       T\bTh\bhe\be _\bm_\ba_\bx_\b-_\bl_\be_\ba_\bs_\be_\b-_\bt_\bi_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-
-
-
-                                                                8
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-        m\bma\bax\bx-\b-l\ble\bea\bas\bse\be-\b-t\bti\bim\bme\be _\bt_\bi_\bm_\be;\b;
-
-       _\bT_\bi_\bm_\be should be the maximum length in seconds that will  be
-       assigned  to  a  lease  if the client requesting the lease
-       asks for a specific expiration time.
-
-       T\bTh\bhe\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        h\bha\bar\brd\bdw\bwa\bar\bre\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\bt_\by_\bp_\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
-       In order for a BOOTP client to be recognized, its  network
-       hardware  address must be declared using a _\bh_\ba_\br_\bd_\bw_\ba_\br_\be clause
-       in the _\bh_\bo_\bs_\bt statement.  _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\bt_\by_\bp_\be must be the name  of
-       a  physical hardware interface type.   Currently, only the
-       e\bet\bth\bhe\ber\brn\bne\bet\bt type is recognized, although support  for  t\bto\bok\bke\ben\bn-\b-
-       r\bri\bin\bng\bg and f\bfd\bdd\bdi\bi hardware types would also be desirable.  The
-       _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs should be a  set  of  hexadecimal  octets
-       (numbers  from  0  through  ff) seperated by colons.   The
-       _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\bf_\bR _\bs_\bt_\ba_\bt_\be_\bm_\be_\bn_\bt _\bm_\ba_\by _\ba_\bl_\bs_\bo _\bb_\be _\bu_\bs_\be_\bd _\bf_\bo_\br _\bD_\bH_\bC_\bP _\bc_\bl_\bi_\be_\bn_\bt_\bs_\b.
-
-       T\bTh\bhe\be _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        f\bfi\bil\ble\ben\bna\bam\bme\be "\b"_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be"\b";\b;
-
-       The _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be statement can be used to specify the name  of
-       the  initial  boot file which is to be loaded by a client.
-       The _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be should be a filename recognizable to whatever
-       file  transfer  protocol the client can be expected to use
-       to load the file.
-
-       T\bTh\bhe\be _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be "\b"_\bn_\ba_\bm_\be"\b";\b;
-
-       The _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be statement can be used to inform the client
-       of the name of the server from which it is booting.   _\bN_\ba_\bm_\be
-       should be the name that will be provided to the client.
-
-       T\bTh\bhe\be _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        n\bne\bex\bxt\bt-\b-s\bse\ber\brv\bve\ber\br _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be;\b;
-
-       The _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br statement is  used  to  specify  the  host
-       address  of  the  server  from which the initial boot file
-       (specified in the _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be statement)  is  to  be  loaded.
-       _\bS_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be  should  be  a  numeric IP address or a domain
-       name.   If no _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br parameter  applies  to  a  given
-       client,  the  address  specified  in the _\bs_\be_\br_\bv_\be_\br_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br
-       statement is used.
-
-       T\bTh\bhe\be _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        f\bfi\bix\bxe\bed\bd-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-
-
-
-                                                                9
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       The _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs statement is used to assign one or  more
-       fixed  IP addresses to a client.  It should only appear in
-       a _\bh_\bo_\bs_\bt declaration.  If more than one address is supplied,
-       then  when  the  client  boots,  it  will  be assigned the
-       address which corresponds to the network on  which  it  is
-       booting.   If  none  of the addresses in the _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
-       statement are on the network on which the client is  boot-
-       ing,  that client will not match the _\bh_\bo_\bs_\bt declaration con-
-       taining that _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs statement.  Each _\ba_\bd_\bd_\br_\be_\bs_\bs should
-       be either an IP address or a domain name which resolves to
-       one or more IP addresses.
-
-       T\bTh\bhe\be _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bc_\bu_\bt_\bo_\bf_\bf s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp-\b-l\ble\bea\bas\bse\be-\b-c\bcu\but\bto\bof\bff\bf _\bd_\ba_\bt_\be;\b;
-
-       The _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bc_\bu_\bt_\bo_\bf_\bf statement sets  the  ending
-       time for all leases assigned dynamically to BOOTP clients.
-       Because BOOTP clients do not  have  any  way  of  renewing
-       leases,  and don't know that their leases could expire, by
-       default  dhcpd  assignes  infinite  leases  to  all  BOOTP
-       clients.  However, it may make sense in some situations to
-       set a cutoff date for all BOOTP leases - for example,  the
-       end of a school term, or the time at night when a facility
-       is closed and all machines are required to be powered off.
-
-       _\bD_\ba_\bt_\be should be the date on which all assigned BOOTP leases
-       will end.  The date is specified in the form:
-
-                         W YYYY/MM/DD HH:MM:SS
-
-       W is the day of the week expressed as a number  from  zero
-       (Sunday)  to  six (Saturday).  YYYY is the year, including
-       the century.  MM is the month expressed as a number from 1
-       to  12.   DD is the day of the month, counting from 1.  HH
-       is the hour, from zero to 23.  MM is the minute and SS  is
-       the  second.   The  time  is always in Greenwich Mean Time
-       (GMT), not local time.
-
-       T\bTh\bhe\be _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bl_\be_\bn_\bg_\bt_\bh s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp-\b-l\ble\bea\bas\bse\be-\b-l\ble\ben\bng\bgt\bth\bh _\bl_\be_\bn_\bg_\bt_\bh;\b;
-
-       The _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bl_\be_\bn_\bg_\bt_\bh statement is  used  to  set
-       the   length  of  leases  dynamically  assigned  to  BOOTP
-       clients.   At some sites, it may  be  possible  to  assume
-       that  a  lease  is  no longer in use if its holder has not
-       used BOOTP or DHCP to get its  address  within  a  certain
-       time period.   The period is specified in _\bl_\be_\bn_\bg_\bt_\bh as a num-
-       ber of seconds.   If a client reboots using  BOOTP  during
-       the timeout period, the lease duration is reset to _\bl_\be_\bn_\bg_\bt_\bh,
-       so a BOOTP client that boots frequently enough will  never
-       lose its lease.  Needless to say, this parameter should be
-       adjusted with extreme caution.
-
-
-
-                                                               10
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       T\bTh\bhe\be _\bg_\be_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        g\bge\bet\bt-\b-l\ble\bea\bas\bse\be-\b-h\bho\bos\bst\btn\bna\bam\bme\bes\bs _\bf_\bl_\ba_\bg;\b;
-
-       The _\bg_\be_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be_\bs statement is used  to  tell  dhcpd
-       whether or not to look up the domain name corresponding to
-       the IP address of each address in the lease pool  and  use
-       that  address  for  the  DHCP _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option.  If _\bf_\bl_\ba_\bg is
-       true, then this lookup is done for all  addresses  in  the
-       current  scope.    By  default,  or  if  _\bf_\bl_\ba_\bg is false, no
-       lookups are done.
-
-       T\bTh\bhe\be _\bu_\bs_\be_\b-_\bh_\bo_\bs_\bt_\b-_\bd_\be_\bc_\bl_\b-_\bn_\ba_\bm_\be_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-        u\bus\bse\be-\b-h\bho\bos\bst\bt-\b-d\bde\bec\bcl\bl-\b-n\bna\bam\bme\bes\bs _\bf_\bl_\ba_\bg;\b;
-
-       If the _\bu_\bs_\be_\b-_\bh_\bo_\bs_\bt_\b-_\bd_\be_\bc_\bl_\b-_\bn_\ba_\bm_\be_\bs parameter is true  in  a  given
-       scope,  then for every host declaration within that scope,
-       the name provided for the host declaration  will  be  sup-
-       plied to the client as its hostname.   So, for example,
-
-           group {
-             use-host-decl-names on;
-
-             host joe {
-            hardware ethernet 08:00:2b:4c:29:32;
-            fixed-address joe.fugue.com;
-             }
-           }
-
-       is equivalent to
-
-             host joe {
-            hardware ethernet 08:00:2b:4c:29:32;
-            fixed-address joe.fugue.com;
-               option host-name "joe";
-             }
-
-       An  _\bo_\bp_\bt_\bi_\bo_\bn  _\bh_\bo_\bs_\bt_\b-_\bn_\ba_\bm_\be  statement within a host declaration
-       will override the use of the name in the host declaration.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: O\bOP\bPT\bTI\bIO\bON\bN S\bST\bTA\bAT\bTE\bEM\bME\bEN\bNT\bTS\bS
-       DHCP  _\bo_\bp_\bt_\bi_\bo_\bn  statements always start with the _\bo_\bp_\bt_\bi_\bo_\bn key-
-       word, followed by an option name, followed by option data.
-       The  option  names  and  data formats are described below.
-       It is not  necessary  to  exhaustively  specify  all  DHCP
-       options  -  only those options which are needed by clients
-       must be specified.
-
-       Option data comes in a  variety  of  formats,  as  defined
-       below:
-
-       The  i\bip\bp-\b-a\bad\bdd\bdr\bre\bes\bss\bs  data  type  can  be  entered either as an
-       explicit IP address (e.g., 239.254.197.10) or as a  domain
-
-
-
-                                                               11
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       name (e.g., haagen.isc.org).  When entering a domain name,
-       be sure that that domain name  resolves  to  a  single  IP
-       address.
-
-       The  i\bin\bnt\bt3\b32\b2  data  type  specifies a signed 32-bit integer.
-       The u\bui\bin\bnt\bt3\b32\b2 data type specifies an unsigned 32-bit integer.
-       The  i\bin\bnt\bt1\b16\b6  and  u\bui\bin\bnt\bt1\b16\b6  data  types  specify  signed  and
-       unsigned 16-bit integers.   The i\bin\bnt\bt8\b8 and u\bui\bin\bnt\bt8\b8 data  types
-       specify  signed  and  unsigned  8-bit  integers.  Unsigned
-       8-bit integers are also sometimes referred to as octets.
-
-       The s\bst\btr\bri\bin\bng\bg data type specifies an NVT ASCII string,  which
-       must  be enclosed in double quotes - for example, to spec-
-       ify a domain-name option, the syntax would be
-
-            option domain-name "isc.org";
-
-       The f\bfl\bla\bag\bg data type specifies a boolean  value.    Booleans
-       can  be  either true or false (or on or off, if that makes
-       more sense to you).
-
-       The d\bda\bat\bta\ba-\b-s\bst\btr\bri\bin\bng\bg data type specifies either  an  NVT  ASCII
-       string  enclosed  in  double quotes, or a series of octets
-       specified in hexadecimal, seperated by colons.   For exam-
-       ple:
-
-            option client-identifier "CLIENT-FOO";
-       or
-            option client-identifier 43:4c:49:45:54:2d:46:4f:4f;
-
-       The  documentation for the various options mentioned below
-       is taken from the  latest  IETF  draft  document  on  DHCP
-       options.    Options  which  are  not listed by name may be
-       defined by the name option-_\bn_\bn_\bn, where _\bn_\bn_\bn _\bi_\bs  _\bt_\bh_\be  _\bd_\be_\bc_\bi_\bm_\ba_\bl
-       _\bn_\bu_\bm_\bb_\be_\br _\bo_\bf _\bt_\bh_\be _\bo_\bp_\bt_\bi_\bo_\bn _\bc_\bo_\bd_\be_\b.   _\bT_\bh_\be_\bs_\be _\bo_\bp_\bt_\bi_\bo_\bn_\bs _\bm_\ba_\by _\bb_\be _\bf_\bo_\bl_\bl_\bo_\bw_\be_\bd
-       _\be_\bi_\bt_\bh_\be_\br _\bb_\by _\ba _\bs_\bt_\br_\bi_\bn_\bg_\b, _\be_\bn_\bc_\bl_\bo_\bs_\be_\bd _\bi_\bn _\bq_\bu_\bo_\bt_\be_\bs_\b, _\bo_\br _\bb_\by _\ba _\bs_\be_\br_\bi_\be_\bs  _\bo_\bf
-       _\bo_\bc_\bt_\be_\bt_\bs_\b,  _\be_\bx_\bp_\br_\be_\bs_\bs_\be_\bd _\ba_\bs _\bt_\bw_\bo_\b-_\bd_\bi_\bg_\bi_\bt _\bh_\be_\bx_\ba_\bd_\be_\bc_\bi_\bm_\ba_\bl _\bn_\bu_\bm_\bb_\be_\br_\bs _\bs_\be_\bp_\be_\br_\b-
-       _\ba_\bt_\be_\bd _\bb_\by _\bc_\bo_\bl_\bo_\bn_\bs_\b.   _\bF_\bo_\br _\be_\bx_\ba_\bm_\bp_\bl_\be_\b:
-
-            option option-133 "my-option-133-text";
-            option option-129 1:54:c9:2b:47;
-
-       Because dhcpd does not know the format of these  undefined
-       option  codes,  no checking is done to ensure the correct-
-       ness of the entered data.
-
-       The standard options are:
-
-        o\bop\bpt\bti\bio\bon\bn s\bsu\bub\bbn\bne\bet\bt-\b-m\bma\bas\bsk\bk _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
-       The subnet mask option specifies the client's subnet  mask
-       as per RFC 950.  If no subnet mask option is provided any-
-       where in scope, as a last resort dhcpd will use the subnet
-       mask  from the subnet declaration for the network on which
-
-
-
-                                                               12
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       an address is being assigned.   However,  _\ba_\bn_\by  subnet-mask
-       option  declaration that is in scope for the address being
-       assigned will override the subnet mask  specified  in  the
-       subnet declaration.
-
-        o\bop\bpt\bti\bio\bon\bn t\bti\bim\bme\be-\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\b3_\b2;\b;
-
-       The   time-offset  option  specifies  the  offset  of  the
-       client's subnet in seconds from Coordinated Universal Time
-       (UTC).
-
-        o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  routers  option  specifies a list of IP addresses for
-       routers on the client's subnet.  Routers should be  listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn t\bti\bim\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\b[_\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  time-server  option  specifies a list of RFC 868 time
-       servers available to the client.  Servers should be listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];
-
-       The  name-servers  option specifies a list of IEN 116 name
-       servers available to the client.  Servers should be listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn  d\bdo\bom\bma\bai\bin\bn-\b-n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs  _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ...
-       ];\b;
-
-       The domain-name-servers option specifies a list of  Domain
-       Name  System  (STD 13, RFC 1035) name servers available to
-       the client.  Servers should be listed in order of  prefer-
-       ence.
-
-        o\bop\bpt\bti\bio\bon\bn l\blo\bog\bg-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  log-server option specifies a list of MIT-LCS UDP log
-       servers available to the client.  Servers should be listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn c\bco\boo\bok\bki\bie\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  cookie  server  option  specifies  a  list of RFC 865
-       cookie servers available to the client.  Servers should be
-       listed in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn l\blp\bpr\br-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs  [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  LPR  server  option specifies a list of RFC 1179 line
-       printer servers available to the client.   Servers  should
-       be listed in order of preference.
-
-
-
-                                                               13
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-        o\bop\bpt\bti\bio\bon\bn i\bim\bmp\bpr\bre\bes\bss\bs-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  impress-server  option  specifies  a  list  of Imagen
-       Impress servers available to the client.   Servers  should
-       be listed in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn r\bre\bes\bso\bou\bur\brc\bce\be-\b-l\blo\boc\bca\bat\bti\bio\bon\bn-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
-       ... ];\b;
-
-       This option specifies a list of RFC 887 Resource  Location
-       servers available to the client.  Servers should be listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn h\bho\bos\bst\bt-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       This option specifies the name of the  client.   The  name
-       may or may not be qualified with the local domain name (it
-       is preferable to use the domain-name option to specify the
-       domain  name).   See  RFC  1035 for character set restric-
-       tions.
-
-        o\bop\bpt\bti\bio\bon\bn b\bbo\boo\bot\bt-\b-s\bsi\biz\bze\be _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
-       This option specifies the length in  512-octet  blocks  of
-       the default boot image for the client.
-
-        o\bop\bpt\bti\bio\bon\bn m\bme\ber\bri\bit\bt-\b-d\bdu\bum\bmp\bp _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       This option specifies the path-name of a file to which the
-       client's core image should be  dumped  in  the  event  the
-       client  crashes.   The  path  is  formatted as a character
-       string consisting of characters from the NVT ASCII charac-
-       ter set.
-
-        o\bop\bpt\bti\bio\bon\bn d\bdo\bom\bma\bai\bin\bn-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       This  option  specifies the domain name that client should
-       use when resolving hostnames via the Domain Name System.
-
-        o\bop\bpt\bti\bio\bon\bn s\bsw\bwa\bap\bp-\b-s\bse\ber\brv\bve\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
-       This specifies the IP address of the client's swap server.
-
-        o\bop\bpt\bti\bio\bon\bn r\bro\boo\bot\bt-\b-p\bpa\bat\bth\bh _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       This  option  specifies  the  path-name  that contains the
-       client's root disk.  The path is formatted as a  character
-       string consisting of characters from the NVT ASCII charac-
-       ter set.
-
-        o\bop\bpt\bti\bio\bon\bn i\bip\bp-\b-f\bfo\bor\brw\bwa\bar\brd\bdi\bin\bng\bg _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether the client should  configure
-       its  IP  layer  for packet forwarding.  A value of 0 means
-
-
-
-                                                               14
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       disable IP forwarding, and a value of 1  means  enable  IP
-       forwarding.
-
-        o\bop\bpt\bti\bio\bon\bn n\bno\bon\bn-\b-l\blo\boc\bca\bal\bl-\b-s\bso\bou\bur\brc\bce\be-\b-r\bro\bou\but\bti\bin\bng\bg _\bf_\bl_\ba_\bg;\b;
-
-       This  option specifies whether the client should configure
-       its IP layer to allow forwarding of  datagrams  with  non-
-       local  source  routes (see Section 3.3.5 of [4] for a dis-
-       cussion of this topic).  A value of 0 means disallow  for-
-       warding  of  such  datagrams, and a value of 1 means allow
-       forwarding.
-
-        o\bop\bpt\bti\bio\bon\bn p\bpo\bol\bli\bic\bcy\by-\b-f\bfi\bil\blt\bte\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b,  _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
-       _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       This  option specifies policy filters for non-local source
-       routing.  The filters consist of a list  of  IP  addresses
-       and  masks which specify destination/mask pairs with which
-       to filter incoming source routes.
-
-       Any source routed datagram whose next-hop address does not
-       match  one  of  the  filters  should  be  discarded by the
-       client.
-
-       See STD 3 (RFC1122) for further information.
-
-        o\bop\bpt\bti\bio\bon\bn m\bma\bax\bx-\b-d\bdg\bgr\bra\bam\bm-\b-r\bre\bea\bas\bss\bse\bem\bmb\bbl\bly\by _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
-       This option specifies the maximum size datagram  that  the
-       client  should  be  prepared  to  reassemble.  The minimum
-       value legal value is 576.
-
-        o\bop\bpt\bti\bio\bon\bn d\bde\bef\bfa\bau\bul\blt\bt-\b-i\bip\bp-\b-t\btt\btl\bl _\bu_\bi_\bn_\bt_\b8_\b;
-
-       This option specifies the default  time-to-live  that  the
-       client should use on outgoing datagrams.
-
-        o\bop\bpt\bti\bio\bon\bn p\bpa\bat\bth\bh-\b-m\bmt\btu\bu-\b-a\bag\bgi\bin\bng\bg-\b-t\bti\bim\bme\beo\bou\but\bt _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
-       This option specifies the timeout (in seconds) to use when
-       aging Path MTU values discovered by the mechanism  defined
-       in RFC 1191.
-
-        o\bop\bpt\bti\bio\bon\bn p\bpa\bat\bth\bh-\b-m\bmt\btu\bu-\b-p\bpl\bla\bat\bte\bea\bau\bu-\b-t\bta\bab\bbl\ble\be _\bu_\bi_\bn_\bt_\b1_\b6 [,\b, _\bu_\bi_\bn_\bt_\b1_\b6 ... ];\b;
-
-       This  option  specifies  a  table of MTU sizes to use when
-       performing Path MTU Discovery as defined in RFC 1191.  The
-       table  is formatted as a list of 16-bit unsigned integers,
-       ordered from smallest to largest.  The minimum  MTU  value
-       cannot be smaller than 68.
-
-        o\bop\bpt\bti\bio\bon\bn i\bin\bnt\bte\ber\brf\bfa\bac\bce\be-\b-m\bmt\btu\bu _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
-       This  option  specifies  the MTU to use on this interface.
-
-
-
-                                                               15
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       The minimum legal value for the MTU is 68.
-
-        o\bop\bpt\bti\bio\bon\bn a\bal\bll\bl-\b-s\bsu\bub\bbn\bne\bet\bts\bs-\b-l\blo\boc\bca\bal\bl _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether or not the client may assume
-       that  all subnets of the IP network to which the client is
-       connected use the same MTU as the subnet of  that  network
-       to  which  the client is directly connected.  A value of 1
-       indicates that all subnets share the same MTU.  A value of
-       0 means that the client should assume that some subnets of
-       the directly connected network may have smaller MTUs.
-
-        o\bop\bpt\bti\bio\bon\bn b\bbr\bro\boa\bad\bdc\bca\bas\bst\bt-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
-       This option specifies the broadcast address in use on  the
-       client's subnet.  Legal values for broadcast addresses are
-       specified in section 3.2.1.3 of STD 3 (RFC1122).
-
-        o\bop\bpt\bti\bio\bon\bn p\bpe\ber\brf\bfo\bor\brm\bm-\b-m\bma\bas\bsk\bk-\b-d\bdi\bis\bsc\bco\bov\bve\ber\bry\by _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether or  not  the  client  should
-       perform  subnet  mask  discovery using ICMP.  A value of 0
-       indicates that the client should not perform mask  discov-
-       ery.   A  value  of 1 means that the client should perform
-       mask discovery.
-
-        o\bop\bpt\bti\bio\bon\bn m\bma\bas\bsk\bk-\b-s\bsu\bup\bpp\bpl\bli\bie\ber\br _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether or  not  the  client  should
-       respond  to subnet mask requests using ICMP.  A value of 0
-       indicates that the client should not respond.  A value  of
-       1 means that the client should respond.
-
-        o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\br-\b-d\bdi\bis\bsc\bco\bov\bve\ber\bry\by _\bf_\bl_\ba_\bg;\b;
-
-       This  option  specifies  whether  or not the client should
-       solicit  routers  using  the  Router  Discovery  mechanism
-       defined  in  RFC  1256.   A  value of 0 indicates that the
-       client should not perform router discovery.  A value of  1
-       means that the client should perform router discovery.
-
-        o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\br-\b-s\bso\bol\bli\bic\bci\bit\bta\bat\bti\bio\bon\bn-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
-       This  option  specifies  the  address  to which the client
-       should transmit router solicitation requests.
-
-        o\bop\bpt\bti\bio\bon\bn s\bst\bta\bat\bti\bic\bc-\b-r\bro\bou\but\bte\bes\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b,  _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
-       _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       This  option  specifies  a  list of static routes that the
-       client should install in its routing cache.   If  multiple
-       routes  to  the  same  destination are specified, they are
-       listed in descending order of priority.
-
-
-
-
-                                                               16
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       The routes consist of a list of  IP  address  pairs.   The
-       first  address  is the destination address, and the second
-       address is the router for the destination.
-
-       The default route (0.0.0.0) is an illegal destination  for
-       a  static  route.   To  specify the default route, use the
-       r\bro\bou\but\bte\ber\brs\bs option.
-
-        o\bop\bpt\bti\bio\bon\bn t\btr\bra\bai\bil\ble\ber\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bti\bio\bon\bn _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether or  not  the  client  should
-       negotiate  the  use  of trailers (RFC 893 [14]) when using
-       the ARP protocol.  A value of 0 indicates that the  client
-       should  not  attempt  to use trailers.  A value of 1 means
-       that the client should attempt to use trailers.
-
-        o\bop\bpt\bti\bio\bon\bn a\bar\brp\bp-\b-c\bca\bac\bch\bhe\be-\b-t\bti\bim\bme\beo\bou\but\bt _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
-       This option specifies the timeout in seconds for ARP cache
-       entries.
-
-        o\bop\bpt\bti\bio\bon\bn i\bie\bee\bee\be8\b80\b02\b2-\b-3\b3-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bti\bio\bon\bn _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies whether or not the client should use
-       Ethernet Version 2 (RFC 894)  or  IEEE  802.3  (RFC  1042)
-       encapsulation if the interface is an Ethernet.  A value of
-       0 indicates that the client should use RFC 894  encapsula-
-       tion.   A  value of 1 means that the client should use RFC
-       1042 encapsulation.
-
-        o\bop\bpt\bti\bio\bon\bn d\bde\bef\bfa\bau\bul\blt\bt-\b-t\btc\bcp\bp-\b-t\btt\btl\bl _\bu_\bi_\bn_\bt_\b8;\b;
-
-       This option specifies the  default  TTL  that  the  client
-       should  use  when sending TCP segments.  The minimum value
-       is 1.
-
-        o\bop\bpt\bti\bio\bon\bn t\btc\bcp\bp-\b-k\bke\bee\bep\bpa\bal\bli\biv\bve\be-\b-i\bin\bnt\bte\ber\brv\bva\bal\bl _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
-       This option specifies the interval (in seconds)  that  the
-       client  TCP should wait before sending a keepalive message
-       on a TCP connection.  The time is specified  as  a  32-bit
-       unsigned  integer.   A  value  of  zero indicates that the
-       client should not generate keepalive messages  on  connec-
-       tions unless specifically requested by an application.
-
-        o\bop\bpt\bti\bio\bon\bn t\btc\bcp\bp-\b-k\bke\bee\bep\bpa\bal\bli\biv\bve\be-\b-g\bga\bar\brb\bba\bag\bge\be _\bf_\bl_\ba_\bg;\b;
-
-       This option specifies the whether or not the client should
-       send TCP keepalive messages with a octet  of  garbage  for
-       compatibility  with  older  implementations.  A value of 0
-       indicates that a garbage octet should not be sent. A value
-       of 1 indicates that a garbage octet should be sent.
-
-        o\bop\bpt\bti\bio\bon\bn n\bni\bis\bs-\b-d\bdo\bom\bma\bai\bin\bn _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-
-
-                                                               17
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       This  option  specifies  the name of the client's NIS (Sun
-       Network Information Services) domain.  The domain is  for-
-       matted as a character string consisting of characters from
-       the NVT ASCII character set.
-
-        o\bop\bpt\bti\bio\bon\bn n\bni\bis\bs-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       This option specifies a list of  IP  addresses  indicating
-       NIS  servers  available  to the client.  Servers should be
-       listed in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn n\bnt\btp\bp-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       This option specifies a list of  IP  addresses  indicating
-       NTP  (RFC  1035) servers available to the client.  Servers
-       should be listed in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs  ...
-       ];\b;
-
-       The  NetBIOS name server (NBNS) option specifies a list of
-       RFC 1001/1002 NBNS name servers listed in order of prefer-
-       ence.
-
-        o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-d\bdd\bd-\b-s\bse\ber\brv\bve\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       The  NetBIOS  datagram  distribution  server (NBDD) option
-       specifies a list of RFC 1001/1002 NBDD servers  listed  in
-       order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-n\bno\bod\bde\be-\b-t\bty\byp\bpe\be _\bu_\bi_\bn_\bt_\b8;\b;
-
-       The  NetBIOS  node  type option allows NetBIOS over TCP/IP
-       clients  which  are  configurable  to  be  configured   as
-       described  in  RFC 1001/1002.  The value is specified as a
-       single octet which identifies the client type.  A value of
-       1  corresponds  to  a  NetBIOS B-node; a value of 2 corre-
-       sponds to a P-node; a value of 4 corresponds to an M-node;
-       a value of 8 corresponds to an H-node.
-
-        o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-s\bsc\bco\bop\bpe\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       The NetBIOS scope option specifies the NetBIOS over TCP/IP
-       scope  parameter  for  the  client  as  specified  in  RFC
-       1001/1002.  See  RFC1001, RFC1002, and RFC1035 for charac-
-       ter-set restrictions.
-
-        o\bop\bpt\bti\bio\bon\bn f\bfo\bon\bnt\bt-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-       This option specifies a  list  of  X  Window  System  Font
-       servers  available to the client. Servers should be listed
-       in order of preference.
-
-        o\bop\bpt\bti\bio\bon\bn x\bx-\b-d\bdi\bis\bsp\bpl\bla\bay\by-\b-m\bma\ban\bna\bag\bge\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-
-
-                                                               18
-
-
-
-
-
-dhcpd.conf(5)                                       dhcpd.conf(5)
-
-
-       This option specifies a list of systems that  are  running
-       the  X  Window System Display Manager and are available to
-       the client.  Addresses should be listed in order of  pref-
-       erence.
-
-        o\bop\bpt\bti\bio\bon\bn d\bdh\bhc\bcp\bp-\b-c\bcl\bli\bie\ben\bnt\bt-\b-i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br _\bd_\ba_\bt_\ba_\b-_\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-       This option can be used to specify the a DHCP client iden-
-       tifier in a host declaration, so that dhcpd can  find  the
-       host record by matching against the client identifier.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       dhcpd.conf(5),       dhcpd.leases(5),      draft-ietf-dhc-
-       options-1533update-04.txt, draft-ietf-dhc-dhcp-07.txt.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       d\bdh\bhc\bcp\bpd\bd(\b(8\b8)\b) was written by Ted Lemon <mellon@vix.com> under a
-       contract  with  Vixie Labs.   Funding for this project was
-       provided by the Internet Software  Corporation.   Informa-
-       tion  about  the Internet Software Consortium can be found
-       at h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.i\bis\bsc\bc.\b.o\bor\brg\bg/\b/i\bis\bsc\bc.\b.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                               19
-
-