Parser for dhclient config and lease files... */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char copyright[] =
-"$Id: clparse.c,v 1.40 2000/01/25 00:58:02 mellon Exp $ Copyright (c) 1997 The Internet Software Consortium. All rights reserved.\n";
+"$Id: clparse.c,v 1.41 2000/01/26 14:55:26 mellon Exp $ Copyright (c) 1997 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
return;
for (; *p; p = &((*p) -> next))
;
- executable_statement_reference (p, stmt,
- "parse_client_statement");
+ executable_statement_reference (p, stmt, MDL);
stmt -> next = (struct executable_statement *)0;
return;
arbitrarily large, from time to time dhclient creates a new
dhclient.leases file from its in-core lease database. The old version
of the dhclient.leases file is retained under the name
-.IR dhcpd.leases~
+.IR dhclient.leases~
until the next time dhclient rewrites the database.
.PP
Old leases are kept around in case the DHCP server is unavailable when
DHCP Client. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char ocopyright[] =
-"$Id: dhclient.c,v 1.92 2000/01/25 00:58:57 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dhclient.c,v 1.93 2000/01/26 14:55:26 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
int interfaces_requested = 0;
-int log_perror = 1;
-
struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } };
struct iaddr iaddr_any = { 4, { 0, 0, 0, 0 } };
struct in_addr inaddr_any;
u_int16_t local_port;
u_int16_t remote_port;
-int log_priority;
int no_daemon;
int save_scripts;
"[-cf config-file] [interface]");
}
-void cleanup ()
-{
-}
-
struct class *find_class (s)
const char *s;
{
dhclient creates a new dhclient.leases file from its in-
core lease database. The old version of the
dhclient.leases file is retained under the name
- _\bd_\bh_\bc_\bp_\bd_\b._\bl_\be_\ba_\bs_\be_\bs_\b~ until the next time dhclient rewrites the
+ _\bd_\bh_\bc_\bl_\bi_\be_\bn_\bt_\b._\bl_\be_\ba_\bs_\be_\bs_\b~ until the next time dhclient rewrites the
database.
Old leases are kept around in case the DHCP server is
no lease is acquired, the script is used to test predefined leases, if
any, and also called once if no valid lease can be identified. For
more information, see
-.B dhclient-lease(8).
+.B dhclient-script(8).
.PP
\fBmedium "\fImedia setup\fB";\fR
.PP
If no lease is acquired, the script is used to test predeÂ
fined leases, if any, and also called once if no valid
lease can be identified. For more information, see
- d\bdh\bhc\bcl\bli\bie\ben\bnt\bt-\b-l\ble\bea\bas\bse\be(\b(8\b8)\b).\b.
+ d\bdh\bhc\bcl\bli\bie\ben\bnt\bt-\b-s\bsc\bcr\bri\bip\bpt\bt(\b(8\b8)\b).\b.
m\bme\bed\bdi\biu\bum\bm "\b"_\bm_\be_\bd_\bi_\ba _\bs_\be_\bt_\bu_\bp"\b";\b;
SEDMANPAGES = dhcp-options.man5 dhcp-contrib.man5 dhcp-eval.man5
SRC = raw.c parse.c nit.c icmp.c dispatch.c conflex.c upf.c bpf.c socket.c \
lpf.c dlpi.c packet.c tr.c ethernet.c memory.c print.c options.c \
- inet.c convert.c tree.c tables.c hash.c alloc.c errwarn.c \
+ inet.c convert.c tree.c tables.c hash.c alloc.c \
inet_addr.c dns.c resolv.c execute.c discover.c auth.c
OBJ = raw.o parse.o nit.o icmp.o dispatch.o conflex.o upf.o bpf.o socket.o \
lpf.o dlpi.o packet.o tr.o ethernet.o memory.o print.o options.o \
- inet.o convert.o tree.o tables.o hash.o alloc.o errwarn.o \
+ inet.o convert.o tree.o tables.o hash.o alloc.o \
inet_addr.o dns.o resolv.o execute.o discover.o auth.o
MAN = dhcp-options.5 dhcp-contrib.5 dhcp-eval.5
#ifndef lint
static char copyright[] =
-"$Id: alloc.c,v 1.37 2000/01/25 01:02:26 mellon Exp $ Copyright (c) 1995, 1996, 1998 The Internet Software Consortium. All rights reserved.\n";
+"$Id: alloc.c,v 1.38 2000/01/26 14:55:33 mellon Exp $ Copyright (c) 1995, 1996, 1998 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
+#include <omapip/omapip_p.h>
struct dhcp_packet *dhcp_free_list;
struct packet *packet_free_list;
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
-struct dmalloc_preamble *dmalloc_list;
-unsigned long dmalloc_outstanding;
-unsigned long dmalloc_longterm;
-unsigned long dmalloc_generation;
-unsigned long dmalloc_cutoff_generation;
-#endif
-
-#if defined (DEBUG_RC_HISTORY)
-struct rc_history_entry rc_history [RC_HISTORY_MAX];
-int rc_history_index;
-#endif
-
-VOIDPTR dmalloc (size, file, line)
- unsigned size;
- const char *file;
- int line;
-{
- unsigned char *foo = malloc (size + DMDSIZE);
- int i;
- VOIDPTR *bar;
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
- struct dmalloc_preamble *dp;
-#endif
- if (!foo) {
- log_error ("No memory for %s.", name);
- return (VOIDPTR)0;
- }
- bar = (VOIDPTR)(foo + DMDOFFSET);
- memset (bar, 0, size);
-
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
- dp = (struct dmalloc_preamble *)foo;
- dp -> prev = dmalloc_list;
- if (dmalloc_list)
- dmalloc_list -> next = dp;
- dmalloc_list = dp;
- dp -> next = (struct dmalloc_preamble *)0;
- dp -> size = size;
- dp -> file = file;
- dp -> line = line;
- dp -> generation = dmalloc_generation++;
- dmalloc_outstanding += size;
- for (i = 0; i < DMLFSIZE; i++)
- dp -> low_fence [i] =
- (((unsigned long)
- (&dp -> low_fence [i])) % 143) + 113;
- for (i = DMDOFFSET; i < DMDSIZE; i++)
- foo [i + size] =
- (((unsigned long)
- (&foo [i + size])) % 143) + 113;
-#if defined (DEBUG_MALLOC_POOL_EXHAUSTIVELY)
- /* Check _every_ entry in the pool! Very expensive. */
- for (dp = dmalloc_list; dp; dp = dp -> prev) {
- for (i = 0; i < DMLFSIZE; i++) {
- if (dp -> low_fence [i] !=
- (((unsigned long)
- (&dp -> low_fence [i])) % 143) + 113)
- {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
- foo = (unsigned char *)dp;
- for (i = DMDOFFSET; i < DMDSIZE; i++) {
- if (foo [i + dp -> size] !=
- (((unsigned long)
- (&foo [i + dp -> size])) % 143) + 113) {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
- }
-#endif
-#endif
- return bar;
-}
-
-void dfree (ptr, file, line)
- VOIDPTR ptr;
- const char *file;
- int line;
-{
- if (!ptr) {
- log_error ("dfree %s(%d): free on null pointer.", file, line);
- return;
- }
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
- {
- unsigned char *bar = ptr;
- struct dmalloc_preamble *dp, *cur;
- int i;
- bar -= DMDOFFSET;
- cur = (struct dmalloc_preamble *)bar;
- for (dp = dmalloc_list; dp; dp = dp -> prev)
- if (dp == cur)
- break;
- if (!dp) {
- log_error ("%s(%d): freeing unknown memory: %lx",
- dp -> file, dp -> line, (unsigned long)cur);
- abort ();
- }
- if (dp -> prev)
- dp -> prev -> next = dp -> next;
- if (dp -> next)
- dp -> next -> prev = dp -> prev;
- if (dp == dmalloc_list)
- dmalloc_list = dp -> prev;
- if (dp -> generation >= dmalloc_cutoff_generation)
- dmalloc_outstanding -= dp -> size;
- else
- dmalloc_longterm -= dp -> size;
-
- for (i = 0; i < DMLFSIZE; i++) {
- if (dp -> low_fence [i] !=
- (((unsigned long)
- (&dp -> low_fence [i])) % 143) + 113)
- {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
- for (i = DMDOFFSET; i < DMDSIZE; i++) {
- if (bar [i + dp -> size] !=
- (((unsigned long)
- (&bar [i + dp -> size])) % 143) + 113) {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
- ptr = bar;
- }
-#endif
- free (ptr);
-}
-
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
-/* For allocation functions that keep their own free lists, we want to
- account for the reuse of the memory. */
-
-void dmalloc_reuse (foo, file, line, justref)
- VOIDPTR foo;
- const char *file;
- int line;
- int justref;
-{
- struct dmalloc_preamble *dp;
-
- /* Get the pointer to the dmalloc header. */
- dp = foo;
- dp--;
-
- /* If we just allocated this and are now referencing it, this
- function would almost be a no-op, except that it would
- increment the generation count needlessly. So just return
- in this case. */
- if (dp -> generation == dmalloc_generation)
- return;
-
- /* If this is longterm data, and we just made reference to it,
- don't put it on the short-term list or change its name -
- we don't need to know about this. */
- if (dp -> generation < dmalloc_cutoff_generation && justref)
- return;
-
- /* Take it out of the place in the allocated list where it was. */
- if (dp -> prev)
- dp -> prev -> next = dp -> next;
- if (dp -> next)
- dp -> next -> prev = dp -> prev;
- if (dp == dmalloc_list)
- dmalloc_list = dp -> prev;
-
- /* Account for its removal. */
- if (dp -> generation >= dmalloc_cutoff_generation)
- dmalloc_outstanding -= dp -> size;
- else
- dmalloc_longterm -= dp -> size;
-
- /* Now put it at the head of the list. */
- dp -> prev = dmalloc_list;
- if (dmalloc_list)
- dmalloc_list -> next = dp;
- dmalloc_list = dp;
- dp -> next = (struct dmalloc_preamble *)0;
-
- /* Change the reference location information. */
- dp -> file = file;
- dp -> line = line;
-
- /* Increment the generation. */
- dp -> generation = dmalloc_generation++;
-
- /* Account for it. */
- dmalloc_outstanding += dp -> size;
-}
-
-void dmalloc_dump_outstanding ()
-{
- static unsigned long dmalloc_cutoff_point;
- struct dmalloc_preamble *dp;
- unsigned char *foo;
- int i;
-
- if (!dmalloc_cutoff_point)
- dmalloc_cutoff_point = dmalloc_cutoff_generation;
- for (dp = dmalloc_list; dp; dp = dp -> prev) {
- if (dp -> generation <= dmalloc_cutoff_point)
- break;
-#if defined (DEBUG_MALLOC_POOL)
- for (i = 0; i < DMLFSIZE; i++) {
- if (dp -> low_fence [i] !=
- (((unsigned long)
- (&dp -> low_fence [i])) % 143) + 113)
- {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
- foo = (unsigned char *)dp;
- for (i = DMDOFFSET; i < DMDSIZE; i++) {
- if (foo [i + dp -> size] !=
- (((unsigned long)
- (&foo [i + dp -> size])) % 143) + 113) {
- log_error ("malloc fence modified: %s(%d)",
- dp -> file, dp -> line);
- abort ();
- }
- }
-#endif
-#if defined (DEBUG_MEMORY_LEAKAGE)
- /* Don't count data that's actually on a free list
- somewhere. */
- if (dp -> file)
- log_info (" %s(%d): %d",
- dp -> file, dp -> line, dp -> size);
-#endif
- }
- if (dmalloc_list)
- dmalloc_cutoff_point = dmalloc_list -> generation;
-}
-#endif /* DEBUG_MEMORY_LEAKAGE || DEBUG_MALLOC_POOL */
-
-#if defined (DEBUG_RC_HISTORY)
-void dump_rc_history ()
-{
- int i;
-
- i = rc_history_index;
- do {
- log_info (" referenced by %s(%d): addr = %lx refcnt = %x\n",
- rc_history [i].file, rc_history [i].line,
- (unsigned long)rc_history [i].addr,
- rc_history [i].refcnt);
- ++i;
- if (i == RC_HISTORY_MAX)
- i = 0;
- } while (i != rc_history_index && rc_history [i].file);
-}
-#endif
-
struct dhcp_packet *new_dhcp_packet (file, line)
const char *file;
int line;
option_state_dereference (&ptr -> options, file, line);
if (ptr -> packet)
packet_dereference (&ptr -> packet, file, line);
- data_string_forget (&state -> parameter_request_list, file, line);
- data_string_forget (&state -> filename, file, line);
- data_string_forget (&state -> server_name, file, line);
+ data_string_forget (&ptr -> parameter_request_list, file, line);
+ data_string_forget (&ptr -> filename, file, line);
+ data_string_forget (&ptr -> server_name, file, line);
ptr -> next = free_lease_states;
free_lease_states = ptr;
dmalloc_reuse (free_lease_states, (char *)0, 0, 0);
{
foo -> cdr = free_pairs;
free_pairs = foo;
- dmalloc_reuse (free_expressions, (char *)0, 0, 0);
+ dmalloc_reuse (free_pairs, (char *)0, 0, 0);
}
struct expression *free_expressions;
int line;
{
if (!ptr) {
- log_error ("Null pointer in expression_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in expression_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
int line;
{
if (!ptr) {
- log_error ("Null pointer in option_cache_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in option_cache_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
int line;
{
if (!ptr) {
- log_error ("Null pointer passed to buffer_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in buffer_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
struct buffer *bp;
if (!ptr) {
- log_error ("Null pointer passed to buffer_dereference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
}
if (!*ptr) {
- log_error ("Null pointer in buffer_dereference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
}
(*ptr) -> refcnt--;
- rc_register (name, line, *ptr, (*ptr) -> refcnt);
+ rc_register (file, line, *ptr, (*ptr) -> refcnt);
if (!(*ptr) -> refcnt)
dfree ((*ptr), file, line);
if ((*ptr) -> refcnt < 0) {
- log_error ("buffer_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
int line;
{
if (!ptr) {
- log_error ("Null pointer in dns_host_entry_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in dns_host_entry_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
struct dns_host_entry *bp;
if (!ptr || !*ptr) {
- log_error ("Null pointer in dns_host_entry_dereference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
if (!(*ptr) -> refcnt)
dfree ((*ptr), file, line);
if ((*ptr) -> refcnt < 0) {
- log_error ("dns_host_entry_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
unsigned size;
if (!ptr) {
- log_error ("Null pointer passed to option_state_allocate: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in option_state_allocate (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
int line;
{
if (!ptr) {
- log_error ("Null pointer in option_state_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in option_state_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
struct option_state *options;
if (!ptr || !*ptr) {
- log_error ("Null pointer in option_state_dereference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
return 1;
if (options -> refcnt < 0) {
- log_error ("option_state_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
int line;
{
if (!ptr) {
- log_error ("Null ptr in executable_statement_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Nonnull ptr in executable_statement_reference: %s",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
int size;
if (!ptr) {
- log_error ("Null pointer passed to packet_allocate: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in packet_allocate (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
int line;
{
if (!ptr) {
- log_error ("Null pointer in packet_reference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
#endif
}
if (*ptr) {
- log_error ("Non-null pointer in packet_reference (%s)",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
struct packet *packet;
if (!ptr || !*ptr) {
- log_error ("Null pointer in packet_dereference: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
return 1;
if (packet -> refcnt < 0) {
- log_error ("option_state_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
option_state_dereference (&packet -> options, file, line);
packet -> raw = (struct dhcp_packet *)free_packets;
free_packets = packet;
- dmalloc_reuse (free_packets, (char *)0, 0);
+ dmalloc_reuse (free_packets, (char *)0, 0, 0);
return 1;
}
struct binding_scope *bp;
if (!ptr) {
- log_error ("Null pointer in binding_scope_allocate: %s",
- file, line);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
}
if (*ptr) {
- log_error ("Non-null pointer in binding_scope_allocate: %s",
- file, line);
+ log_error ("%s(%d): non-null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
void data_string_copy (dest, src, file, line)
struct data_string *dest;
struct data_string *src;
- const char *name;
+ const char *file;
int line;
{
if (src -> buffer)
/* Release the reference count to a data string's buffer (if any) and
zero out the other information, yielding the null data string. */
-void data_string_forget (data, name)
+void data_string_forget (data, file, line)
struct data_string *data;
const char *file;
int line;
#ifndef lint
static char copyright[] =
-"$Id: bpf.c,v 1.32 2000/01/05 17:57:30 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: bpf.c,v 1.33 2000/01/26 14:55:33 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
/* Get the required BPF buffer length from the kernel. */
if (ioctl (info -> rfdesc, BIOCGBLEN, &info -> rbuf_max) < 0)
log_fatal ("Can't get bpf buffer length: %m");
- info -> rbuf = malloc (info -> rbuf_max);
+ info -> rbuf = dmalloc (info -> rbuf_max, MDL);
if (!info -> rbuf)
log_fatal ("Can't allocate %d bytes for bpf input buffer.",
info -> rbuf_max);
#ifndef lint
static char copyright[] =
-"$Id: conflex.c,v 1.65 2000/01/25 01:03:36 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: conflex.c,v 1.66 2000/01/26 14:55:33 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
{
struct parse *tmp;
- tmp = dmalloc (sizeof (struct parse), "new_parse");
+ tmp = dmalloc (sizeof (struct parse), MDL);
if (!tmp)
return ISC_R_NOMEMORY;
memset (tmp, 0, sizeof *tmp);
tmp -> bufsiz = 0;
tmp -> inbuf = inbuf;
} else {
- tmp -> inbuf = dmalloc (8192, "new_parse");
+ tmp -> inbuf = dmalloc (8192, MDL);
if (!tmp -> inbuf) {
- dfree (tmp, "new_parse");
+ dfree (tmp, MDL);
return ISC_R_NOMEMORY;
}
tmp -> bufsiz = 8192;
struct parse **cfile;
{
if ((*cfile) -> bufsiz)
- dfree ((*cfile) -> inbuf, "end_parse");
- dfree (*cfile, "end_parse");
+ dfree ((*cfile) -> inbuf, MDL);
+ dfree (*cfile, MDL);
*cfile = (struct parse *)0;
return ISC_R_SUCCESS;
}
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
+ The t\bte\bex\bxt\bt 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";
+ 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
enclosed in double quotes, or a series of octets specified
in hexadecimal, seperated by colons. For example:
- option dhcp-client-identifier "CLIENT-FOO";
+ option dhcp-client-identifier "CLIENT-FOO";
or
- option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
+ option dhcp-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:
+ defined by the name option-_\bn_\bn_\bn, where _\bn_\bn_\bn 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 seperÂ
+ ated by colons. For example:
- option option-133 "my-option-133-text";
- option option-129 1:54:c9:2b:47;
+ 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Â
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;
+ 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;
- The subnet mask option specifies the client's subnet
- mask as per RFC 950. If no subnet mask option is proÂ
- vided 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. HowÂ
- ever, _\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.
+ 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 t\bti\bim\bme\be-\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\b3_\b2;\b;
+ 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;
- The time-offset option specifies the offset of the
- client's subnet in seconds from Coordinated Universal
- Time (UTC).
+ This option specifies the timeout in seconds for ARP
+ cache entries.
- 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;
+ o\bop\bpt\bti\bio\bon\bn b\bbo\boo\bot\btf\bfi\bil\ble\be-\b-n\bna\bam\bme\be _\bt_\be_\bx_\bt;\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.
+ This option is used to identify a bootstrap file. If
+ supported by the client, it should have the same effect
+ as the f\bfi\bil\ble\ben\bna\bam\bme\be declaration. BOOTP clients are
+ unlikely to support this option. Some DHCP clients
+ will support it, and others actually require it.
- 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 [, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs... ];\b;
+ 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;
- The time-server option specifies a list of RFC 868 time
- servers available to the client. Servers should be
- listed in order of preference.
+ This option specifies the length in 512-octet blocks of
+ the default boot image for the client.
- o\bop\bpt\bti\bio\bon\bn i\bie\ben\bn1\b11\b16\b6-\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... ];
+ 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;
- The ien116-name-servers option specifies a list of IEN
- 116 name servers available to the client. Servers
- should be listed in order of preference.
+ 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 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;
dhcpd-options(5) dhcpd-options(5)
- 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.
-
- 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;
+ 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;
- 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.
+ This option specifies the default time-to-live that the
+ client should use on outgoing datagrams.
- 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;
+ 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;
- The impress-server option specifies a list of Imagen
- Impress servers available to the client. Servers
- should be listed in order of preference.
+ 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 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;
+ 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 _\bs_\bt_\br_\bi_\bn_\bg;\b;
- This option specifies a list of RFC 887 Resource LocaÂ
- tion servers available to the client. Servers should
- be listed in order of preference.
+ 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.
+
+ o\bop\bpt\bti\bio\bon\bn d\bdh\bhc\bcp\bp-\b-m\bma\bax\bx-\b-m\bme\bes\bss\bsa\bag\bge\be-\b-s\bsi\biz\bze\be _\bu_\bi_\bn_\bt_\b1_\b6;\b;
+
+ This option, when sent by the client, specifies the
+ maximum size of any response that the server sends to
+ the client. When specified on the server, if the
+ client did not send a dhcp-max-message-size option, the
+ size specified on the server is used. This works for
+ BOOTP as well as DHCP responses.
+
+ o\bop\bpt\bti\bio\bon\bn d\bdh\bhc\bcp\bp-\b-p\bpa\bar\bra\bam\bme\bet\bte\ber\br-\b-r\bre\beq\bqu\bue\bes\bst\bt-\b-l\bli\bis\bst\bt _\bu_\bi_\bn_\bt_\b1_\b6;\b;
+
+ This option, when sent by the client, specifies which
+ options the client wishes the server to return. NorÂ
+ mally, in the ISC DHCP client, this is done using the
+ _\br_\be_\bq_\bu_\be_\bs_\bt statement. If this option is not specified by
+ the client, the DHCP server will normally return every
+ option that is valid in scope and that fits into the
+ reply. When this option is specified on the server,
+ the server returns the specified options. This can be
+ used to force a client to take options that it hasn't
+ requested, and it can also be used to tailor the
+ response of the DHCP server for clients that may need a
+ more limited set of options than those the server would
+ normally return.
+
+ o\bop\bpt\bti\bio\bon\bn d\bdo\bom\bma\bai\bin\bn-\b-n\bna\bam\bme\be _\bt_\be_\bx_\bt;\b;
+
+ This option specifies the domain name that client
+ should use when resolving hostnames via the Domain Name
+ System.
+
+
+
+ 3
+
+
+
+
+
+dhcpd-options(5) dhcpd-options(5)
+
+
+ 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 preference.
+
+ o\bop\bpt\bti\bio\bon\bn e\bex\bxt\bte\ben\bns\bsi\bio\bon\bns\bs-\b-p\bpa\bat\bth\bh-\b-n\bna\bam\bme\be _\bt_\be_\bx_\bt;\b;
+
+ This option specifies the name of a file containing
+ additional options to be interpreted according to the
+ DHCP option format as specified in RFC2132.
+
+ o\bop\bpt\bti\bio\bon\bn f\bfi\bin\bng\bge\ber\br-\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 Finger server option specifies a list of Finger
+ available to the client. Servers should be listed in
+ order of preference.
+
+ 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 h\bho\bos\bst\bt-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
specify the domain name). See RFC 1035 for character
set restrictions.
- 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;
+ 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 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
+ 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.
+ o\bop\bpt\bti\bio\bon\bn i\bie\ben\bn1\b11\b16\b6-\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... ];
+ The ien116-name-servers option specifies a list of IEN
+ 116 name servers available to the client. Servers
+ should be listed in order of preference.
- 3
+ 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.
-dhcpd-options(5) dhcpd-options(5)
+ 4
- character string consisting of characters from the NVT
- ASCII character 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;
+dhcpd-options(5) dhcpd-options(5)
- 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;
+ 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 path-name that contains the
- client's root disk. The path is formatted as a characÂ
- ter string consisting of characters from the NVT ASCII
- character set.
+ This option specifies the MTU to use on this interface.
+ The minimum legal value for the MTU is 68.
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;
means 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;
+ o\bop\bpt\bti\bio\bon\bn i\bir\brc\bc-\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;
- This option specifies whether the client should configÂ
- ure 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.
+ The IRC server option specifies a list of IRC available
+ to the client. Servers should be listed in order of
+ preference.
- 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;
+ 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;
- 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.
+ 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.
- Any source routed datagram whose next-hop address does
- not match one of the filters should be discarded by the
- client.
+ 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;
- See STD 3 (RFC1122) for further information.
+ 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.
+
+ 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 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 miniÂ
+ mum value legal value is 576.
+ o\bop\bpt\bti\bio\bon\bn m\bme\ber\bri\bit\bt-\b-d\bdu\bum\bmp\bp _\bt_\be_\bx_\bt;\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 characÂ
+ ter string consisting of characters from the NVT ASCII
+ character set.
- 4
+ o\bop\bpt\bti\bio\bon\bn m\bmo\bob\bbi\bil\ble\be-\b-i\bip\bp-\b-h\bho\bom\bme\be-\b-a\bag\bge\ben\bnt\bt _\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
+ 5
-dhcpd-options(5) dhcpd-options(5)
- the client should be prepared to reassemble. The miniÂ
- mum 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.
+dhcpd-options(5) dhcpd-options(5)
- 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.
+ mobile IP home agents available to the client. Agents
+ should be listed in order of preference, although norÂ
+ mally there will be only one such agent.
- 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;
+ o\bop\bpt\bti\bio\bon\bn n\bnd\bds\bs-\b-c\bco\bon\bnt\bte\bex\bxt\bt _\bs_\bt_\br_\bi_\bn_\bg;\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 miniÂ
- mum MTU value cannot be smaller than 68.
+ The nds-context option specifies the name of the iniÂ
+ tial Netware Directory Service for an NDS client.
- 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;
+ o\bop\bpt\bti\bio\bon\bn n\bnd\bds\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 the MTU to use on this interface.
- The minimum legal value for the MTU is 68.
+ The nds-servers option specifies a list of IP addresses
+ of NDS servers.
- 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;
+ o\bop\bpt\bti\bio\bon\bn n\bnd\bds\bs-\b-t\btr\bre\bee\be-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\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.
+ The nds-context option specifies NDS tree name that the
+ NDS client should use.
- 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;
+ 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;
- 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).
+ 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 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;
+ 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;
- 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 disÂ
- covery. A value of 1 means that the client should perÂ
- form mask discovery.
+ The NetBIOS name server (NBNS) option specifies a list
+ of RFC 1001/1002 NBNS name servers listed in order of
+ preference. NetBIOS Name Service is currently more
+ commonly referred to as WINS. WINS servers can be
+ specified using the netbios-name-servers option.
- 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;
+ 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.
+ Possible node types are:
- 5
+ _\b1 B-node: Broadcast - no WINS
+ _\b2 P-node: Peer - WINS only.
+ _\b4 M-node: Mixed - broadcast, then WINS
+ _\b8 H-node: Hybrid - WINS, then broadcast
-dhcpd-options(5) dhcpd-options(5)
+ 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
- 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 discovÂ
- ery.
+ 6
- 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 multiÂ
- ple routes to the same destination are specified, they
- are listed in descending order of priority.
- The routes consist of a list of IP address pairs. The
- first address is the destination address, and the secÂ
- ond address is the router for the destination.
+dhcpd-options(5) dhcpd-options(5)
- 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;
+ TCP/IP scope parameter for the client as specified in
+ RFC 1001/1002. See RFC1001, RFC1002, and RFC1035 for
+ character-set restrictions.
- 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 n\bnw\bwi\bip\bp-\b-d\bdo\bom\bma\bai\bin\bn _\bs_\bt_\br_\bi_\bn_\bg;\b;
- 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;
+ The name of the NetWare/IP domain that a NetWare/IP
+ client should use.
- This option specifies the timeout in seconds for ARP
- cache entries.
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp-\b-s\bsu\bub\bbo\bop\bpt\bti\bio\bon\bns\bs _\bs_\bt_\br_\bi_\bn_\bg;\b;
- 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;
+ A sequence of suboptions for NetWare/IP clients - see
+ RFC2242 for details. Normally this option is set by
+ specifying specific NetWare/IP suboptions - see the
+ NETWARE/IP SUBOPTIONS section for more information.
- 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
+ o\bop\bpt\bti\bio\bon\bn n\bni\bis\bs-\b-d\bdo\bom\bma\bai\bin\bn _\bt_\be_\bx_\bt;\b;
+ 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 characÂ
+ ters 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;
- 6
+ 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\bni\bis\bsp\bpl\blu\bus\bs-\b-d\bdo\bom\bma\bai\bin\bn _\bt_\be_\bx_\bt;\b;
+ This option specifies the name of the client's NIS+
+ domain. The domain is formatted as a character string
+ consisting of characters from the NVT ASCII character
+ set.
+ o\bop\bpt\bti\bio\bon\bn n\bni\bis\bsp\bpl\blu\bus\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.
-dhcpd-options(5) dhcpd-options(5)
+ o\bop\bpt\bti\bio\bon\bn n\bnn\bnt\btp\bp-\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 NNTP server option specifies a list of NNTP availÂ
+ able to the client. Servers should be listed in order
+ of preference.
- encapsulation. A value of 1 means that the client
- should use RFC 1042 encapsulation.
+ 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;
- 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 whether the client should configÂ
+ ure 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
- 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 connections unless specifically requested by an
- application.
+ 7
- 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;
- 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 characÂ
- ters 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;
+dhcpd-options(5) dhcpd-options(5)
- This option specifies a list of IP addresses indicating
- NIS servers available to the client. Servers should be
- listed in order of preference.
+
+ forwarding of such datagrams, and a value of 1 means
+ allow forwarding.
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;
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;
+ 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;
- The NetBIOS name server (NBNS) option specifies a list
- of RFC 1001/1002 NBNS name servers listed in order of
- preference. NetBIOS Name Service is currently more
- commonly referred to as WINS. WINS servers can be
+ 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 miniÂ
+ mum MTU value cannot be smaller than 68.
- 7
+ 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 disÂ
+ covery. A value of 1 means that the client should perÂ
+ form mask discovery.
+
+ 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 p\bpo\bop\bp-\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 POP3 server option specifies a list of POP3 availÂ
+ able 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;
+
+
+
+
+ 8
dhcpd-options(5) dhcpd-options(5)
- specified using the netbios-name-servers option.
+ This option specifies a list of RFC 887 Resource LocaÂ
+ tion 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-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;
+ o\bop\bpt\bti\bio\bon\bn r\bro\boo\bot\bt-\b-p\bpa\bat\bth\bh _\bt_\be_\bx_\bt;\b;
- The NetBIOS datagram distribution server (NBDD) option
- specifies a list of RFC 1001/1002 NBDD servers listed
- in order of preference.
+ This option specifies the path-name that contains the
+ client's root disk. The path is formatted as a characÂ
+ ter string consisting of characters from the NVT ASCII
+ character set.
- 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;
+ 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;
- 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.
+ 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 discovÂ
+ ery.
- Possible node types are:
+ 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;
+
+ <<<<<<< dhcp-options.5 This option specifies a list of
+ IP addresses indicating NTP (RFC 1305) servers availÂ
+ able to the client. Servers should be listed in order
+ of preference. ======= This option specifies the
+ address to which the client should transmit router
+ solicitation requests. >>>>>>> 1.9
+
+ 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 s\bsm\bmt\btp\bp-\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 SMTP server option specifies a list of SMTP servers
+ available to the client. Servers should be listed in
+ order of preference.
+
+ 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 multiÂ
+ ple routes to the same destination are specified, they
+ are listed in descending order of priority.
+
+ The routes consist of a list of IP address pairs. The
+ first address is the destination address, and the secÂ
+ ond address is the router for the destination.
+
+ The default route (0.0.0.0) is an illegal destination
+
+
+
+ 9
+
+
+
+
+
+dhcpd-options(5) dhcpd-options(5)
- _\b1 B-node: Broadcast - no WINS
+ for a static route. To specify the default route, use
+ the r\bro\bou\but\bte\ber\brs\bs option. Also, please note that this
+ option is not intended for classless IP routing - it
+ does not include a subnet mask. Since classless IP
+ routing is now the most widely deployed routing stanÂ
+ dard, this option is virtually useless, and is not
+ implemented by any of the popular DHCP clients, for
+ example the Microsoft DHCP client.
- _\b2 P-node: Peer - WINS only.
+ o\bop\bpt\bti\bio\bon\bn s\bst\btr\bre\bee\bet\btt\bta\bal\blk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bry\by-\b-a\bas\bss\bsi\bis\bst\bta\ban\bnc\bce\be-\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;
- _\b4 M-node: Mixed - broadcast, then WINS
+ The StreetTalk Directory Assistance (STDA) server
+ option specifies a list of STDA servers available to
+ the client. Servers should be listed in order of prefÂ
+ erence.
- _\b8 H-node: Hybrid - WINS, then broadcast
+ o\bop\bpt\bti\bio\bon\bn s\bst\btr\bre\bee\bet\btt\bta\bal\blk\bk-\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;
- 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 StreetTalk server option specifies a list of
+ StreetTalk servers available to the client. Servers
+ should be listed in order of preference.
- 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.
+ 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;
- 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;
+ The subnet mask option specifies the client's subnet
+ mask as per RFC 950. If no subnet mask option is proÂ
+ vided 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. HowÂ
+ ever, _\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.
- 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 s\bsw\bwa\bap\bp-\b-s\bse\ber\brv\bve\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
- 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;
+ This specifies the IP address of the client's swap
+ server.
- This option specifies a list of systems that are runÂ
- ning the X Window System Display Manager and are availÂ
- able to the client. Addresses should be listed in
- order of preference.
+ 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;
- 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 _\bs_\bt_\br_\bi_\bn_\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.
- 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.
- o\bop\bpt\bti\bio\bon\bn n\bni\bis\bsp\bpl\blu\bus\bs-\b-d\bdo\bom\bma\bai\bin\bn _\bs_\bt_\br_\bi_\bn_\bg;\b;
+ 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
- 8
+ 10
dhcpd-options(5) dhcpd-options(5)
- This option specifies the name of the client's NIS+
- domain. The domain is formatted as a character string
- consisting of characters from the NVT ASCII character
- set.
- o\bop\bpt\bti\bio\bon\bn n\bni\bis\bsp\bpl\blu\bus\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.
+ that the client should not generate keepalive messages
+ on connections unless specifically requested by an
+ application.
- o\bop\bpt\bti\bio\bon\bn t\btf\bft\btp\bp-\b-s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
+ o\bop\bpt\bti\bio\bon\bn t\btf\bft\btp\bp-\b-s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be _\bt_\be_\bx_\bt;\b;
- This option is used to identify a TFTP server and, if
+ This option is used to identify a TFTP server and, if
supported by the client, should have the same effect as
- the s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be declaration. BOOTP clients are
- unlikely to support this option. Some DHCP clients
+ the s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be declaration. BOOTP clients are
+ unlikely to support this option. Some DHCP clients
will support it, and others actually require it.
- o\bop\bpt\bti\bio\bon\bn b\bbo\boo\bot\btf\bfi\bil\ble\be-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
+ 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;
- This option is used to identify a bootstrap file. If
- supported by the client, it should have the same effect
- as the f\bfi\bil\ble\ben\bna\bam\bme\be declaration. BOOTP clients are
- unlikely to support this option. Some DHCP clients
- will support it, and others actually require it.
+ 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 m\bmo\bob\bbi\bil\ble\be-\b-i\bip\bp-\b-h\bho\bom\bme\be-\b-a\bag\bge\ben\bnt\bt _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs... ];\b;
+ 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 [, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs... ];\b;
- This option specifies a list of IP addresses indicating
- mobile IP home agents available to the client. Agents
- should be listed in order of preference, although norÂ
- mally there will be only one such agent.
+ 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 s\bsm\bmt\btp\bp-\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;
+ 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;
- The SMTP server option specifies a list of SMTP servers
- available to the client. Servers should be listed in
- order of preference.
+ 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 p\bpo\bop\bp-\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;
+ o\bop\bpt\bti\bio\bon\bn u\bua\bap\bp-\b-s\bse\ber\brv\bve\ber\brs\bs _\bt_\be_\bx_\bt;\b;
- The POP3 server option specifies a list of POP3 availÂ
- able to the client. Servers should be listed in order
- of preference.
+ This option specifies a list of URLs, each pointing to
+ a user authentication service that is capable of proÂ
+ cessing authentication requests encapsulated in the
+ User Authentication Protocol (UAP). UAP servers can
+ accept either HTTP 1.1 or SSLv3 connections. If the
+ list includes a URL that does not contain a port compoÂ
+ nent, the normal default port is assumed (i.e., port 80
+ for http and port 443 for https). If the list includes
+ a URL that does not contain a path component, the path
+ /uap is assumed. If more than one URL is specified in
+ this list, the URLs are seperated by spaces.
- o\bop\bpt\bti\bio\bon\bn n\bnn\bnt\btp\bp-\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;
+ o\bop\bpt\bti\bio\bon\bn v\bve\ben\bnd\bdo\bor\br-\b-c\bcl\bla\bas\bss\bs-\b-i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br _\bs_\bt_\br_\bi_\bn_\bg;\b;
- The NNTP server option specifies a list of NNTP availÂ
- able to the client. Servers should be listed in order
- of preference.
+ This option is used by some DHCP clients to identify
+ the vendor type and possibly the configuration of a
+ DHCP client. The information is a string of bytes
+ whose contents are specific to the vendor and are not
+ specified in a standard. To see what vendor class
+ identifier a clients are sending, you can write the
- o\bop\bpt\bti\bio\bon\bn w\bww\bww\bw-\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 WWW server option specifies a list of WWW available
+ 11
- 9
+dhcpd-options(5) dhcpd-options(5)
-dhcpd-options(5) dhcpd-options(5)
+ following in your DHCP server configuration file:
+ set vendor-class option vendor-class-identifier;
- to the client. Servers should be listed in order of
- preference.
+ This will result in all entries in the DHCP server
+ lease database file for clients that sent vendor-class-
+ identifier options having a set statement that looks
+ something like this:
- o\bop\bpt\bti\bio\bon\bn f\bfi\bin\bng\bge\ber\br-\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;
+ set vendor-class "SUNW.Ultra-5_10";
- The Finger server option specifies a list of Finger
- available to the client. Servers should be listed in
- order of preference.
+ The vendor-class-identifier option is normally used by
+ the DHCP server to determine the options that are
+ returned in the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option.
+ Please see the VENDOR ENCAPSULATED OPTIONS section of
+ the dhcpd.conf manual page for further information.
- o\bop\bpt\bti\bio\bon\bn i\bir\brc\bc-\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;
+ o\bop\bpt\bti\bio\bon\bn v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs _\bs_\bt_\br_\bi_\bn_\bg;\b;
- The IRC server option specifies a list of IRC available
- to the client. Servers should be listed in order of
- preference.
+ The v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option can contain
+ either a single vendor-specific value or one or more
+ vendor-specific suboptions. This option is not norÂ
+ mally specified in the DHCP server configuration file -
+ instead, a vendor class is defined for each vendor,
+ vendor class suboptions are defined, values for those
+ suboptions are defined, and the DHCP server makes up a
+ response on that basis.
- o\bop\bpt\bti\bio\bon\bn s\bst\btr\bre\bee\bet\btt\bta\bal\blk\bk-\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;
+ Some default behaviours for well-known DHCP client venÂ
+ dors (currently, the Microsoft Windows 2000 DHCP
+ client) are configured automatically, but otherwise
+ this must be configured manually - see the VENDOR
+ ENCAPSULATED OPTIONS section of the _\bd_\bh_\bc_\bp_\bd_\b._\bc_\bo_\bn_\bf _\bm_\ba_\bn_\bu_\ba_\bl
+ _\bp_\ba_\bg_\be _\bf_\bo_\br _\bd_\be_\bt_\ba_\bi_\bl_\bs_\b.
- The StreetTalk server option specifies a list of
- StreetTalk 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;
- o\bop\bpt\bti\bio\bon\bn s\bst\btr\bre\bee\bet\bta\bal\blk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bry\by-\b-a\bas\bss\bsi\bis\bst\bta\ban\bnc\bce\be-\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;
+ This option specifies a list of systems that are runÂ
+ ning the X Window System Display Manager and are availÂ
+ able to the client. Addresses should be listed in
+ order of preference.
- The StreetTalk Directory Assistance (STDA) server
- option specifies a list of STDA servers available to
- the client. Servers should be listed in order of prefÂ
- erence.
+ o\bop\bpt\bti\bio\bon\bn w\bww\bww\bw-\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 WWW server option specifies a list of WWW available
+ to the client. Servers should be listed in order of
+ preference.
R\bRE\bEL\bLA\bAY\bY A\bAG\bGE\bEN\bNT\bT I\bIN\bNF\bFO\bOR\bRM\bMA\bAT\bTI\bIO\bON\bN O\bOP\bPT\bTI\bIO\bON\bN
An IETF draft, draft-ietf-dhc-agent-options-03.txt,
agent can add to a DHCP packet when relaying it to the
DHCP server. The server can then make address allocation
decisions (or whatever other decisions it wants) based on
+
+
+
+ 12
+
+
+
+
+
+dhcpd-options(5) dhcpd-options(5)
+
+
these options. The server also returns these options in
any replies it sends through the relay agent, so that the
relay agent can use the information in these options for
packet was received. It is intended for use by agents
in relaying DHCP responses back to the proper circuit.
The format of this option is currently defined to be
-
-
-
- 10
-
-
-
-
-
-dhcpd-options(5) dhcpd-options(5)
-
-
vendor-dependent, and will probably remain that way,
although the current draft allows for for the possibilÂ
ity of standardizing the format in the future.
be an opaque object that is administratively guaranteed
to be unique to a particular remote end of a circuit.
+T\bTH\bHE\bE N\bNE\bET\bTW\bWA\bAR\bRE\bE/\b/I\bIP\bP S\bSU\bUB\bBO\bOP\bPT\bTI\bIO\bON\bNS\bS
+ RFC2242 defines a set of encapsulated options for Novell
+ NetWare/IP clients. To use these options in the dhcp
+ server, specify the option space name, "nwip", followed by
+ a period, followed by the option name. The following
+ options can be specified:
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.n\bns\bsq\bq-\b-b\bbr\bro\boa\bad\bdc\bca\bas\bst\bt _\bf_\bl_\ba_\bg;\b;
+
+ If true, the client should use the NetWare Nearest
+ Server Query to locate a NetWare/IP server. The
+ behaviour of the Novell client if this suboption is
+ false, or is not present, is not specified.
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.p\bpr\bre\bef\bfe\ber\brr\bre\bed\bd-\b-d\bds\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs... ];\b;
+
+ This suboption specifies a list of up to five IP
+ addresses, each of which should be the IP address of a
+ NetWare Domain SAP/RIP server (DSS).
+
+
+
+
+ 13
+
+
+
+
+
+dhcpd-options(5) dhcpd-options(5)
+
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.n\bne\bea\bar\bre\bes\bst\bt-\b-n\bnw\bwi\bip\bp-\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;
+
+ This suboption specifies a list of up to five IP
+ addresses, each of which should be the IP address of a
+ Nearest NetWare IP server.
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.a\bau\but\bto\bor\bre\bet\btr\bri\bie\bes\bs _\bu_\bi_\bn_\bt_\b8;\b;
+
+ Specifies the number of times that a NetWare/IP client
+ should attempt to communicate with a given DSS server
+ at startup.
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.a\bau\but\bto\bor\bre\bet\btr\bry\by-\b-s\bse\bec\bcs\bs _\bu_\bi_\bn_\bt_\b8;\b;
+
+ Specifies the number of seconds that a Netware/IP
+ client should wait between retries when attempting to
+ establish communications with a DSS server at startup.
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.n\bnw\bwi\bip\bp-\b-1\b1-\b-1\b1 _\bu_\bi_\bn_\bt_\b8;\b;
+
+ If true, the NetWare/IP client should support NetÂ
+ Ware/IP version 1.1 compatibility. This is only
+ needed if the client will be contacting Netware/IP verÂ
+ sion 1.1 servers.
+
+ o\bop\bpt\bti\bio\bon\bn n\bnw\bwi\bip\bp.\b.p\bpr\bri\bim\bma\bar\bry\by-\b-d\bds\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
+
+ Specifies the IP address of the Primary Domain SAP/RIP
+ Service server (DSS) for this NetWare/IP domain. The
+ NetWare/IP administration utility uses this value as
+ Primary DSS server when configuring a secondary DSS
+ server.
+
D\bDE\bEF\bFI\bIN\bNI\bIN\bNG\bG N\bNE\bEW\bW O\bOP\bPT\bTI\bIO\bON\bNS\bS
- The Internet Software Consortium DHCP client and server
- provide the capability to define new options. Each DHCP
- option has a name, a code, and a structure. The name is
- used by you to refer to the option. The code is a numÂ
- ber, used by the DHCP server and client to refer to an
- option. The structure describes what the contents of an
+ The Internet Software Consortium DHCP client and server
+ provide the capability to define new options. Each DHCP
+ option has a name, a code, and a structure. The name is
+ used by you to refer to the option. The code is a numÂ
+ ber, used by the DHCP server and client to refer to an
+ option. The structure describes what the contents of an
option looks like.
- To define a new option, you need to choose a name for it
- that is not in use for some other option - for example,
+ To define a new option, you need to choose a name for it
+ that is not in use for some other option - for example,
you can't use "host-name" because the DHCP protocol
- already defines a host-name option, which is documented
- earlier in this manual page. If an option name doesn't
+ already defines a host-name option, which is documented
+ earlier in this manual page. If an option name doesn't
appear in this manual page, you can use it, but it's probÂ
- ably a good idea to put some kind of unique string at the
- beginning so you can be sure that future options don't
+ ably a good idea to put some kind of unique string at the
+ beginning so you can be sure that future options don't
take your name. For example, you might define an option,
- "local-host-name", feeling some confidence that no offiÂ
+ "local-host-name", feeling some confidence that no offiÂ
cial DHCP option name will ever start with "local".
- Once you have chosen a name, you must choose a code. For
- site-local options, all codes between 128 and 254 are
- reserved for DHCP options, so you can pick any one of
- these. In practice, some vendors have interpreted the
- protocol rather loosely and have used option code values
- greater than 128 themselves. There's no real way to
- avoid this problem, but it's not likely to cause too much
- trouble in practice.
-
- The structure of an option is simply the format in which
- the option data appears. The ISC DHCP server currently
- supports a few simple types, like integers, booleans,
- strings and IP addresses, and it also supports the ability
- to define arrays of single types or arrays of fixed
- sequences of types.
- New options are declared as follows:
+ 14
- 11
+dhcpd-options(5) dhcpd-options(5)
+ Once you have chosen a name, you must choose a code. For
+ site-local options, all codes between 128 and 254 are
+ reserved for DHCP options, so you can pick any one of
+ these. In practice, some vendors have interpreted the
+ protocol rather loosely and have used option code values
+ greater than 128 themselves. There's no real way to
+ avoid this problem, but it's not likely to cause too much
+ trouble in practice.
-dhcpd-options(5) dhcpd-options(5)
+ The structure of an option is simply the format in which
+ the option data appears. The ISC DHCP server currently
+ supports a few simple types, like integers, booleans,
+ strings and IP addresses, and it also supports the ability
+ to define arrays of single types or arrays of fixed
+ sequences of types.
+ New options are declared as follows:
o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= _\bd_\be_\bf_\bi_\bn_\bi_\bt_\bi_\bo_\bn ;\b;
The values of _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be and _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be should be the name you
- have chosen for the new option and the code you have choÂ
- sen. The _\bd_\be_\bf_\bi_\bn_\bi_\bt_\bi_\bo_\bn should be the definition of the
+ have chosen for the new option and the code you have choÂ
+ sen. The _\bd_\be_\bf_\bi_\bn_\bi_\bt_\bi_\bo_\bn should be the definition of the
structure of the option.
- The following simple option type definitions are supÂ
+ The following simple option type definitions are supÂ
ported:
B\bBO\bOO\bOL\bLE\bEA\bAN\bN
o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= b\bbo\boo\bol\ble\bea\ban\bn ;\b;
An option of type boolean is a flag with a value of either
- on or off (or true or false). So an example use of the
+ on or off (or true or false). So an example use of the
boolean type would be:
- option use-zephyr code 180 = boolean;
- option use-zephyr on;
+ option use-zephyr code 180 = boolean;
+ option use-zephyr on;
I\bIN\bNT\bTE\bEG\bGE\bER\bR
o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= _\bs_\bi_\bg_\bn i\bin\bnt\bte\beg\bge\ber\br _\bw_\bi_\bd_\bt_\bh ;\b;
The _\bs_\bi_\bg_\bn token should either be blank, _\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd or _\bs_\bi_\bg_\bn_\be_\bd.
- The width can be either 8, 16 or 32, and refers to the
- number of bits in the integer. So for example, the folÂ
- lowing two lines show a definition of the sql-connection-
+ The width can be either 8, 16 or 32, and refers to the
+ number of bits in the integer. So for example, the folÂ
+ lowing two lines show a definition of the sql-connection-
max option and its use:
- option sql-connection-max code 192 = unsigned integer 16;
- option sql-connection-max 1536;
+ option sql-connection-max code 192 = unsigned integer 16;
+ option sql-connection-max 1536;
I\bIP\bP-\b-A\bAD\bDD\bDR\bRE\bES\bSS\bS
- o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= i\bip\bp-\b-a\bad\bdd\bdr\bre\bes\bss\bs ;\b;
- An option whose structure is an IP address can be
- expressed either as a domain name or as a dotted quad. So
- the following is an example use of the ip-address type:
- option sql-server-address code 193 = ip-address;
- option sql-server-address sql.example.com;
+ 15
- T\bTE\bEX\bXT\bT
- o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= t\bte\bex\bxt\bt ;\b;
- An option whose type is text will encode an ASCII text
- string. For example:
- option sql-default-connection-name code 194 = text;
+dhcpd-options(5) dhcpd-options(5)
- 12
+ o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= i\bip\bp-\b-a\bad\bdd\bdr\bre\bes\bss\bs ;\b;
+ An option whose structure is an IP address can be
+ expressed either as a domain name or as a dotted quad. So
+ the following is an example use of the ip-address type:
+ option sql-server-address code 193 = ip-address;
+ option sql-server-address sql.example.com;
+ T\bTE\bEX\bXT\bT
-dhcpd-options(5) dhcpd-options(5)
+ o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= t\bte\bex\bxt\bt ;\b;
+ An option whose type is text will encode an ASCII text
+ string. For example:
- option sql-default-connection-name "PRODZA";
+ option sql-default-connection-name code 194 = text;
+ option sql-default-connection-name "PRODZA";
D\bDA\bAT\bTA\bA S\bST\bTR\bRI\bIN\bNG\bG
o\bop\bpt\bti\bio\bon\bn _\bn_\be_\bw_\b-_\bn_\ba_\bm_\be c\bco\bod\bde\be _\bn_\be_\bw_\b-_\bc_\bo_\bd_\be =\b= s\bst\btr\bri\bin\bng\bg ;\b;
- An option whose type is a data string is essentially just
- a collection of bytes, and can be specified either as
+ An option whose type is a data string is essentially just
+ a collection of bytes, and can be specified either as
quoted text, like the text type, or as a list of hexadeciÂ
- mal contents seperated by colons whose values must be
+ mal contents seperated by colons whose values must be
between 0 and FF. For example:
- option sql-identification-token code 195 = string;
- option sql-identification-token 17:23:19:a6:42:ea:99:7c:22;
+ option sql-identification-token code 195 = string;
+ option sql-identification-token 17:23:19:a6:42:ea:99:7c:22;
A\bAR\bRR\bRA\bAY\bYS\bS
- Options can contain arrays of any of the above types
- except for the text and data string types, which aren't
- currently supported in arrays. An example of an array
+ Options can contain arrays of any of the above types
+ except for the text and data string types, which aren't
+ currently supported in arrays. An example of an array
definition is as follows:
- option kerberos-servers code 200 = array of ip-address;
- option kerberos-servers 10.20.10.1, 10.20.11.1;
+ option kerberos-servers code 200 = array of ip-address;
+ option kerberos-servers 10.20.10.1, 10.20.11.1;
R\bRE\bEC\bCO\bOR\bRD\bDS\bS
- Options can also contain data structures consisting of a
+ Options can also contain data structures consisting of a
sequence of data types, which is sometimes called a record
type. For example:
- option contrived-001 code 201 = { boolean, integer 32, text };
- option contrived-001 on 1772 "contrivance";
-
- It's also possible to have options that are arrays of
- records, for example:
-
- option new-static-routes code 201 = array of {
- ip-address, ip-address, ip-address, integer 8 };
- option static-routes
- 10.0.0.0 255.255.255.0 net-0-rtr.example.com 1,
- 10.0.1.0 255.255.255.0 net-1-rtr.example.com 1,
- 10.2.0.0 255.255.224.0 net-2-0-rtr.example.com 3;
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
- dhcpd.conf(5), dhcpd.leases(5), dhclient.conf(5), dhcp-
- eval(5), dhcpd(8), dhclient(8), RFC2132, RFC2131, draft-
- ietf-dhc-agent-options-??.txt.
+ option contrived-001 code 201 = { boolean, integer 32, text };
+ option contrived-001 on 1772 "contrivance";
-A\bAU\bUT\bTH\bHO\bOR\bR
- The Internet Software Consortium DHCP Distribution was
- 13
+ 16
dhcpd-options(5) dhcpd-options(5)
- written by Ted Lemon <mellon@isc.org> under a contract
- with Vixie Labs. Funding for this project was provided
- through the Internet Software Consortium. Information
- 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.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ It's also possible to have options that are arrays of
+ records, for example:
+ option new-static-routes code 201 = array of {
+ ip-address, ip-address, ip-address, integer 8 };
+ option static-routes
+ 10.0.0.0 255.255.255.0 net-0-rtr.example.com 1,
+ 10.0.1.0 255.255.255.0 net-1-rtr.example.com 1,
+ 10.2.0.0 255.255.224.0 net-2-0-rtr.example.com 3;
+V\bVE\bEN\bND\bDO\bOR\bR E\bEN\bNC\bCA\bAP\bPS\bSU\bUL\bLA\bAT\bTE\bED\bD O\bOP\bPT\bTI\bIO\bON\bNS\bS
+ The DHCP protocol defines the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs
+ option, which allows vendors to define their own options
+ that will be sent encapsulated in a standard DHCP option.
+ The format of the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option is
+ either a series of bytes whose format is not specified, or
+ a sequence of options, each of which consists of a single-
+ byte vendor-specific option code, followed by a single-
+ byte length, followed by as many bytes of data as are
+ specified in the length (the length does not include
+ itself or the option code).
+ The value of this option can be set in one of two ways.
+ The first way is to simply specify the data directly,
+ using a text string or a colon-seperated list of hexadeciÂ
+ mal values. For example:
+ option vendor-encapsulated-options
+ 2:4:AC:11:41:1:
+ 3:12:73:75:6e:64:68:63:70:2d:73:65:72:76:65:72:31:37:2d:31:
+ 4:12:2f:65:78:70:6f:72:74:2f:72:6f:6f:74:2f:69:38:36:70:63;
+ The second way of setting the value of this option is to
+ have the DHCP server generate a vendor-specific option
+ buffer. To do this, you must do four things: define an
+ option space, define some options in that option space,
+ provide values for them, and specify that that option
+ space should be used to generate the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-
+ o\bop\bpt\bti\bio\bon\bns\bs option.
+ To define a new option space in which vendor options can
+ be stored, use the option space statement:
+ o\bop\bpt\bti\bio\bon\bn s\bsp\bpa\bac\bce\be _\bn_\ba_\bm_\be ;\b;
+ The name can then be used in option definitions, as
+ described earlier in this document. For example:
+ option space SUNW;
+ option SUNW.server-address code 2 = ip-address;
+ option SUNW.server-name code 3 = text;
+ option SUNW.root-path code 4 = text;
+ 17
+dhcpd-options(5) dhcpd-options(5)
+ Once you have defined an option space and the format of
+ some options, you can set up scopes that define values for
+ those options, and you can say when to use them. For
+ example, suppose you want to handle two different classes
+ of clients. Using the option space definition shown in
+ the previous example, you can send different option values
+ to different clients based on the vendor-class-identifier
+ option that the clients send, as follows:
+
+ class "vendor-classes" {
+ match option vendor-class-identifier;
+ }
+
+ option SUNW.server-address 172.17.65.1;
+ option SUNW.server-name "sundhcp-server17-1";
+
+ subclass "vendor-classes" "SUNW.Ultra-5_10" {
+ vendor-option-space SUNW;
+ option SUNW.root-path "/export/root/sparc";
+ }
+
+ subclass "vendor-classes" "SUNW.i86pc" {
+ vendor-option-space SUNW;
+ option SUNW.root-path "/export/root/i86pc";
+ }
+
+ As you can see in the preceding example, regular scoping
+ rules apply, so you can define values that are global in
+ the global scope, and only define values that are specific
+ to a particular class in the local scope. The v\bve\ben\bnd\bdo\bor\br-\b-
+ o\bop\bpt\bti\bio\bon\bn-\b-s\bsp\bpa\bac\bce\be declaration tells the DHCP server to use
+ options in the SUNW option space to construct the v\bve\ben\bnd\bdo\bor\br-\b-
+ e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option.
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+ dhcpd.conf(5), dhcpd.leases(5), dhclient.conf(5), dhcp-
+ eval(5), dhcpd(8), dhclient(8), RFC2132, RFC2131, draft-
+ ietf-dhc-agent-options-??.txt.
+A\bAU\bUT\bTH\bHO\bOR\bR
+ The Internet Software Consortium DHCP Distribution was
+ written by Ted Lemon <mellon@isc.org> under a contract
+ with Vixie Labs. Funding for this project was provided
+ through the Internet Software Consortium. Information
+ 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.
- 14
+ 18
#ifndef lint
static char copyright[] =
-"$Id: discover.c,v 1.19 2000/01/25 01:04:21 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: discover.c,v 1.20 2000/01/26 14:55:33 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
/* If there isn't already an interface by this name,
allocate one. */
if (!tmp) {
- tmp = ((struct interface_info *)
- dmalloc (sizeof *tmp, "discover_interfaces"));
+ tmp = ((struct interface_info *) dmalloc (sizeof *tmp,
+ MDL));
if (!tmp)
log_fatal ("Insufficient memory to %s %s",
"record interface", ifp -> ifr_name);
#else
unsigned len = sizeof *ifp;
#endif
- tif = (struct ifreq *)malloc (len);
+ tif = (struct ifreq *)dmalloc (len, MDL);
if (!tif)
log_fatal ("no space for ifp.");
memcpy (tif, ifp, len);
if (!tmp -> ifp) {
/* Make up an ifreq structure. */
- tif = (struct ifreq *)malloc (sizeof (struct ifreq));
+ tif = (struct ifreq *)dmalloc (sizeof (struct ifreq),
+ MDL);
if (!tif)
log_fatal ("no space to remember ifp.");
memset (tif, 0, sizeof (struct ifreq));
struct interface_info *setup_fallback ()
{
- fallback_interface =
- ((struct interface_info *)
- dmalloc (sizeof *fallback_interface, "discover_interfaces"));
+ fallback_interface = ((struct interface_info *)
+ dmalloc (sizeof *fallback_interface, MDL));
if (!fallback_interface)
log_fatal ("No memory to record fallback interface.");
memset (fallback_interface, 0, sizeof *fallback_interface);
strcpy (fallback_interface -> name, "fallback");
- fallback_interface -> shared_network =
- new_shared_network ("parse_statement");
+ fallback_interface -> shared_network = new_shared_network (MDL);
if (!fallback_interface -> shared_network)
log_fatal ("No memory for shared subnet");
memset (fallback_interface -> shared_network, 0,
return ISC_R_NOTFOUND;
}
-isc_result_t interface_destroy (omapi_object_t *h, const char *name)
+isc_result_t interface_destroy (omapi_object_t *h, const char *file, int line)
{
int i;
#ifndef lint
static char copyright[] =
-"$Id: dispatch.c,v 1.58 1999/10/04 23:46:30 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dispatch.c,v 1.59 2000/01/26 14:55:33 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
q -> func = where;
q -> what = what;
} else {
- q = (struct timeout *)malloc (sizeof (struct timeout));
+ q = ((struct timeout *)
+ dmalloc (sizeof (struct timeout), MDL));
if (!q)
log_fatal ("add_timeout: no memory!");
q -> func = where;
#ifndef lint
static char copyright[] =
-"$Id: dns.c,v 1.13 2000/01/05 18:00:51 mellon Exp $ Copyright (c) 1997 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dns.c,v 1.14 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1997 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
}
if (q || !new) {
if (new)
- free (question);
+ dfree (question, MDL);
return q;
}
/* Allocate and zap a new query. */
- q = (struct dns_query *)malloc (sizeof (struct dns_query));
+ q = (struct dns_query *)dmalloc (sizeof (struct dns_query), MDL);
memset (q, 0, sizeof *q);
/* All we need to set up is the question and the hash. */
/* Free up attached free data. */
if (query -> question)
- free (query -> question);
+ dfree (query -> question, MDL);
if (query -> answer)
- free (query -> answer);
+ dfree (query -> answer, MDL);
if (query -> query)
- free (query -> query);
+ dfree (query -> query, MDL);
/* Remove query from hash table. */
if (dns_query_hash [query -> hash] == query)
}
/* Free the query structure. */
- free (query);
+ dfree (query, MDL);
}
/* ns_inaddr_lookup constructs a PTR lookup query for an internet address -
inaddr.iabuf [0], inaddr.iabuf [1],
inaddr.iabuf [2], inaddr.iabuf [3]);
- question = (struct dns_question *)malloc (strlen ((char *)query) +
- sizeof *question);
+ question = (struct dns_question *)dmalloc (strlen ((char *)query) +
+ sizeof *question, MDL);
if (!question)
return (struct dns_query *)-1;
question -> type = T_PTR;
/* If the query won't fit, don't bother setting it up. */
if (len > 255) {
- free (question);
+ dfree (question, MDL);
return (struct dns_query *)-1;
}
query -> len = s - buf;
/* Save the raw query data. */
- query -> query = malloc (len);
+ query -> query = dmalloc (len, MDL);
if (!query -> query) {
destroy_dns_query (query);
return (struct dns_query *)-1;
#ifndef lint
static char copyright[] =
-"$Id: execute.c,v 1.23 2000/01/25 01:07:00 mellon Exp $ Copyright (c) 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: execute.c,v 1.24 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
+#include <omapip/omapip_p.h>
int execute_statements (packet, lease, in_options, out_options, scope,
statements)
if (r -> data.on.evtypes & ON_EXPIRY) {
if (lease -> on_expiry)
executable_statement_dereference
- (&lease -> on_expiry,
- "execute_statements");
+ (&lease -> on_expiry, MDL);
if (r -> data.on.statements)
executable_statement_reference
(&lease -> on_expiry,
- r -> data.on.statements,
- "execute_statements");
+ r -> data.on.statements, MDL);
}
if (r -> data.on.evtypes & ON_RELEASE) {
if (lease -> on_release)
executable_statement_dereference
- (&lease -> on_release,
- "execute_statements");
+ (&lease -> on_release, MDL);
if (r -> data.on.statements)
executable_statement_reference
(&lease -> on_release,
- r -> data.on.statements,
- "execute_statements");
+ r -> data.on.statements, MDL);
}
if (r -> data.on.evtypes & ON_COMMIT) {
if (lease -> on_commit)
executable_statement_dereference
- (&lease -> on_commit,
- "execute_statements");
+ (&lease -> on_commit, MDL);
if (r -> data.on.statements)
executable_statement_reference
(&lease -> on_commit,
- r -> data.on.statements,
- "execute_statements");
+ r -> data.on.statements, MDL);
}
}
break;
out_options, scope,
r -> data.eval));
if (status && ds.data)
- data_string_forget
- (&ds, "execute_statements");
+ data_string_forget (&ds, MDL);
} else if (is_dns_expression (r -> data.eval)) {
+#if defined (NSUPDATE)
ns_updrec *nut;
nut = 0;
status = (evaluate_dns_expression
r -> data.eval));
if (status) {
if (nut -> r_data) {
- dfree (nut -> r_data,
- "execute_statements");
+ dfree (nut -> r_data, MDL);
nut -> r_data = (char *)0;
}
if (nut -> r_dname) {
- dfree (nut -> r_dname,
- "execute_statements");
+ dfree (nut -> r_dname, MDL);
nut -> r_dname = (char *)0;
}
res_freeupdrec (nut);
}
+#endif
} else {
log_error ("%s: invalid expression type: %d",
"execute_statements",
binding = find_binding (scope, r -> data.set.name);
if (!binding && status) {
- binding = dmalloc (sizeof *binding,
- "execute_statements");
+ binding = dmalloc (sizeof *binding, MDL);
if (binding) {
binding -> name =
dmalloc (strlen
(r -> data.set.name + 1),
- "execute_statements");
+ MDL);
if (binding -> name) {
strcpy (binding -> name,
r -> data.set.name);
}
} else {
badalloc:
- dfree (binding, "execute_statements");
+ dfree (binding, MDL);
binding = (struct binding *)0;
}
}
if (binding) {
if (binding -> value.data)
data_string_forget (&binding -> value,
- "execute_statements");
+ MDL);
if (status)
data_string_copy (&binding -> value, &ds,
- "execute_statements");
+ MDL);
}
if (status)
- data_string_forget (&ds, "execute_statements");
+ data_string_forget (&ds, MDL);
#if defined (DEBUG_EXPRESSIONS)
log_debug ("exec: set %s = %s", r -> data.set.name,
(status && binding
binding = find_binding (scope, r -> data.unset);
if (binding) {
if (binding -> value.data)
- data_string_forget
- (&binding -> value,
- "execute_statements");
+ data_string_forget (&binding -> value,
+ MDL);
status = 1;
} else
status = 0;
scope, r -> data.let.expr));
ns = (struct binding_scope *)0;
- binding_scope_allocate (&ns, "execute_statements");
+ binding_scope_allocate (&ns, MDL);
next_let:
if (ns) {
- binding = dmalloc (sizeof *binding,
- "execute_statements");
+ binding = dmalloc (sizeof *binding, MDL);
if (!binding) {
blb:
- binding_scope_dereference
- (&ns, "execute_statements");
+ binding_scope_dereference (&ns, MDL);
} else {
binding -> name =
dmalloc (strlen
(r -> data.let.name + 1),
- "execute_statements");
+ MDL);
if (binding -> name)
strcpy (binding -> name,
r -> data.let.name);
else {
- dfree (binding, "execute_statements");
+ dfree (binding, MDL);
binding = (struct binding *)0;
goto blb;
}
}
}
if (ns && binding && status) {
- data_string_copy (&binding -> value, &ds,
- "execute_statements");
+ data_string_copy (&binding -> value, &ds, MDL);
binding -> next = ns -> bindings;
ns -> bindings = binding;
}
if (status)
- data_string_forget (&ds, "execute_statements");
+ data_string_forget (&ds, MDL);
#if defined (DEBUG_EXPRESSIONS)
log_debug ("exec: let %s = %s", r -> data.let.name,
(status && binding
ns, r -> data.let.statements);
}
if (ns)
- binding_scope_dereference
- (&ns, "execute_statements");
+ binding_scope_dereference (&ns, MDL);
break;
default:
/* Dereference or free any subexpressions of a statement being freed. */
-int executable_statement_dereference (ptr, name)
+int executable_statement_dereference (ptr, file, line)
struct executable_statement **ptr;
- const char *name;
+ const char *file;
+ int line;
{
struct executable_statement *bp;
if (!ptr || !*ptr) {
- log_error ("Null ptr in executable_statement_dereference: %s",
- name);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
}
if ((*ptr) -> refcnt < 0) {
- log_error ("option_state_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
}
if ((*ptr) -> next)
- executable_statement_dereference
- (&(*ptr) -> next, name);
+ executable_statement_dereference (&(*ptr) -> next, file, line);
switch ((*ptr) -> op) {
case statements_statement:
if ((*ptr) -> data.statements)
executable_statement_dereference
- (&(*ptr) -> data.statements, name);
+ (&(*ptr) -> data.statements, file, line);
break;
case on_statement:
if ((*ptr) -> data.on.statements)
executable_statement_dereference
- (&(*ptr) -> data.on.statements, name);
+ (&(*ptr) -> data.on.statements, file, line);
break;
case switch_statement:
if ((*ptr) -> data.s_switch.statements)
executable_statement_dereference
- (&(*ptr) -> data.on.statements, name);
+ (&(*ptr) -> data.on.statements, file, line);
if ((*ptr) -> data.s_switch.expr)
expression_dereference (&(*ptr) -> data.s_switch.expr,
- name);
+ file, line);
break;
case case_statement:
if ((*ptr) -> data.s_switch.expr)
expression_dereference (&(*ptr) -> data.c_case,
- name);
+ file, line);
break;
case if_statement:
if ((*ptr) -> data.ie.expr)
- expression_dereference (&(*ptr) -> data.ie.expr, name);
+ expression_dereference (&(*ptr) -> data.ie.expr,
+ file, line);
if ((*ptr) -> data.ie.true)
executable_statement_dereference
- (&(*ptr) -> data.ie.true, name);
+ (&(*ptr) -> data.ie.true, file, line);
if ((*ptr) -> data.ie.false)
executable_statement_dereference
- (&(*ptr) -> data.ie.false, name);
+ (&(*ptr) -> data.ie.false, file, line);
break;
case eval_statement:
if ((*ptr) -> data.eval)
- expression_dereference (&(*ptr) -> data.eval, name);
+ expression_dereference (&(*ptr) -> data.eval,
+ file, line);
break;
case set_statement:
if ((*ptr)->data.set.name)
- dfree ((*ptr)->data.set.name, name);
+ dfree ((*ptr)->data.set.name, file, line);
if ((*ptr)->data.set.expr)
expression_dereference (&(*ptr) -> data.set.expr,
- name);
+ file, line);
break;
case unset_statement:
if ((*ptr)->data.unset)
- dfree ((*ptr)->data.unset, name);
+ dfree ((*ptr)->data.unset, file, line);
break;
case supersede_option_statement:
case prepend_option_statement:
if ((*ptr) -> data.option)
option_cache_dereference (&(*ptr) -> data.option,
- name);
+ file, line);
break;
default:
break;
}
- dfree ((*ptr), name);
+ dfree ((*ptr), file, line);
*ptr = (struct executable_statement *)0;
return 1;
}
if (sub && cd.len == ds.len &&
!memcmp (cd.data, ds.data, cd.len))
{
- data_string_forget
- (&cd, "execute_statements");
- data_string_forget
- (&ds, "execute_statements");
+ data_string_forget (&cd, MDL);
+ data_string_forget (&ds, MDL);
return s -> next;
}
- data_string_forget (&cd, "execute_statements");
+ data_string_forget (&cd, MDL);
}
}
- data_string_forget (&ds, "execute_statements");
+ data_string_forget (&ds, MDL);
}
} else {
unsigned long n, c;
#ifndef lint
static char copyright[] =
-"$Id: hash.c,v 1.15 1999/10/07 06:35:42 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: hash.c,v 1.16 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
struct hash_table *new_hash ()
{
- struct hash_table *rv = new_hash_table (DEFAULT_HASH_SIZE, "new_hash");
+ struct hash_table *rv = new_hash_table (DEFAULT_HASH_SIZE, MDL);
if (!rv)
return rv;
memset (&rv -> buckets [0], 0,
len = strlen ((const char *)name);
hashno = do_hash (name, len, table -> hash_count);
- bp = new_hash_bucket ("add_hash");
+ bp = new_hash_bucket (MDL);
if (!bp) {
log_error ("Can't add %s to hash table.", name);
} else {
table -> buckets [hashno] = bp -> next;
}
- free_hash_bucket (bp, "delete_hash_entry");
+ free_hash_bucket (bp, MDL);
break;
}
pbp = bp; /* jwg, 9/6/96 - nice catch! */
#ifndef lint
static char copyright[] =
-"$Id: icmp.c,v 1.16 2000/01/05 18:01:41 mellon Exp $ Copyright (c) 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
+"$Id: icmp.c,v 1.17 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
log_fatal ("Can't register icmp object type: %s",
isc_result_totext (result));
- new = (struct icmp_state *)dmalloc (sizeof *new, "icmp_startup");
+ new = (struct icmp_state *)dmalloc (sizeof *new, MDL);
if (!new)
log_fatal ("Unable to allocate state for icmp protocol");
memset (new, 0, sizeof *new);
#ifndef lint
static char copyright[] =
-"$Id: memory.c,v 1.63 1999/10/07 06:35:42 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: memory.c,v 1.64 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
-struct group *clone_group (group, caller)
+struct group *clone_group (group, file, line)
struct group *group;
- const char *caller;
+ const char *file;
+ int line;
{
- struct group *g = new_group (caller);
+ struct group *g = new_group (file, line);
if (!g)
- log_fatal ("%s: can't allocate new group", caller);
+ log_fatal ("%s(%d): can't allocate new group", file, line);
*g = *group;
g -> statements = (struct executable_statement *)0;
g -> next = group;
DHCP options parsing and reassembly. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char copyright[] =
-"$Id: options.c,v 1.51 2000/01/25 01:09:06 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: options.c,v 1.52 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#define DHCP_OPTION_DATA
#include "dhcpd.h"
+#include <omapip/omapip_p.h>
static void do_option_set PROTO ((pair *,
struct option_cache *,
rc_register (file, line, *ptr, (*ptr) -> refcnt);
if (!(*ptr) -> refcnt) {
if ((*ptr) -> data.buffer)
- data_string_forget (&(*ptr) -> data, name);
+ data_string_forget (&(*ptr) -> data, file, line);
if ((*ptr) -> expression)
- expression_dereference (&(*ptr) -> expression, name);
+ expression_dereference (&(*ptr) -> expression,
+ file, line);
/* Put it back on the free list... */
(*ptr) -> expression = (struct expression *)free_option_caches;
free_option_caches = *ptr;
#ifndef lint
static char copyright[] =
-"$Id: parse.c,v 1.59 2000/01/25 01:13:21 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: parse.c,v 1.60 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
if (!uniform) {
if (!make_limit (&x, *expr, 4))
return 0;
- expression_dereference (expr,
- "parse_ip_addr_or_hostname");
+ expression_dereference (expr, MDL);
*expr = x;
}
} else if (token == NUMBER) {
(might) be an option code definition, so we'll create
an option structure just in case. */
if (allocate) {
- option = new_option ("parse_option_name");
+ option = new_option (MDL);
if (val == uname)
option -> name = val;
else {
skip_to_semi (cfile);
return;
}
- nu = new_universe ("parse_option_space_decl");
+ nu = new_universe (MDL);
if (!nu)
log_fatal ("No memory for new option space.");
token = next_token (&val, cfile);
} while (1);
- if (!buffer_allocate (&data -> buffer, tlen + ilen, "parse_cshl"))
+ if (!buffer_allocate (&data -> buffer, tlen + ilen, MDL))
log_fatal ("no memory to store octet data.");
data -> data = &data -> buffer -> data [0];
data -> len = tlen + ilen;
*lose = 1;
return 0;
}
- if (!executable_statement_allocate
- (result, "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = add_statement;
(*result) -> data.add = cta;
*lose = 1;
return 0;
}
- if (!executable_statement_allocate
- (result, "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = break_statement;
break;
cache = (struct option_cache *)0;
if (!parse_allow_deny (&cache, cfile, flag))
return 0;
- if (!executable_statement_allocate
- (result, "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = supersede_option_statement;
(*result) -> data.option = cache;
*lose = 1;
return 0;
} else {
- if (!executable_statement_allocate
- (result,
- "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for default statement.");
(*result) -> op = default_statement;
return 1;
return 0;
}
- if (!executable_statement_allocate
- (result,
- "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for set statement.");
(*result) -> op = set_statement;
(*result) -> data.set.name = dmalloc (strlen (val) + 1, MDL);
else
*lose = 1;
skip_to_semi (cfile);
- executable_statement_dereference
- (result, "parse_executable_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
parse_semi (cfile);
return 0;
}
- if (!executable_statement_allocate
- (result,
- "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for set statement.");
(*result) -> op = unset_statement;
(*result) -> data.unset = dmalloc (strlen (val) + 1, MDL);
case EVAL:
token = next_token (&val, cfile);
- if (!executable_statement_allocate
- (result,
- "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for eval statement.");
(*result) -> op = eval_statement;
else
*lose = 1;
skip_to_semi (cfile);
- executable_statement_dereference
- (result, "parse_executable_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
parse_semi (cfile);
enum dhcp_token token;
const char *val;
- if (!executable_statement_allocate (result,
- "parse_executable_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = on_statement;
parse_warn (cfile, "expecting a lease event type");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference
- (result, "parse_on_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
token = next_token (&val, cfile);
parse_warn (cfile, "left brace expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference (result,
- "parse_on_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
if (!parse_executable_statements (&(*result) -> data.on.statements,
do {
token = next_token (&val, cfile);
} while (token != EOF && token != RBRACE);
- executable_statement_dereference
- (result, "parse_on_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
}
parse_warn (cfile, "right brace expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference
- (result, "parse_on_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
return 1;
enum dhcp_token token;
const char *val;
- if (!executable_statement_allocate (result,
- "parse_switch_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = switch_statement;
*lose = 1;
skip_to_semi (cfile);
gnorf:
- executable_statement_dereference (result,
- "parse_switch_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
? context_data : context_numeric)))) {
if (*lose) {
skip_to_rbrace (cfile, 1);
- executable_statement_dereference
- (result, "parse_switch_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
}
enum dhcp_token token;
const char *val;
- if (!executable_statement_allocate (result,
- "parse_switch_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for new statement.");
(*result) -> op = case_statement;
pfui:
*lose = 1;
skip_to_semi (cfile);
- executable_statement_dereference (result,
- "parse_switch_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
const char *val;
int parenp;
- if (!executable_statement_allocate (result, "parse_if_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for if statement.");
(*result) -> op = if_statement;
cfile, lose)) {
if (!*lose)
parse_warn (cfile, "boolean expression expected.");
- executable_statement_dereference (result,
- "parse_if_statement");
+ executable_statement_dereference (result, MDL);
*lose = 1;
return 0;
}
if (token != RPAREN) {
parse_warn (cfile, "expecting right paren.");
*lose = 1;
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
}
parse_warn (cfile, "left brace expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference (result,
- "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
if (!parse_executable_statements (&(*result) -> data.ie.true,
do {
token = next_token (&val, cfile);
} while (token != EOF && token != RBRACE);
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
}
parse_warn (cfile, "right brace expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
token = peek_token (&val, cfile);
cfile, lose)) {
if (!*lose)
parse_warn (cfile,
- "expecting conditional.");
- executable_statement_dereference
- (result, "parse_if_statement");
+ "expecting if statement");
+ executable_statement_dereference (result, MDL);
*lose = 1;
return 0;
}
parse_warn (cfile, "left brace or if expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
} else {
token = next_token (&val, cfile);
if (!(parse_executable_statements
(&(*result) -> data.ie.false,
cfile, lose, context_any))) {
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
token = next_token (&val, cfile);
parse_warn (cfile, "right brace expected.");
skip_to_semi (cfile);
*lose = 1;
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
return 0;
}
}
if (!*lose)
parse_warn (cfile,
"expecting conditional.");
- executable_statement_dereference
- (result, "parse_if_statement");
+ executable_statement_dereference (result, MDL);
*lose = 1;
return 0;
}
if (!is_boolean_expression (*expr)) {
parse_warn (cfile, "Expecting a boolean expression.");
*lose = 1;
- expression_dereference (expr, "parse_boolean_expression");
+ expression_dereference (expr, MDL);
return 0;
}
return 1;
*lose = 1;
return 0;
}
- if (!expression_allocate (expr, "parse_expression: CHECK"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_check;
(*expr) -> data.check = col;
token = peek_token (&val, cfile);
goto not_exists;
}
- if (!expression_allocate (expr, "parse_expression: NOT"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_not;
if (!parse_non_binary (&(*expr) -> data.not,
skip_to_semi (cfile);
}
*lose = 1;
- expression_dereference (expr, "parse_expression: NOT");
+ expression_dereference (expr, MDL);
return 0;
}
break;
if (context == context_dns)
goto ns_exists;
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: EXISTS"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_exists;
known = 0;
(*expr) -> data.option = parse_option_name (cfile, 0, &known);
if (!(*expr) -> data.option) {
*lose = 1;
- expression_dereference (expr,
- "parse_expression: EXISTS");
+ expression_dereference (expr, MDL);
return 0;
}
break;
case STATIC:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: STATIC"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_static;
break;
case KNOWN:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: KNOWN"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_known;
break;
case SUBSTRING:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: SUBSTRING"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_substring;
token = next_token (&val, cfile);
if (token != LPAREN) {
nolparen:
- expression_dereference (expr,
- "parse_expression: nolparen");
+ expression_dereference (expr, MDL);
parse_warn (cfile, "left parenthesis expected.");
*lose = 1;
return 0;
if (!parse_data_expression (&(*expr) -> data.substring.expr,
cfile, lose)) {
nodata:
- expression_dereference (expr,
- "parse_expression: nodata");
+ expression_dereference (expr, MDL);
parse_warn (cfile, "expecting data expression.");
skip_to_semi (cfile);
*lose = 1;
token = next_token (&val, cfile);
if (token != COMMA) {
nocomma:
- expression_dereference (expr,
- "parse_expression: nocomma1");
+ expression_dereference (expr, MDL);
parse_warn (cfile, "comma expected.");
*lose = 1;
skip_to_semi (cfile);
*lose = 1;
}
- expression_dereference (expr,
- "parse_expression: nonum");
+ expression_dereference (expr, MDL);
return 0;
}
norparen:
parse_warn (cfile, "right parenthesis expected.");
*lose = 1;
- expression_dereference (expr,
- "parse_expression: norparen");
+ expression_dereference (expr, MDL);
return 0;
}
break;
case SUFFIX:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: SUFFIX"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_suffix;
case CONCAT:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: CONCAT"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_concat;
if (token == COMMA) {
nexp = (struct expression *)0;
- if (!expression_allocate (&nexp,
- "parse_expression: CONCAT2"))
+ if (!expression_allocate (&nexp, MDL))
log_fatal ("can't allocate at CONCAT2");
nexp -> op = expr_concat;
- expression_reference (&nexp -> data.concat [0], *expr,
- "parse_expression: CONCAT2");
- expression_dereference (expr,
- "parse_expression: CONCAT2");
- expression_reference (expr, nexp,
- "parse_expression: CONCAT2");
+ expression_reference (&nexp -> data.concat [0],
+ *expr, MDL);
+ expression_dereference (expr, MDL);
+ expression_reference (expr, nexp, MDL);
goto concat_another;
}
case BINARY_TO_ASCII:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: B2A"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_binary_to_ascii;
case REVERSE:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: REVERSE"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_reverse;
/* pick (a, b, c) actually produces an internal representation
that looks like pick (a, pick (b, pick (c, nil))). */
token = next_token (&val, cfile);
- if (!(expression_allocate
- (expr, "parse_expression: PICK_FIRST_VALUE")))
+ if (!(expression_allocate (expr, MDL)))
log_fatal ("can't allocate expression");
token = next_token (&val, cfile);
if (token == COMMA) {
if (!(expression_allocate
(&nexp -> data.pick_first_value.cdr,
- "parse_expression: PICK_FIRST_VALUE")))
+ MDL)))
log_fatal ("can't allocate expr");
nexp = nexp -> data.pick_first_value.cdr;
}
goto badnsupdate;
}
- if (!expression_allocate (expr,
- "parse_expression: DNS_UPDATE"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
#if 0
(*expr) -> op = expr_funcall;
"Please rebuild dhcpd with --with-nsupdate.");
#endif
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: NS_UPDATE"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
token = next_token (&val, cfile);
(cfile,
"expecting dns expression.");
badnstrans:
- expression_dereference (expr,
- "parse_expression");
+ expression_dereference (expr, MDL);
*lose = 1;
return 0;
}
if (token == COMMA) {
if (!(expression_allocate
(&nexp -> data.dns_transaction.cdr,
- "parse_expression")))
+ MDL)))
log_fatal
("can't allocate expression");
nexp = nexp -> data.dns_transaction.cdr;
parse_warn (cfile,
"Please rebuild dhcpd with --with-nsupdate.");
#endif
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = opcode;
if (!is_identifier (token) && token != NUMBER) {
parse_warn (cfile, "expecting identifier or number.");
badnsop:
- expression_dereference (expr, "parse_expression");
+ expression_dereference (expr, MDL);
skip_to_semi (cfile);
*lose = 1;
return 0;
case OPTION:
case CONFIG_OPTION:
- if (!expression_allocate (expr, "parse_expression: OPTION"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = (token == OPTION
? expr_option
(*expr) -> data.option = parse_option_name (cfile, 0, &known);
if (!(*expr) -> data.option) {
*lose = 1;
- expression_dereference (expr,
- "parse_expression: OPTION");
+ expression_dereference (expr, MDL);
return 0;
}
break;
case HARDWARE:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: HARDWARE"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_hardware;
break;
case LEASED_ADDRESS:
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: LEASED_ADDRESS"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_leased_address;
break;
case FILENAME:
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: FILENAME"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_filename;
break;
case SERVER_NAME:
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: SERVER_NAME"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_sname;
break;
case LEASE_TIME:
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: LEASED_LEASE_TIME"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_lease_time;
break;
case TOKEN_NULL:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_null;
break;
case HOST_DECL_NAME:
token = next_token (&val, cfile);
- if (!expression_allocate (expr,
- "parse_expression: HOST_DECL_NAME"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_host_decl_name;
break;
if (token != RPAREN)
goto norparen;
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_variable_reference;
(*expr) -> data.variable =
case PACKET:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: PACKET"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_packet;
return 0;
}
- if (!expression_allocate (expr,
- "parse_expression: EXTRACT_INT"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
if (!parse_data_expression (&(*expr) -> data.extract_int,
parse_warn (cfile, "expecting data expression.");
skip_to_semi (cfile);
*lose = 1;
- expression_dereference
- (expr, "parse_expression: EXTRACT_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != COMMA) {
parse_warn (cfile, "comma expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: EXTRACT_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != NUMBER) {
parse_warn (cfile, "number expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: EXTRACT_INT");
+ expression_dereference (expr, MDL);
return 0;
}
switch (atoi (val)) {
"unsupported integer size %d", atoi (val));
*lose = 1;
skip_to_semi (cfile);
- expression_dereference
- (expr, "parse_expression: EXTRACT_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != RPAREN) {
parse_warn (cfile, "right parenthesis expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: EXTRACT_INT");
+ expression_dereference (expr, MDL);
return 0;
}
break;
return 0;
}
- if (!expression_allocate (expr,
- "parse_expression: ENCODE_INT"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
if (!parse_numeric_expression (&(*expr) -> data.encode_int,
parse_warn (cfile, "expecting numeric expression.");
skip_to_semi (cfile);
*lose = 1;
- expression_dereference
- (expr, "parse_expression: ENCODE_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != COMMA) {
parse_warn (cfile, "comma expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: ENCODE_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != NUMBER) {
parse_warn (cfile, "number expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: ENCODE_INT");
+ expression_dereference (expr, MDL);
return 0;
}
switch (atoi (val)) {
"unsupported integer size %d", atoi (val));
*lose = 1;
skip_to_semi (cfile);
- expression_dereference
- (expr, "parse_expression: ENCODE_INT");
+ expression_dereference (expr, MDL);
return 0;
}
if (token != RPAREN) {
parse_warn (cfile, "right parenthesis expected.");
*lose = 1;
- expression_dereference
- (expr, "parse_expression: ENCODE_INT");
+ expression_dereference (expr, MDL);
return 0;
}
break;
if (context == context_numeric ||
context == context_data_or_numeric) {
next_token (&val, cfile); /* Eat the number. */
- if (!expression_allocate (expr,
- "parse_expression: NUMBER"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_const_int;
(*expr) -> data.const_int = atoi (val);
}
case NUMBER_OR_NAME:
- if (!expression_allocate (expr,
- "parse_expression: NUMBER_OR_NAME"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_const_data;
if (!parse_cshl (&(*expr) -> data.const_data, cfile)) {
- expression_dereference (expr,
- "parse_expression: cshl");
+ expression_dereference (expr, MDL);
return 0;
}
break;
known = FORMERR;
ns_const:
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_const_int;
(*expr) -> data.const_int = known;
return 0;
}
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_variable_exists;
(*expr) -> data.variable = dmalloc (strlen (val) + 1, MDL);
return 0;
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_variable_reference;
(*expr) -> data.variable = dmalloc (strlen (val) + 1, MDL);
*lose = 1;
skip_to_semi (cfile);
}
- expression_dereference (&lhs, "parse_expression");
+ expression_dereference (&lhs, MDL);
}
return 0;
}
*lose = 1;
skip_to_semi (cfile);
if (lhs)
- expression_dereference (&lhs,
- "parse_expression");
+ expression_dereference (&lhs, MDL);
return 0;
}
next_op = expr_not_equal;
this subexpression, so combine it with the preceding binary
operator and return the result. */
if (next_op == expr_none) {
- if (!expression_allocate (expr,
- "parse_expression: COMBINE"))
+ if (!expression_allocate (expr, MDL))
log_fatal ("Can't allocate expression!");
(*expr) -> op = binop;
/* Now combine the LHS and the RHS using binop. */
tmp = (struct expression *)0;
- if (!expression_allocate (&tmp, "parse_expression: COMBINE2"))
+ if (!expression_allocate (&tmp, MDL))
log_fatal ("No memory for equal precedence combination.");
/* Store the LHS and RHS. */
if (!parse_option_token (&expr, cfile, fmt,
tmp, uniform, lookups)) {
if (tmp)
- expression_dereference
- (&tmp, "parse_option_statement");
+ expression_dereference (&tmp, MDL);
return 0;
}
if (tmp)
- expression_dereference
- (&tmp, "parse_option_statement");
+ expression_dereference (&tmp, MDL);
}
if (*fmt == 'A') {
token = peek_token (&val, cfile);
done:
if (!parse_semi (cfile))
return 0;
- if (!executable_statement_allocate (result, "parse_option_statement"))
+ if (!executable_statement_allocate (result, MDL))
log_fatal ("no memory for option statement.");
(*result) -> op = op;
if (expr && !option_cache (&(*result) -> data.option,
case 'X':
token = peek_token (&val, cfile);
if (token == NUMBER_OR_NAME || token == NUMBER) {
- if (!expression_allocate (&t, "parse_option_token"))
+ if (!expression_allocate (&t, MDL))
return 0;
if (!parse_cshl (&t -> data.const_data, cfile)) {
- expression_dereference
- (&t, "parse_option_token: X");
+ expression_dereference (&t, MDL);
return 0;
}
t -> op = expr_const_data;
if (expr) {
if (!make_concat (rv, expr, t))
return 0;
- expression_dereference (&t, "parse_option_token");
+ expression_dereference (&t, MDL);
} else
*rv = t;
return 1;
print_hex_1 (key_id -> len,
key_id -> data,
key_id -> len));
- data_string_forget (key_id, "parse_auth_key");
+ data_string_forget (key_id, MDL);
} else {
if (!parse_cshl (&key_data, cfile))
return 0;
key_id -> len));
old_key = key;
}
- new_key = new_auth_key (key_data.len, "parse_auth_key");
+ new_key = new_auth_key (key_data.len, MDL);
if (!new_key)
log_fatal ("No memory for key %s",
print_hex_1 (key_id -> len,
new_key -> length = key_data.len;
memcpy (new_key -> data, key_data.data, key_data.len);
enter_auth_key (key_id, new_key);
- data_string_forget (&key_data, "parse_auth_key");
+ data_string_forget (&key_data, MDL);
}
parse_semi (cfile);
return key_id -> len ? 1 : 0;
}
+
+int parse_warn (ANSI_DECL (struct parse *)cfile,
+ ANSI_DECL (const char *) fmt, VA_DOTDOTDOT)
+ KandR (struct parse *cfile;)
+ KandR (char *fmt;)
+ va_dcl
+{
+ va_list list;
+ static char spaces [] = " ";
+ char lexbuf [256];
+ char mbuf [1024];
+ char fbuf [1024];
+ unsigned i, lix;
+
+ do_percentm (mbuf, fmt);
+#ifndef NO_SNPRINTF
+ snprintf (fbuf, sizeof fbuf, "%s line %d: %s",
+ cfile -> tlname, cfile -> lexline, mbuf);
+#else
+ sprintf (fbuf, "%s line %d: %s",
+ cfile -> tlname, cfile -> lexline, mbuf);
+#endif
+
+ VA_start (list, fmt);
+ vsnprintf (mbuf, sizeof mbuf, fbuf, list);
+ va_end (list);
+
+ lix = 0;
+ for (i = 0;
+ cfile -> token_line [i] && i < (cfile -> lexchar - 1); i++) {
+ if (lix < (sizeof lexbuf) - 1)
+ lexbuf [lix++] = ' ';
+ if (cfile -> token_line [i] == '\t') {
+ for (lix;
+ lix < (sizeof lexbuf) - 1 && (lix & 7); lix++)
+ lexbuf [lix] = ' ';
+ }
+ }
+ lexbuf [lix] = 0;
+
+#ifndef DEBUG
+ syslog (log_priority | LOG_ERR, mbuf);
+ syslog (log_priority | LOG_ERR, cfile -> token_line);
+ if (cfile -> lexchar < 81)
+ syslog (log_priority | LOG_ERR, "%s^", lexbuf);
+#endif
+
+ if (log_perror) {
+ write (2, mbuf, strlen (mbuf));
+ write (2, "\n", 1);
+ write (2, cfile -> token_line, strlen (cfile -> token_line));
+ write (2, "\n", 1);
+ if (cfile -> lexchar < 81)
+ write (2, lexbuf, lix);
+ write (2, "^\n", 2);
+ }
+
+ cfile -> warnings_occurred = 1;
+
+ return 0;
+}
Turn data structures into printable text. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char copyright[] =
-"$Id: print.c,v 1.32 2000/01/25 01:14:26 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: print.c,v 1.33 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
break;
case expr_pick_first_value:
- if (len > 11) {
- rv = 9;
+ if (len > 8) {
+ rv = 6;
strcpy (buf, "(pick1st ");
rv += print_subexpression
(expr -> data.pick_first_value.car,
case expr_config_option:
s = "cfg-option";
- break;
+ goto dooption;
case expr_option:
s = "option";
s = "static";
goto astring;
+ case expr_filename:
+ s = "filename";
+ goto astring;
+
+ case expr_sname:
+ s = "server-name";
+ goto astring;
+
case expr_reverse:
if (len > 11) {
rv = 13;
#ifndef lint
static char copyright[] =
-"$Id: resolv.c,v 1.11 1999/10/21 12:32:16 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: resolv.c,v 1.12 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
break;
}
if (!nd) {
- nd = new_domain_search_list
- ("read_resolv_conf");
+ nd = new_domain_search_list (MDL);
if (!nd)
log_fatal ("No memory for %s",
dn);
break;
}
if (!ns) {
- ns = new_name_server ("read_resolv_conf");
+ ns = new_name_server (MDL);
if (!ns)
log_fatal ("No memory for nameserver %s",
piaddr (iaddr));
dl -> next = dp -> next;
else
domains = dp -> next;
- free_domain_search_list (dp, "pick_name_server");
+ free_domain_search_list (dp, MDL);
} else
dl = dp;
}
#ifndef lint
static char copyright[] =
-"$Id: tables.c,v 1.34 2000/01/08 01:38:04 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tables.c,v 1.35 2000/01/26 14:55:34 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
universe_max = 10;
universes = ((struct universe **)
- dmalloc (universe_max * sizeof (struct universe *),
- "initialize_universes"));
+ dmalloc (universe_max * sizeof (struct universe *), MDL));
if (!universes)
log_fatal ("Can't allocate option space table.");
memset (universes, 0, universe_max * sizeof (struct universe *));
#ifndef lint
static char copyright[] =
-"$Id: tree.c,v 1.68 2000/01/25 01:16:14 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tree.c,v 1.69 2000/01/26 14:55:35 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
+#include <omapip/omapip_p.h>
+
+struct binding_scope global_scope;
static int do_host_lookup PROTO ((struct data_string *,
struct dns_host_entry *));
return foo;
}
-int make_const_option_cache (oc, buffer, data, len, option, name)
+int make_const_option_cache (oc, buffer, data, len, option, file, line)
struct option_cache **oc;
struct buffer **buffer;
u_int8_t *data;
unsigned len;
struct option *option;
- const char *name;
+ const char *file;
+ int line;
{
struct buffer *bp;
*buffer = 0;
} else {
bp = (struct buffer *)0;
- if (!buffer_allocate (&bp, len, name)) {
- log_error ("%s: can't allocate buffer.", name);
+ if (!buffer_allocate (&bp, len, file, line)) {
+ log_error ("%s(%d): can't allocate buffer.",
+ file, line);
return 0;
}
}
- if (!option_cache_allocate (oc, name)) {
- log_error ("%s: can't allocate option cache.", name);
- buffer_dereference (&bp, name);
+ if (!option_cache_allocate (oc, file, line)) {
+ log_error ("%s(%d): can't allocate option cache.", file, line);
+ buffer_dereference (&bp, file, line);
return 0;
}
return 1;
}
+#if defined (NSUPDATE)
int evaluate_dns_expression (result, packet, lease, in_options,
cfg_options, scope, expr)
ns_updrec **result;
expr -> op);
return 0;
}
+#endif /* defined (NSUPDATE) */
int evaluate_boolean_expression (result, packet, lease, in_options,
cfg_options, scope, expr)
*result = 0;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("boolean: %s? = %s", expr -> variable,
- s0 ? "true" : "false";
+ s0 ? "true" : "false");
#endif
return 1;
case expr_leased_address:
case expr_null:
case expr_variable_reference:
+ case expr_filename:
+ case expr_sname:
log_error ("Data opcode in evaluate_boolean_expression: %d",
expr -> op);
return 0;
{
struct data_string data;
int status;
+#if defined (NSUPDATE)
ns_updrec *nut;
static struct __res_state res;
ns_updque uq;
static int inited;
+#endif
struct expression *cur, *next;
switch (expr -> op) {
return 0;
memset (&ds, 0, sizeof ds);
- if (!evaluate_option_cache (&ds, packet, lease,
- in_options, cfg_options, scope, oc))
+ if (!evaluate_option_cache (&ds, packet, lease, in_options,
+ cfg_options, scope, oc, file, line))
return 0;
if (ds.len) {
or FALSE if it failed. */
int evaluate_boolean_expression_result (ignorep, packet, lease, in_options,
- cfg_options, scope, expr, file, line)
+ cfg_options, scope, expr)
int *ignorep;
struct packet *packet;
struct lease *lease;
struct option_state *cfg_options;
struct binding_scope *scope;
struct expression *expr;
- const char *file;
- int line;
{
int result;
if (!evaluate_boolean_expression (&result, packet, lease,
in_options, cfg_options,
- scope, expr, file, line))
+ scope, expr))
return 0;
if (result == 2) {
/* Dereference an expression node, and if the reference count goes to zero,
dereference any data it refers to, and then free it. */
-void expression_dereference (eptr, name)
+void expression_dereference (eptr, file, line)
struct expression **eptr;
- const char *name;
+ const char *file;
+ int line;
{
struct expression *expr = *eptr;
if (expr -> refcnt > 0)
return;
if (expr -> refcnt < 0) {
- log_error ("expression_dereference: negative refcnt!");
+ log_error ("%s(%d): negative refcnt!", file, line);
#if defined (DEBUG_RC_HISTORY)
dump_rc_history ();
#endif
case expr_and:
case expr_or:
if (expr -> data.equal [0])
- expression_dereference (&expr -> data.equal [0], name);
+ expression_dereference (&expr -> data.equal [0],
+ file, line);
if (expr -> data.equal [1])
- expression_dereference (&expr -> data.equal [1], name);
+ expression_dereference (&expr -> data.equal [1],
+ file, line);
break;
case expr_substring:
if (expr -> data.substring.expr)
expression_dereference (&expr -> data.substring.expr,
- name);
+ file, line);
if (expr -> data.substring.offset)
expression_dereference (&expr -> data.substring.offset,
- name);
+ file, line);
if (expr -> data.substring.len)
expression_dereference (&expr -> data.substring.len,
- name);
+ file, line);
break;
case expr_suffix:
if (expr -> data.suffix.expr)
expression_dereference (&expr -> data.suffix.expr,
- name);
+ file, line);
if (expr -> data.suffix.len)
expression_dereference (&expr -> data.suffix.len,
- name);
+ file, line);
break;
case expr_not:
if (expr -> data.not)
- expression_dereference (&expr -> data.not, name);
+ expression_dereference (&expr -> data.not, file, line);
break;
case expr_packet:
if (expr -> data.packet.offset)
expression_dereference (&expr -> data.packet.offset,
- name);
+ file, line);
if (expr -> data.packet.len)
expression_dereference (&expr -> data.packet.len,
- name);
+ file, line);
break;
case expr_extract_int8:
case expr_extract_int32:
if (expr -> data.extract_int)
expression_dereference (&expr -> data.extract_int,
- name);
+ file, line);
break;
case expr_encode_int8:
case expr_encode_int32:
if (expr -> data.encode_int)
expression_dereference (&expr -> data.encode_int,
- name);
+ file, line);
break;
case expr_encapsulate:
case expr_const_data:
- data_string_forget (&expr -> data.const_data, name);
+ data_string_forget (&expr -> data.const_data, file, line);
break;
case expr_host_lookup:
if (expr -> data.host_lookup)
dns_host_entry_dereference (&expr -> data.host_lookup,
- name);
+ file, line);
break;
case expr_binary_to_ascii:
if (expr -> data.b2a.base)
- expression_dereference (&expr -> data.b2a.base, name);
+ expression_dereference (&expr -> data.b2a.base,
+ file, line);
if (expr -> data.b2a.width)
- expression_dereference (&expr -> data.b2a.width, name);
+ expression_dereference (&expr -> data.b2a.width,
+ file, line);
if (expr -> data.b2a.seperator)
expression_dereference (&expr -> data.b2a.seperator,
- name);
+ file, line);
if (expr -> data.b2a.buffer)
expression_dereference (&expr -> data.b2a.buffer,
- name);
+ file, line);
break;
case expr_pick_first_value:
if (expr -> data.pick_first_value.car)
- expression_dereference
- (&expr -> data.pick_first_value.car, name);
+ expression_dereference (&expr -> data.pick_first_value.car,
+ file, line);
if (expr -> data.pick_first_value.cdr)
- expression_dereference
- (&expr -> data.pick_first_value.cdr, name);
+ expression_dereference (&expr -> data.pick_first_value.cdr,
+ file, line);
break;
case expr_reverse:
if (expr -> data.reverse.width)
expression_dereference (&expr -> data.reverse.width,
- name);
+ file, line);
if (expr -> data.reverse.buffer)
expression_dereference
- (&expr -> data.reverse.buffer, name);
+ (&expr -> data.reverse.buffer, file, line);
break;
case expr_dns_transaction:
if (expr -> data.dns_transaction.car)
- expression_dereference
- (&expr -> data.dns_transaction.car, name);
+ expression_dereference (&expr -> data.dns_transaction.car,
+ file, line);
if (expr -> data.dns_transaction.cdr)
- expression_dereference
- (&expr -> data.dns_transaction.cdr, name);
+ expression_dereference (&expr -> data.dns_transaction.cdr,
+ file, line);
break;
case expr_ns_add:
if (expr -> data.ns_add.rrname)
expression_dereference (&expr -> data.ns_add.rrname,
- name);
+ file, line);
if (expr -> data.ns_add.rrdata)
expression_dereference (&expr -> data.ns_add.rrdata,
- name);
+ file, line);
if (expr -> data.ns_add.ttl)
expression_dereference (&expr -> data.ns_add.ttl,
- name);
+ file, line);
break;
case expr_ns_delete:
case expr_ns_not_exists:
if (expr -> data.ns_delete.rrname)
expression_dereference (&expr -> data.ns_delete.rrname,
- name);
+ file, line);
if (expr -> data.ns_delete.rrdata)
expression_dereference (&expr -> data.ns_delete.rrdata,
- name);
+ file, line);
break;
case expr_variable_reference:
case expr_variable_exists:
if (expr -> data.variable)
- dfree (expr -> data.variable, name);
+ dfree (expr -> data.variable, file, line);
break;
/* No subexpressions. */
return (struct binding *)0;
}
-int free_bindings (struct binding_scope *scope, const char *name)
+int free_bindings (struct binding_scope *scope, const char *file, int line)
{
struct binding *bp, *next;
for (bp = scope -> bindings; bp; bp = next) {
next = bp -> next;
if (bp -> name)
- dfree (bp -> name, name);
+ dfree (bp -> name, file, line);
if (bp -> value.data)
- data_string_forget (&bp -> value, name);
- dfree (bp, name);
+ data_string_forget (&bp -> value, file, line);
+ dfree (bp, file, line);
}
scope -> bindings = (struct binding *)0;
return 1;
}
-int binding_scope_dereference (ptr, name)
+int binding_scope_dereference (ptr, file, line)
struct binding_scope **ptr;
- const char *name;
+ const char *file;
+ int line;
{
struct binding_scope *bp;
if (!ptr || !*ptr) {
- log_error ("Null pointer in binding_scope_dereference: %s",
- name);
+ log_error ("%s(%d): null pointer", file, line);
#if defined (POINTER_DEBUG)
abort ();
#else
}
if ((*ptr) -> bindings)
- free_bindings (*ptr, name);
- dfree ((*ptr), name);
+ free_bindings (*ptr, file, line);
+ dfree ((*ptr), file, line);
*ptr = (struct binding_scope *)0;
return 1;
}
The dhcpctl callback object. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
omapi_object_t *inner;
isc_result_t status;
- callback = malloc (sizeof *callback);
+ callback = dmalloc (sizeof *callback, MDL);
if (!callback)
return ISC_R_NOMEMORY;
/* Tie the callback object to the innermost object in the chain. */
for (inner = h; inner -> inner; inner = inner -> inner)
;
- omapi_object_reference (&inner -> inner, (omapi_object_t *)callback,
- "dhcpctl_set_callback");
- omapi_object_reference ((omapi_object_t **)&callback -> outer, inner,
- "dhcpctl_set_callback");
+ omapi_object_reference (&inner -> inner,
+ (omapi_object_t *)callback, MDL);
+ omapi_object_reference ((omapi_object_t **)&callback -> outer,
+ inner, MDL);
/* Save the actual handle pointer we were passed for the callback. */
- omapi_object_reference (&callback -> object, h,
- "dhcpctl_set_callback");
+ omapi_object_reference (&callback -> object, h, MDL);
callback -> data = data;
callback -> callback = func;
return ISC_R_SUCCESS;
}
-isc_result_t dhcpctl_callback_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcpctl_callback_destroy (omapi_object_t *h,
+ const char *file, int line)
{
dhcpctl_callback_object_t *p;
if (h -> type != dhcpctl_callback_type)
p = (dhcpctl_callback_object_t *)h;
if (p -> handle)
omapi_object_dereference ((omapi_object_t **)&p -> handle,
- name);
+ file, line);
return ISC_R_SUCCESS;
}
Subroutines providing general support for objects. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
{
isc_result_t status;
- status = omapi_generic_new (connection, "dhcpctl_connect");
+ status = omapi_generic_new (connection, MDL);
if (status != ISC_R_SUCCESS) {
return status;
}
status = omapi_protocol_connect (*connection, server_name,
(unsigned)port, authinfo);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (connection, "dhcpctl_connect");
+ omapi_object_dereference (connection, MDL);
return status;
}
status = omapi_wait_for_completion (*connection, 0);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (connection, "dhcpctl_connect");
+ omapi_object_dereference (connection, MDL);
return status;
}
break;
default:
- omapi_typed_data_dereference (&tv -> value,
- "dhcpctl_get_value");
+ omapi_typed_data_dereference (&tv -> value, MDL);
return ISC_R_UNEXPECTED;
}
- status = omapi_data_string_new (result, len, "dhcpctl_get_value");
+ status = omapi_data_string_new (result, len, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_typed_data_dereference (&tv -> value,
- "dhcpctl_get_value");
+ omapi_typed_data_dereference (&tv -> value, MDL);
return status;
}
break;
}
- omapi_value_dereference (&tv, "dhcpctl_get_value");
+ omapi_value_dereference (&tv, MDL);
return ISC_R_SUCCESS;
}
if (status != ISC_R_SUCCESS)
return status;
if (data -> len != sizeof rv) {
- omapi_data_string_dereference (&data, "dhcpctl_get_boolean");
+ omapi_data_string_dereference (&data, MDL);
return ISC_R_UNEXPECTED;
}
memcpy (&rv, data -> value, sizeof rv);
int len;
int ip;
- status = omapi_data_string_new (&name, strlen (value_name),
- "dhcpctl_set_value");
+ status = omapi_data_string_new (&name, strlen (value_name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (name -> value, value_name, strlen (value_name));
- status = omapi_typed_data_new (&tv, omapi_datatype_data,
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_data,
value -> len);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&name, "dhcpctl_set_value");
+ omapi_data_string_dereference (&name, MDL);
return status;
}
memcpy (tv -> u.buffer.value, value -> value, value -> len);
status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
- omapi_data_string_dereference (&name, "dhcpctl_set_value");
- omapi_typed_data_dereference (&tv, "dhcpctl_set_value");
+ omapi_data_string_dereference (&name, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&name, strlen (value_name),
- "dhcpctl_set_string_value");
+ status = omapi_data_string_new (&name, strlen (value_name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (name -> value, value_name, strlen (value_name));
- status = omapi_typed_data_new (&tv, omapi_datatype_string, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&name,
- "dhcpctl_set_string_value");
+ omapi_data_string_dereference (&name, MDL);
return status;
}
status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
- omapi_data_string_dereference (&name, "dhcpctl_set_string_value");
- omapi_typed_data_dereference (&tv, "dhcpctl_set_string_value");
+ omapi_data_string_dereference (&name, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&name, strlen (value_name),
- "dhcpctl_set_boolean_value");
+ status = omapi_data_string_new (&name, strlen (value_name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (name -> value, value_name, strlen (value_name));
- status = omapi_typed_data_new (&tv, omapi_datatype_int, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&name,
- "dhcpctl_set_boolean_value");
+ omapi_data_string_dereference (&name, MDL);
return status;
}
status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
- omapi_data_string_dereference (&name, "dhcpctl_set_boolean_value");
- omapi_typed_data_dereference (&tv, "dhcpctl_set_boolean_value");
+ omapi_data_string_dereference (&name, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&name, strlen (value_name),
- "dhcpctl_set_boolean_value");
+ status = omapi_data_string_new (&name, strlen (value_name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (name -> value, value_name, strlen (value_name));
- status = omapi_typed_data_new (&tv, omapi_datatype_int, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&name,
- "dhcpctl_set_boolean_value");
+ omapi_data_string_dereference (&name, MDL);
return status;
}
status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
- omapi_data_string_dereference (&name, "dhcpctl_set_boolean_value");
- omapi_typed_data_dereference (&tv, "dhcpctl_set_boolean_value");
+ omapi_data_string_dereference (&name, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
isc_result_t status;
omapi_object_t *message = (omapi_object_t *)0;
- status = omapi_message_new (&message, "dhcpctl_object_update");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_UPDATE);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_object_value (message, (omapi_object_t *)0,
"object", h);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_protocol_send_message (connection -> outer,
(omapi_object_t *)0,
message, (omapi_object_t *)0);
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
isc_result_t status;
omapi_object_t *message = (omapi_object_t *)0;
- status = omapi_message_new (&message, "dhcpctl_object_refresh");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_refresh");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_REFRESH);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_refresh");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"handle", (int)(h -> handle));
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_refresh");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_protocol_send_message (connection -> outer,
(omapi_object_t *)0,
message, (omapi_object_t *)0);
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
return ISC_R_INVALIDARG;
ro = (dhcpctl_remote_object_t *)h;
- status = omapi_message_new (&message, "dhcpctl_object_delete");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_delete");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_DELETE);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_delete");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0, "handle",
(int)(ro -> remote_handle));
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "dhcpctl_object_delete");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_object_value (message, (omapi_object_t *)0,
"notify-object", h);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_object_delete");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_protocol_send_message (connection -> outer,
(omapi_object_t *)0,
message, (omapi_object_t *)0);
- omapi_object_dereference (&message, "dhcpctl_object_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
isc_result_t dhcpctl_data_string_dereference (dhcpctl_data_string *vp,
- const char *name)
+ const char *file, int line)
{
- return omapi_data_string_dereference (vp, name);
+ return omapi_data_string_dereference (vp, file, line);
}
isc_result_t dhcpctl_callback_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcpctl_callback_destroy (omapi_object_t *, const char *);
+isc_result_t dhcpctl_callback_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcpctl_callback_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcpctl_callback_stuff_values (omapi_object_t *,
isc_result_t dhcpctl_remote_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcpctl_remote_destroy (omapi_object_t *, const char *);
+isc_result_t dhcpctl_remote_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcpctl_remote_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcpctl_remote_stuff_values (omapi_object_t *,
omapi_object_t *,
omapi_object_t *);
isc_result_t dhcpctl_data_string_dereference (dhcpctl_data_string *,
- const char *);
+ const char *, int);
#endif /* _DHCPCTL_H_ */
omapi_object_t *g;
isc_result_t status;
- m = malloc (sizeof *m);
+ m = dmalloc (sizeof *m, MDL);
if (!m)
return ISC_R_NOMEMORY;
memset (m, 0, sizeof *m);
m -> type = dhcpctl_remote_type;
m -> refcnt = 1;
+ rc_register_mdl (m, m -> refcnt);
g = (omapi_object_t *)0;
- status = omapi_generic_new (&g, "dhcpctl_new_object");
+ status = omapi_generic_new (&g, MDL);
if (status != ISC_R_SUCCESS) {
- free (m);
+ dfree (m, MDL);
return status;
}
- status = omapi_object_reference (&m -> inner, g, "dhcpctl_new_object");
+ status = omapi_object_reference (&m -> inner, g, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&m,
- "dhcpctl_new_object");
- omapi_object_dereference (&g, "dhcpctl_new_object");
+ omapi_object_dereference ((omapi_object_t **)&m, MDL);
+ omapi_object_dereference (&g, MDL);
return status;
}
status = omapi_object_reference (&g -> outer,
- (omapi_object_t *)m,
- "dhcpctl_new_object");
+ (omapi_object_t *)m, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&m,
- "dhcpctl_new_object");
- omapi_object_dereference (&g, "dhcpctl_new_object");
+ omapi_object_dereference ((omapi_object_t **)&m, MDL);
+ omapi_object_dereference (&g, MDL);
return status;
}
- status = omapi_typed_data_new (&m -> rtype,
+ status = omapi_typed_data_new (MDL, &m -> rtype,
omapi_datatype_string,
- object_type, "dhcpctl_new_object");
+ object_type);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&m,
- "dhcpctl_new_object");
- omapi_object_dereference (&g, "dhcpctl_new_object");
+ omapi_object_dereference ((omapi_object_t **)&m, MDL);
+ omapi_object_dereference (&g, MDL);
return status;
}
- status = omapi_object_reference (h, (omapi_object_t *)m,
- "dhcpctl_new_object");
- omapi_object_dereference ((omapi_object_t **)&m, "dhcpctl_new_object");
- omapi_object_dereference (&g, "dhcpctl_new_object");
+ status = omapi_object_reference (h, (omapi_object_t *)m, MDL);
+ omapi_object_dereference ((omapi_object_t **)&m, MDL);
+ omapi_object_dereference (&g, MDL);
if (status != ISC_R_SUCCESS)
return status;
return ISC_R_INVALIDARG;
remote = (dhcpctl_remote_object_t *)h;
- status = omapi_message_new (&message, "dhcpctl_open_object");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS)
return status;
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_OPEN);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_object_value (message, (omapi_object_t *)0,
"object", h);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
if (flags & DHCPCTL_CREATE) {
status = omapi_set_boolean_value (message, (omapi_object_t *)0,
"create", 1);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
status = omapi_set_boolean_value (message, (omapi_object_t *)0,
"update", 1);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
status = omapi_set_boolean_value (message, (omapi_object_t *)0,
"exclusive", 1);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
status = omapi_set_value_str (message, (omapi_object_t *)0,
"type", remote -> rtype);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
status = omapi_message_register (message);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
return omapi_protocol_send_message (connection -> outer,
if (!strcmp (name, "status")) {
p -> waitstatus = va_arg (ap, isc_result_t);
if (p -> message)
- omapi_typed_data_dereference
- (&p -> message,
- "dhcpctl_remote_signal_handler");
+ omapi_typed_data_dereference (&p -> message, MDL);
tv = va_arg (ap, omapi_typed_data_t *);
if (tv)
- omapi_typed_data_reference
- (&p -> message, tv,
- "dhcpctl_remote_signal_handler");
+ omapi_typed_data_reference (&p -> message, tv, MDL);
return omapi_signal_in (o -> inner, "ready");
}
return ISC_R_SUCCESS;
}
-isc_result_t dhcpctl_remote_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcpctl_remote_destroy (omapi_object_t *h,
+ const char *file, int line)
{
dhcpctl_remote_object_t *p;
if (h -> type != dhcpctl_remote_type)
p = (dhcpctl_remote_object_t *)h;
if (p -> handle)
omapi_object_dereference ((omapi_object_t **)&p -> handle,
- name);
+ file, line);
return ISC_R_SUCCESS;
}
#if 1
memset (&cid, 0, sizeof cid);
- status = omapi_data_string_new (&cid, 6, "main");
+ status = omapi_data_string_new (&cid, 6, MDL);
if (status != ISC_R_SUCCESS) {
fprintf (stderr, "omapi_data_string_new: %s\n",
isc_result_totext (status));
#if 0
memset (&ip_addr, 0, sizeof ip_addr);
- status = omapi_data_string_new (&ip_addr, 4, "main");
+ status = omapi_data_string_new (&ip_addr, 4, MDL);
if (status != ISC_R_SUCCESS) {
fprintf (stderr, "omapi_data_string_new: %s\n",
isc_result_totext (status));
}
memset (&ip_addr, 0, sizeof ip_addr);
- status = omapi_data_string_new (&ip_addr, 4, "main");
+ status = omapi_data_string_new (&ip_addr, 4, MDL);
if (status != ISC_R_SUCCESS) {
fprintf (stderr, "omapi_data_string_new: %s\n",
isc_result_totext (status));
printf (":%02x", identifier -> value [i]);
}
putchar ('\n');
- dhcpctl_data_string_dereference (&identifier, "main");
+ dhcpctl_data_string_dereference (&identifier, MDL);
status = dhcpctl_get_value (&identifier, lease_handle,
"hardware-type");
if (status == ISC_R_SUCCESS) {
printf ("lease hardware type = %d\n",
identifier -> value [0]);
dhcpctl_data_string_dereference (&identifier,
- "main");
+ MDL);
}
} else {
printf ("Unable to find identifier for lease.\n");
/*
- * ++Copyright++ 1983, 1989, 1993
- * -
* Copyright (c) 1983, 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* 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.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
+ */
+
+/*
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
- * -
- * --Copyright--
*/
/*
- * @(#)nameser.h 8.1 (Berkeley) 6/2/93
- * $Id: nameser.h,v 8.3 1995/08/21 01:27:12 vixie Exp
+ * $Id: nameser.h,v 1.2 2000/01/26 14:55:58 mellon Exp $
*/
-#ifndef _NAMESER_H_
-#define _NAMESER_H_
+#ifndef _ARPA_NAMESER_H_
+#define _ARPA_NAMESER_H_
+
+#define BIND_4_COMPAT
+
+#include <sys/param.h>
+#if (!defined(BSD)) || (BSD < 199306)
+# include <sys/bitypes.h>
+#else
+# include <sys/types.h>
+#endif
+#include <sys/cdefs.h>
/*
- * Define constants based on rfc883
+ * Revision information. This is the release date in YYYYMMDD format.
+ * It can change every day so the right thing to do with it is use it
+ * in preprocessor commands such as "#if (__NAMESER > 19931104)". Do not
+ * compare for equality; rather, use it to determine whether your libbind.a
+ * contains a new enough lib/nameser/ to support the feature you need.
*/
-#define PACKETSZ 512 /* maximum packet size */
-#define MAXDNAME 256 /* maximum domain name */
-#define MAXCDNAME 255 /* maximum compressed domain name */
-#define MAXLABEL 63 /* maximum length of domain label */
-#define HFIXEDSZ 12 /* #/bytes of fixed data in header */
-#define QFIXEDSZ 4 /* #/bytes of fixed data in query */
-#define RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
-#define INT32SZ 4 /* for systems without 32-bit ints */
-#define INT16SZ 2 /* for systems without 16-bit ints */
-#define INADDRSZ 4 /* for sizeof(struct inaddr) != 4 */
+
+#define __NAMESER 19991006 /* New interface version stamp. */
/*
- * Internet nameserver port number
+ * Define constants based on RFC 883, RFC 1034, RFC 1035
*/
-#define NAMESERVER_PORT 53
+#define NS_PACKETSZ 512 /* maximum packet size */
+#define NS_MAXDNAME 1025 /* maximum domain name */
+#define NS_MAXCDNAME 255 /* maximum compressed domain name */
+#define NS_MAXLABEL 63 /* maximum length of domain label */
+#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
+#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
+#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
+#define NS_INT32SZ 4 /* #/bytes of data in a u_int32_t */
+#define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */
+#define NS_INT8SZ 1 /* #/bytes of data in a u_int8_t */
+#define NS_INADDRSZ 4 /* IPv4 T_A */
+#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */
+#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
+#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
/*
- * Currently defined opcodes
+ * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord()
+ * in synch with it.
*/
-#define QUERY 0x0 /* standard query */
-#define IQUERY 0x1 /* inverse query */
-#define STATUS 0x2 /* nameserver status query */
-/*#define xxx 0x3*/ /* 0x3 reserved */
-#define NS_NOTIFY_OP 0x4 /* notify secondary of SOA change */
-#ifdef ALLOW_UPDATES
- /* non standard - supports ALLOW_UPDATES stuff from Mike Schwartz */
-# define UPDATEA 0x9 /* add resource record */
-# define UPDATED 0xa /* delete a specific resource record */
-# define UPDATEDA 0xb /* delete all named resource record */
-# define UPDATEM 0xc /* modify a specific resource record */
-# define UPDATEMA 0xd /* modify all named resource record */
-# define ZONEINIT 0xe /* initial zone transfer */
-# define ZONEREF 0xf /* incremental zone referesh */
-#endif
+typedef enum __ns_sect {
+ ns_s_qd = 0, /* Query: Question. */
+ ns_s_zn = 0, /* Update: Zone. */
+ ns_s_an = 1, /* Query: Answer. */
+ ns_s_pr = 1, /* Update: Prerequisites. */
+ ns_s_ns = 2, /* Query: Name servers. */
+ ns_s_ud = 2, /* Update: Update. */
+ ns_s_ar = 3, /* Query|Update: Additional records. */
+ ns_s_max = 4
+} ns_sect;
/*
- * Currently defined response codes
+ * This is a message handle. It is caller allocated and has no dynamic data.
+ * This structure is intended to be opaque to all but ns_parse.c, thus the
+ * leading _'s on the member names. Use the accessor functions, not the _'s.
*/
-#define NOERROR 0 /* no error */
-#define FORMERR 1 /* format error */
-#define SERVFAIL 2 /* server failure */
-#define NXDOMAIN 3 /* non existent domain */
-#define NOTIMP 4 /* not implemented */
-#define REFUSED 5 /* query refused */
-#ifdef ALLOW_UPDATES
- /* non standard */
-# define NOCHANGE 0xf /* update failed to change db */
-#endif
+typedef struct __ns_msg {
+ const u_char *_msg, *_eom;
+ u_int16_t _id, _flags, _counts[ns_s_max];
+ const u_char *_sections[ns_s_max];
+ ns_sect _sect;
+ int _rrnum;
+ const u_char *_ptr;
+} ns_msg;
+
+/* Private data structure - do not use from outside library. */
+struct _ns_flagdata { int mask, shift; };
+extern struct _ns_flagdata _ns_flagdata[];
+
+/* Accessor macros - this is part of the public interface. */
+#define ns_msg_getflag(handle, flag) ( \
+ ((handle)._flags & _ns_flagdata[flag].mask) \
+ >> _ns_flagdata[flag].shift \
+ )
+#define ns_msg_id(handle) ((handle)._id + 0)
+#define ns_msg_base(handle) ((handle)._msg + 0)
+#define ns_msg_end(handle) ((handle)._eom + 0)
+#define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
+#define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
+
+/*
+ * This is a parsed record. It is caller allocated and has no dynamic data.
+ */
+typedef struct __ns_rr {
+ char name[NS_MAXDNAME];
+ u_int16_t type;
+ u_int16_t rr_class;
+ u_int32_t ttl;
+ u_int16_t rdlength;
+ const u_char * rdata;
+} ns_rr;
+
+/* Accessor macros - this is part of the public interface. */
+#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
+#define ns_rr_type(rr) ((ns_type)((rr).type + 0))
+#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
+#define ns_rr_ttl(rr) ((rr).ttl + 0)
+#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
+#define ns_rr_rdata(rr) ((rr).rdata + 0)
/*
- * Type values for resources and queries
- */
-#define T_A 1 /* host address */
-#define T_NS 2 /* authoritative server */
-#define T_MD 3 /* mail destination */
-#define T_MF 4 /* mail forwarder */
-#define T_CNAME 5 /* canonical name */
-#define T_SOA 6 /* start of authority zone */
-#define T_MB 7 /* mailbox domain name */
-#define T_MG 8 /* mail group member */
-#define T_MR 9 /* mail rename name */
-#define T_NULL 10 /* null resource record */
-#define T_WKS 11 /* well known service */
-#define T_PTR 12 /* domain name pointer */
-#define T_HINFO 13 /* host information */
-#define T_MINFO 14 /* mailbox information */
-#define T_MX 15 /* mail routing information */
-#define T_TXT 16 /* text strings */
-#define T_RP 17 /* responsible person */
-#define T_AFSDB 18 /* AFS cell database */
-#define T_X25 19 /* X_25 calling address */
-#define T_ISDN 20 /* ISDN calling address */
-#define T_RT 21 /* router */
-#define T_NSAP 22 /* NSAP address */
-#define T_NSAP_PTR 23 /* reverse NSAP lookup (deprecated) */
-#define T_SIG 24 /* security signature */
-#define T_KEY 25 /* security key */
-#define T_PX 26 /* X.400 mail mapping */
-#define T_GPOS 27 /* geographical position (withdrawn) */
-#define T_AAAA 28 /* IP6 Address */
-#define T_LOC 29 /* Location Information */
- /* non standard */
-#define T_UINFO 100 /* user (finger) information */
-#define T_UID 101 /* user ID */
-#define T_GID 102 /* group ID */
-#define T_UNSPEC 103 /* Unspecified format (binary data) */
- /* Query type values which do not appear in resource records */
-#define T_AXFR 252 /* transfer zone of authority */
-#define T_MAILB 253 /* transfer mailbox records */
-#define T_MAILA 254 /* transfer mail agent records */
-#define T_ANY 255 /* wildcard match */
+ * These don't have to be in the same order as in the packet flags word,
+ * and they can even overlap in some cases, but they will need to be kept
+ * in synch with ns_parse.c:ns_flagdata[].
+ */
+typedef enum __ns_flag {
+ ns_f_qr, /* Question/Response. */
+ ns_f_opcode, /* Operation code. */
+ ns_f_aa, /* Authoritative Answer. */
+ ns_f_tc, /* Truncation occurred. */
+ ns_f_rd, /* Recursion Desired. */
+ ns_f_ra, /* Recursion Available. */
+ ns_f_z, /* MBZ. */
+ ns_f_ad, /* Authentic Data (DNSSEC). */
+ ns_f_cd, /* Checking Disabled (DNSSEC). */
+ ns_f_rcode, /* Response code. */
+ ns_f_max
+} ns_flag;
/*
- * Values for class field
+ * Currently defined opcodes.
*/
+typedef enum __ns_opcode {
+ ns_o_query = 0, /* Standard query. */
+ ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */
+ ns_o_status = 2, /* Name server status query (unsupported). */
+ /* Opcode 3 is undefined/reserved. */
+ ns_o_notify = 4, /* Zone change notification. */
+ ns_o_update = 5, /* Zone update message. */
+ ns_o_max = 6
+} ns_opcode;
-#define C_IN 1 /* the arpa internet */
-#define C_CHAOS 3 /* for chaos net (MIT) */
-#define C_HS 4 /* for Hesiod name server (MIT) (XXX) */
- /* Query class values which do not appear in resource records */
-#define C_ANY 255 /* wildcard match */
-
-/*
- * Status return codes for T_UNSPEC conversion routines
- */
-#define CONV_SUCCESS 0
-#define CONV_OVERFLOW (-1)
-#define CONV_BADFMT (-2)
-#define CONV_BADCKSUM (-3)
-#define CONV_BADBUFLEN (-4)
-
-/*
- * Structure for query header. The order of the fields is machine- and
- * compiler-dependent, depending on the byte/bit order and the layout
- * of bit fields. We use bit fields only in int variables, as this
- * is all ANSI requires. This requires a somewhat confusing rearrangement.
- */
-
-typedef struct {
- unsigned id :16; /* query identification number */
-#if BYTE_ORDER == BIG_ENDIAN
- /* fields in third byte */
- unsigned qr: 1; /* response flag */
- unsigned opcode: 4; /* purpose of message */
- unsigned aa: 1; /* authoritive answer */
- unsigned tc: 1; /* truncated message */
- unsigned rd: 1; /* recursion desired */
- /* fields in fourth byte */
- unsigned ra: 1; /* recursion available */
- unsigned pr:1; /* primary server required (non standard) */
- unsigned unused :2; /* unused bits (MBZ as of 4.9.3a3) */
- unsigned rcode :4; /* response code */
-#endif
-#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
- /* fields in third byte */
- unsigned rd :1; /* recursion desired */
- unsigned tc :1; /* truncated message */
- unsigned aa :1; /* authoritive answer */
- unsigned opcode :4; /* purpose of message */
- unsigned qr :1; /* response flag */
- /* fields in fourth byte */
- unsigned rcode :4; /* response code */
- unsigned unused :2; /* unused bits (MBZ as of 4.9.3a3) */
- unsigned pr:1; /* primary server required (non standard) */
- unsigned ra :1; /* recursion available */
-#endif
- /* remaining bytes */
- unsigned qdcount :16; /* number of question entries */
- unsigned ancount :16; /* number of answer entries */
- unsigned nscount :16; /* number of authority entries */
- unsigned arcount :16; /* number of resource entries */
-} HEADER;
+/*
+ * Currently defined response codes.
+ */
+typedef enum __ns_rcode {
+ ns_r_noerror = 0, /* No error occurred. */
+ ns_r_formerr = 1, /* Format error. */
+ ns_r_servfail = 2, /* Server failure. */
+ ns_r_nxdomain = 3, /* Name error. */
+ ns_r_notimpl = 4, /* Unimplemented. */
+ ns_r_refused = 5, /* Operation refused. */
+ /* these are for BIND_UPDATE */
+ ns_r_yxdomain = 6, /* Name exists */
+ ns_r_yxrrset = 7, /* RRset exists */
+ ns_r_nxrrset = 8, /* RRset does not exist */
+ ns_r_notauth = 9, /* Not authoritative for zone */
+ ns_r_notzone = 10, /* Zone of record different from zone section */
+ ns_r_max = 11,
+ /* The following are TSIG extended errors */
+ ns_r_badsig = 16,
+ ns_r_badkey = 17,
+ ns_r_badtime = 18
+} ns_rcode;
+
+/* BIND_UPDATE */
+typedef enum __ns_update_operation {
+ ns_uop_delete = 0,
+ ns_uop_add = 1,
+ ns_uop_max = 2
+} ns_update_operation;
/*
- * Defines for handling compressed domain names
+ * This structure is used for TSIG authenticated messages
*/
-#define INDIR_MASK 0xc0
+struct ns_tsig_key {
+ char name[NS_MAXDNAME], alg[NS_MAXDNAME];
+ unsigned char *data;
+ int len;
+};
+typedef struct ns_tsig_key ns_tsig_key;
/*
- * Structure for passing resource records around.
+ * This structure is used for TSIG authenticated TCP messages
*/
-struct rrec {
- int16_t r_zone; /* zone number */
- int16_t r_class; /* class number */
- int16_t r_type; /* type number */
- u_int32_t r_ttl; /* time to live */
- int r_size; /* size of data area */
- char *r_data; /* pointer to data */
+struct ns_tcp_tsig_state {
+ int counter;
+ struct dst_key *key;
+ void *ctx;
+ unsigned char sig[NS_PACKETSZ];
+ int siglen;
};
+typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
+
+#define NS_TSIG_FUDGE 300
+#define NS_TSIG_TCP_COUNT 100
+#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
+
+#define NS_TSIG_ERROR_NO_TSIG -10
+#define NS_TSIG_ERROR_NO_SPACE -11
+#define NS_TSIG_ERROR_FORMERR -12
+
+/*
+ * Currently defined type values for resources and queries.
+ */
+typedef enum __ns_type {
+ ns_t_invalid = 0, /* Cookie. */
+ ns_t_a = 1, /* Host address. */
+ ns_t_ns = 2, /* Authoritative server. */
+ ns_t_md = 3, /* Mail destination. */
+ ns_t_mf = 4, /* Mail forwarder. */
+ ns_t_cname = 5, /* Canonical name. */
+ ns_t_soa = 6, /* Start of authority zone. */
+ ns_t_mb = 7, /* Mailbox domain name. */
+ ns_t_mg = 8, /* Mail group member. */
+ ns_t_mr = 9, /* Mail rename name. */
+ ns_t_null = 10, /* Null resource record. */
+ ns_t_wks = 11, /* Well known service. */
+ ns_t_ptr = 12, /* Domain name pointer. */
+ ns_t_hinfo = 13, /* Host information. */
+ ns_t_minfo = 14, /* Mailbox information. */
+ ns_t_mx = 15, /* Mail routing information. */
+ ns_t_txt = 16, /* Text strings. */
+ ns_t_rp = 17, /* Responsible person. */
+ ns_t_afsdb = 18, /* AFS cell database. */
+ ns_t_x25 = 19, /* X_25 calling address. */
+ ns_t_isdn = 20, /* ISDN calling address. */
+ ns_t_rt = 21, /* Router. */
+ ns_t_nsap = 22, /* NSAP address. */
+ ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
+ ns_t_sig = 24, /* Security signature. */
+ ns_t_key = 25, /* Security key. */
+ ns_t_px = 26, /* X.400 mail mapping. */
+ ns_t_gpos = 27, /* Geographical position (withdrawn). */
+ ns_t_aaaa = 28, /* Ip6 Address. */
+ ns_t_loc = 29, /* Location Information. */
+ ns_t_nxt = 30, /* Next domain (security). */
+ ns_t_eid = 31, /* Endpoint identifier. */
+ ns_t_nimloc = 32, /* Nimrod Locator. */
+ ns_t_srv = 33, /* Server Selection. */
+ ns_t_atma = 34, /* ATM Address */
+ ns_t_naptr = 35, /* Naming Authority PoinTeR */
+ ns_t_kx = 36, /* Key Exchange */
+ ns_t_cert = 37, /* Certification record */
+ ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */
+ ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
+ ns_t_sink = 40, /* Kitchen sink (experimentatl) */
+ ns_t_opt = 41, /* EDNS0 option (meta-RR) */
+ ns_t_tsig = 250, /* Transaction signature. */
+ ns_t_ixfr = 251, /* Incremental zone transfer. */
+ ns_t_axfr = 252, /* Transfer zone of authority. */
+ ns_t_mailb = 253, /* Transfer mailbox records. */
+ ns_t_maila = 254, /* Transfer mail agent records. */
+ ns_t_any = 255, /* Wildcard match. */
+ ns_t_zxfr = 256, /* BIND-specific, nonstandard. */
+ ns_t_max = 65536
+} ns_type;
+
+/* Exclusively a QTYPE? (not also an RTYPE) */
+#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
+ (t) == ns_t_mailb || (t) == ns_t_maila)
+/* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */
+#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
+/* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */
+#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
+#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
+#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
+ (t) == ns_t_zxfr)
+
+/*
+ * Values for class field
+ */
+typedef enum __ns_class {
+ ns_c_invalid = 0, /* Cookie. */
+ ns_c_in = 1, /* Internet. */
+ ns_c_2 = 2, /* unallocated/unsupported. */
+ ns_c_chaos = 3, /* MIT Chaos-net. */
+ ns_c_hs = 4, /* MIT Hesiod. */
+ /* Query class values which do not appear in resource records */
+ ns_c_none = 254, /* for prereq. sections in update requests */
+ ns_c_any = 255, /* Wildcard match. */
+ ns_c_max = 65536
+} ns_class;
+
+/* DNSSEC constants. */
+
+typedef enum __ns_key_types {
+ ns_kt_rsa = 1, /* key type RSA/MD5 */
+ ns_kt_dh = 2, /* Diffie Hellman */
+ ns_kt_dsa = 3, /* Digital Signature Standard (MANDATORY) */
+ ns_kt_private = 254 /* Private key type starts with OID */
+} ns_key_types;
+
+typedef enum __ns_cert_types {
+ cert_t_pkix = 1, /* PKIX (X.509v3) */
+ cert_t_spki = 2, /* SPKI */
+ cert_t_pgp = 3, /* PGP */
+ cert_t_url = 253, /* URL private type */
+ cert_t_oid = 254 /* OID private type */
+} ns_cert_types;
+
+/* Flags field of the KEY RR rdata. */
+#define NS_KEY_TYPEMASK 0xC000 /* Mask for "type" bits */
+#define NS_KEY_TYPE_AUTH_CONF 0x0000 /* Key usable for both */
+#define NS_KEY_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */
+#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */
+#define NS_KEY_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */
+/* The type bits can also be interpreted independently, as single bits: */
+#define NS_KEY_NO_AUTH 0x8000 /* Key unusable for authentication */
+#define NS_KEY_NO_CONF 0x4000 /* Key unusable for confidentiality */
+#define NS_KEY_RESERVED2 0x2000 /* Security is *mandatory* if bit=0 */
+#define NS_KEY_EXTENDED_FLAGS 0x1000 /* reserved - must be zero */
+#define NS_KEY_RESERVED4 0x0800 /* reserved - must be zero */
+#define NS_KEY_RESERVED5 0x0400 /* reserved - must be zero */
+#define NS_KEY_NAME_TYPE 0x0300 /* these bits determine the type */
+#define NS_KEY_NAME_USER 0x0000 /* key is assoc. with user */
+#define NS_KEY_NAME_ENTITY 0x0200 /* key is assoc. with entity eg host */
+#define NS_KEY_NAME_ZONE 0x0100 /* key is zone key */
+#define NS_KEY_NAME_RESERVED 0x0300 /* reserved meaning */
+#define NS_KEY_RESERVED8 0x0080 /* reserved - must be zero */
+#define NS_KEY_RESERVED9 0x0040 /* reserved - must be zero */
+#define NS_KEY_RESERVED10 0x0020 /* reserved - must be zero */
+#define NS_KEY_RESERVED11 0x0010 /* reserved - must be zero */
+#define NS_KEY_SIGNATORYMASK 0x000F /* key can sign RR's of same name */
+#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
+ NS_KEY_RESERVED4 | \
+ NS_KEY_RESERVED5 | \
+ NS_KEY_RESERVED8 | \
+ NS_KEY_RESERVED9 | \
+ NS_KEY_RESERVED10 | \
+ NS_KEY_RESERVED11 )
+#define NS_KEY_RESERVED_BITMASK2 0xFFFF /* no bits defined here */
+
+/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
+#define NS_ALG_MD5RSA 1 /* MD5 with RSA */
+#define NS_ALG_DH 2 /* Diffie Hellman KEY */
+#define NS_ALG_DSA 3 /* DSA KEY */
+#define NS_ALG_DSS NS_ALG_DSA
+#define NS_ALG_EXPIRE_ONLY 253 /* No alg, no security */
+#define NS_ALG_PRIVATE_OID 254 /* Key begins with OID giving alg */
+
+/* Protocol values */
+/* value 0 is reserved */
+#define NS_KEY_PROT_TLS 1
+#define NS_KEY_PROT_EMAIL 2
+#define NS_KEY_PROT_DNSSEC 3
+#define NS_KEY_PROT_IPSEC 4
+#define NS_KEY_PROT_ANY 255
+
+/* Signatures */
+#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */
+#define NS_MD5RSA_MAX_BITS 2552
+ /* Total of binary mod and exp */
+#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
+ /* Max length of text sig block */
+#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
+#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8)
+#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8)
+
+#define NS_DSA_SIG_SIZE 41
+#define NS_DSA_MIN_SIZE 213
+#define NS_DSA_MAX_BYTES 405
+
+/* Offsets into SIG record rdata to find various values */
+#define NS_SIG_TYPE 0 /* Type flags */
+#define NS_SIG_ALG 2 /* Algorithm */
+#define NS_SIG_LABELS 3 /* How many labels in name */
+#define NS_SIG_OTTL 4 /* Original TTL */
+#define NS_SIG_EXPIR 8 /* Expiration time */
+#define NS_SIG_SIGNED 12 /* Signature time */
+#define NS_SIG_FOOT 16 /* Key footprint */
+#define NS_SIG_SIGNER 18 /* Domain name of who signed it */
+
+/* How RR types are represented as bit-flags in NXT records */
+#define NS_NXT_BITS 8
+#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_MAX 127
+
+/*
+ * Inline versions of get/put short/long. Pointer is advanced.
+ */
+#define NS_GET16(s, cp) do { \
+ register u_char *t_cp = (u_char *)(cp); \
+ (s) = ((u_int16_t)t_cp[0] << 8) \
+ | ((u_int16_t)t_cp[1]) \
+ ; \
+ (cp) += NS_INT16SZ; \
+} while (0)
+
+#define NS_GET32(l, cp) do { \
+ register u_char *t_cp = (u_char *)(cp); \
+ (l) = ((u_int32_t)t_cp[0] << 24) \
+ | ((u_int32_t)t_cp[1] << 16) \
+ | ((u_int32_t)t_cp[2] << 8) \
+ | ((u_int32_t)t_cp[3]) \
+ ; \
+ (cp) += NS_INT32SZ; \
+} while (0)
+
+#define NS_PUT16(s, cp) do { \
+ register u_int16_t t_s = (u_int16_t)(s); \
+ register u_char *t_cp = (u_char *)(cp); \
+ *t_cp++ = t_s >> 8; \
+ *t_cp = t_s; \
+ (cp) += NS_INT16SZ; \
+} while (0)
+
+#define NS_PUT32(l, cp) do { \
+ register u_int32_t t_l = (u_int32_t)(l); \
+ register u_char *t_cp = (u_char *)(cp); \
+ *t_cp++ = t_l >> 24; \
+ *t_cp++ = t_l >> 16; \
+ *t_cp++ = t_l >> 8; \
+ *t_cp = t_l; \
+ (cp) += NS_INT32SZ; \
+} while (0)
+
+/*
+ * ANSI C identifier hiding for bind's lib/nameser.
+ */
+#define ns_get16 __ns_get16
+#define ns_get32 __ns_get32
+#define ns_put16 __ns_put16
+#define ns_put32 __ns_put32
+#define ns_initparse __ns_initparse
+#define ns_skiprr __ns_skiprr
+#define ns_parserr __ns_parserr
+#define ns_sprintrr __ns_sprintrr
+#define ns_sprintrrf __ns_sprintrrf
+#define ns_format_ttl __ns_format_ttl
+#define ns_parse_ttl __ns_parse_ttl
+#define ns_datetosecs __ns_datetosecs
+#define ns_name_ntol __ns_name_ntol
+#define ns_name_ntop __ns_name_ntop
+#define ns_name_pton __ns_name_pton
+#define ns_name_unpack __ns_name_unpack
+#define ns_name_pack __ns_name_pack
+#define ns_name_compress __ns_name_compress
+#define ns_name_uncompress __ns_name_uncompress
+#define ns_name_skip __ns_name_skip
+#define ns_sign __ns_sign
+#define ns_sign_tcp __ns_sign_tcp
+#define ns_sign_tcp_init __ns_sign_tcp_init
+#define ns_find_tsig __ns_find_tsig
+#define ns_verify __ns_verify
+#define ns_verify_tcp __ns_verify_tcp
+#define ns_verify_tcp_init __ns_verify_tcp_init
+#define ns_samedomain __ns_samedomain
+#define ns_subdomain __ns_subdomain
+#define ns_makecanon __ns_makecanon
+#define ns_samename __ns_samename
+
+__BEGIN_DECLS
+u_int ns_get16 __P((const u_char *));
+u_long ns_get32 __P((const u_char *));
+void ns_put16 __P((u_int, u_char *));
+void ns_put32 __P((u_long, u_char *));
+int ns_initparse __P((const u_char *, int, ns_msg *));
+int ns_skiprr __P((const u_char *, const u_char *, ns_sect, int));
+int ns_parserr __P((ns_msg *, ns_sect, int, ns_rr *));
+int ns_sprintrr __P((const ns_msg *, const ns_rr *,
+ const char *, const char *, char *, size_t));
+int ns_sprintrrf __P((const u_char *, size_t, const char *,
+ ns_class, ns_type, u_long, const u_char *,
+ size_t, const char *, const char *,
+ char *, size_t));
+int ns_format_ttl __P((u_long, char *, size_t));
+int ns_parse_ttl __P((const char *, u_long *));
+u_int32_t ns_datetosecs __P((const char *cp, int *errp));
+int ns_name_ntol __P((const u_char *, u_char *, size_t));
+int ns_name_ntop __P((const u_char *, char *, size_t));
+int ns_name_pton __P((const char *, u_char *, size_t));
+int ns_name_unpack __P((const u_char *, const u_char *,
+ const u_char *, u_char *, size_t));
+int ns_name_pack __P((const u_char *, u_char *, int,
+ const u_char **, const u_char **));
+int ns_name_uncompress __P((const u_char *, const u_char *,
+ const u_char *, char *, size_t));
+int ns_name_compress __P((const char *, u_char *, size_t,
+ const u_char **, const u_char **));
+int ns_name_skip __P((const u_char **, const u_char *));
+int ns_sign __P((u_char *, int *, int, int, void *,
+ const u_char *, int, u_char *, int *, time_t));
+int ns_sign_tcp __P((u_char *, int *, int, int,
+ ns_tcp_tsig_state *, int));
+int ns_sign_tcp_init __P((void *, const u_char *, int,
+ ns_tcp_tsig_state *));
+u_char *ns_find_tsig __P((u_char *, u_char *));
+int ns_verify __P((u_char *, int *, void *,
+ const u_char *, int, u_char *, int *,
+ time_t *, int));
+int ns_verify_tcp __P((u_char *, int *, ns_tcp_tsig_state *, int));
+int ns_verify_tcp_init __P((void *, const u_char *, int,
+ ns_tcp_tsig_state *));
+int ns_samedomain __P((const char *, const char *));
+int ns_subdomain __P((const char *, const char *));
+int ns_makecanon __P((const char *, char *, size_t));
+int ns_samename __P((const char *, const char *));
+__END_DECLS
+
+#ifdef BIND_4_COMPAT
+#include <arpa/nameser_compat.h>
+#endif
-#endif /* !_NAMESER_H_ */
+#endif /* !_ARPA_NAMESER_H_ */
--- /dev/null
+/* Copyright (c) 1983, 1989
+ * The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ */
+
+/*
+ * from nameser.h 8.1 (Berkeley) 6/2/93
+ * $Id: nameser_compat.h,v 1.1 2000/01/26 14:55:58 mellon Exp $
+ */
+
+#ifndef _ARPA_NAMESER_COMPAT_
+#define _ARPA_NAMESER_COMPAT_
+
+#define __BIND 19950621 /* (DEAD) interface version stamp. */
+
+#ifndef BYTE_ORDER
+#if (BSD >= 199103)
+# include <machine/endian.h>
+#else
+#ifdef linux
+# include <endian.h>
+#else
+#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */
+#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */
+#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/
+
+#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
+ defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
+ defined(__alpha__) || defined(__alpha) || \
+ (defined(__Lynx__) && defined(__x86__))
+#define BYTE_ORDER LITTLE_ENDIAN
+#endif
+
+#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
+ defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
+ defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
+ defined(apollo) || defined(__convex__) || defined(_CRAY) || \
+ defined(__hppa) || defined(__hp9000) || \
+ defined(__hp9000s300) || defined(__hp9000s700) || \
+ defined (BIT_ZERO_ON_LEFT) || defined(m68k) || \
+ (defined(__Lynx__) && \
+ (defined(__68k__) || defined(__sparc__) || defined(__powerpc__)))
+#define BYTE_ORDER BIG_ENDIAN
+#endif
+#endif /* linux */
+#endif /* BSD */
+#endif /* BYTE_ORDER */
+
+#if !defined(BYTE_ORDER) || \
+ (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \
+ BYTE_ORDER != PDP_ENDIAN)
+ /* you must determine what the correct bit order is for
+ * your compiler - the next line is an intentional error
+ * which will force your compiles to bomb until you fix
+ * the above macros.
+ */
+ error "Undefined or invalid BYTE_ORDER";
+#endif
+
+/*
+ * Structure for query header. The order of the fields is machine- and
+ * compiler-dependent, depending on the byte/bit order and the layout
+ * of bit fields. We use bit fields only in int variables, as this
+ * is all ANSI requires. This requires a somewhat confusing rearrangement.
+ */
+
+typedef struct {
+ unsigned id :16; /* query identification number */
+#if BYTE_ORDER == BIG_ENDIAN
+ /* fields in third byte */
+ unsigned qr: 1; /* response flag */
+ unsigned opcode: 4; /* purpose of message */
+ unsigned aa: 1; /* authoritive answer */
+ unsigned tc: 1; /* truncated message */
+ unsigned rd: 1; /* recursion desired */
+ /* fields in fourth byte */
+ unsigned ra: 1; /* recursion available */
+ unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
+ unsigned ad: 1; /* authentic data from named */
+ unsigned cd: 1; /* checking disabled by resolver */
+ unsigned rcode :4; /* response code */
+#endif
+#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
+ /* fields in third byte */
+ unsigned rd :1; /* recursion desired */
+ unsigned tc :1; /* truncated message */
+ unsigned aa :1; /* authoritive answer */
+ unsigned opcode :4; /* purpose of message */
+ unsigned qr :1; /* response flag */
+ /* fields in fourth byte */
+ unsigned rcode :4; /* response code */
+ unsigned cd: 1; /* checking disabled by resolver */
+ unsigned ad: 1; /* authentic data from named */
+ unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra :1; /* recursion available */
+#endif
+ /* remaining bytes */
+ unsigned qdcount :16; /* number of question entries */
+ unsigned ancount :16; /* number of answer entries */
+ unsigned nscount :16; /* number of authority entries */
+ unsigned arcount :16; /* number of resource entries */
+} HEADER;
+
+#define PACKETSZ NS_PACKETSZ
+#define MAXDNAME NS_MAXDNAME
+#define MAXCDNAME NS_MAXCDNAME
+#define MAXLABEL NS_MAXLABEL
+#define HFIXEDSZ NS_HFIXEDSZ
+#define QFIXEDSZ NS_QFIXEDSZ
+#define RRFIXEDSZ NS_RRFIXEDSZ
+#define INT32SZ NS_INT32SZ
+#define INT16SZ NS_INT16SZ
+#define INADDRSZ NS_INADDRSZ
+#define IN6ADDRSZ NS_IN6ADDRSZ
+#define INDIR_MASK NS_CMPRSFLGS
+#define NAMESERVER_PORT NS_DEFAULTPORT
+
+#define S_ZONE ns_s_zn
+#define S_PREREQ ns_s_pr
+#define S_UPDATE ns_s_ud
+#define S_ADDT ns_s_ar
+
+#define QUERY ns_o_query
+#define IQUERY ns_o_iquery
+#define STATUS ns_o_status
+#define NS_NOTIFY_OP ns_o_notify
+#define NS_UPDATE_OP ns_o_update
+
+#define NOERROR ns_r_noerror
+#define FORMERR ns_r_formerr
+#define SERVFAIL ns_r_servfail
+#define NXDOMAIN ns_r_nxdomain
+#define NOTIMP ns_r_notimpl
+#define REFUSED ns_r_refused
+#define YXDOMAIN ns_r_yxdomain
+#define YXRRSET ns_r_yxrrset
+#define NXRRSET ns_r_nxrrset
+#define NOTAUTH ns_r_notauth
+#define NOTZONE ns_r_notzone
+/*#define BADSIG ns_r_badsig*/
+/*#define BADKEY ns_r_badkey*/
+/*#define BADTIME ns_r_badtime*/
+
+
+#define DELETE ns_uop_delete
+#define ADD ns_uop_add
+
+#define T_A ns_t_a
+#define T_NS ns_t_ns
+#define T_MD ns_t_md
+#define T_MF ns_t_mf
+#define T_CNAME ns_t_cname
+#define T_SOA ns_t_soa
+#define T_MB ns_t_mb
+#define T_MG ns_t_mg
+#define T_MR ns_t_mr
+#define T_NULL ns_t_null
+#define T_WKS ns_t_wks
+#define T_PTR ns_t_ptr
+#define T_HINFO ns_t_hinfo
+#define T_MINFO ns_t_minfo
+#define T_MX ns_t_mx
+#define T_TXT ns_t_txt
+#define T_RP ns_t_rp
+#define T_AFSDB ns_t_afsdb
+#define T_X25 ns_t_x25
+#define T_ISDN ns_t_isdn
+#define T_RT ns_t_rt
+#define T_NSAP ns_t_nsap
+#define T_NSAP_PTR ns_t_nsap_ptr
+#define T_SIG ns_t_sig
+#define T_KEY ns_t_key
+#define T_PX ns_t_px
+#define T_GPOS ns_t_gpos
+#define T_AAAA ns_t_aaaa
+#define T_LOC ns_t_loc
+#define T_NXT ns_t_nxt
+#define T_EID ns_t_eid
+#define T_NIMLOC ns_t_nimloc
+#define T_SRV ns_t_srv
+#define T_ATMA ns_t_atma
+#define T_NAPTR ns_t_naptr
+#define T_TSIG ns_t_tsig
+#define T_IXFR ns_t_ixfr
+#define T_AXFR ns_t_axfr
+#define T_MAILB ns_t_mailb
+#define T_MAILA ns_t_maila
+#define T_ANY ns_t_any
+
+#define C_IN ns_c_in
+#define C_CHAOS ns_c_chaos
+#define C_HS ns_c_hs
+/* BIND_UPDATE */
+#define C_NONE ns_c_none
+#define C_ANY ns_c_any
+
+#define GETSHORT NS_GET16
+#define GETLONG NS_GET32
+#define PUTSHORT NS_PUT16
+#define PUTLONG NS_PUT32
+
+#endif /* _ARPA_NAMESER_COMPAT_ */
Definitions for dhcpd... */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#include <sys/un.h>
#include <arpa/inet.h>
+#include "arpa/nameser.h"
#if defined (NSUPDATE)
-# include <arpa/nameser.h>
# include <resolv.h>
# include <res_update.h>
#endif
int backoff; /* Current backoff, in seconds. */
};
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
-#define DMDOFFSET (sizeof (struct dmalloc_preamble))
-#define DMLFSIZE 16
-#define DMUFSIZE 16
-#define DMDSIZE (DMDOFFSET + DMLFSIZE + DMUFSIZE)
-
-struct dmalloc_preamble {
- struct dmalloc_preamble *prev, *next;
- size_t size;
- const char *file;
- int line;
- unsigned long generation;
- unsigned char low_fence [DMLFSIZE];
-};
-#else
-#define DMDOFFSET 0
-#define DMDSIZE 0
-#endif
-
-#if defined (DEBUG_RC_HISTORY)
-#if !defined (RC_HISTORY_MAX)
-# define RC_HISTORY_MAX 256
-#endif
-
-struct rc_history_entry {
- char *name;
- VOIDPTR addr;
- int refcnt;
-};
-
-#define rc_register(x, l, y, z) do { \
- rc_history [rc_history_index].file = (x); \
- rc_history [rc_history_index].line = (l); \
- rc_history [rc_history_index].addr = (y); \
- rc_history [rc_history_index].refcnt = (z); \
- if (++rc_history_index == RC_HISTORY_MAX) \
- rc_history_index = 0;\
- } while (0)
-#else
-#define rc_register(name, addr, refcnt)
-#endif
-
/* Bitmask of dhcp option codes. */
typedef unsigned char option_mask [16];
void delete_option PROTO ((struct universe *, struct option_state *, int));
void delete_hashed_option PROTO ((struct universe *,
struct option_state *, int));
-int option_cache_dereference PROTO ((struct option_cache **, const char *));
+int option_cache_dereference PROTO ((struct option_cache **,
+ const char *, int));
int hashed_option_state_dereference PROTO ((struct universe *,
struct option_state *));
int agent_option_state_dereference PROTO ((struct universe *,
struct binding_scope *,
struct universe *));
-/* errwarn.c */
-void log_fatal PROTO ((const char *, ...))
- __attribute__((__format__(__printf__,1,2)));
-int log_error PROTO ((const char *, ...))
- __attribute__((__format__(__printf__,1,2)));
-int log_info PROTO ((const char *, ...))
- __attribute__((__format__(__printf__,1,2)));
-int log_debug PROTO ((const char *, ...))
- __attribute__((__format__(__printf__,1,2)));
-int parse_warn PROTO ((struct parse *, const char *, ...))
- __attribute__((__format__(__printf__,2,3)));
-
/* dhcpd.c */
extern TIME cur_time;
extern struct group root_group;
-extern struct binding_scope global_scope;
extern struct in_addr limited_broadcast;
extern u_int16_t local_port;
extern u_int16_t remote_port;
-extern int log_priority;
-extern int log_perror;
extern const char *path_dhcpd_conf;
extern const char *path_dhcpd_db;
const char *, struct expression *, int, int));
int parse_allow_deny PROTO ((struct option_cache **, struct parse *, int));
int parse_auth_key PROTO ((struct data_string *, struct parse *));
+int parse_warn PROTO ((struct parse *, const char *, ...))
+ __attribute__((__format__(__printf__,2,3)));
/* tree.c */
+extern struct binding_scope global_scope;
pair cons PROTO ((caddr_t, pair));
int make_const_option_cache PROTO ((struct option_cache **, struct buffer **,
u_int8_t *, unsigned, struct option *,
- const char *));
+ const char *, int));
int make_host_lookup PROTO ((struct expression **, const char *));
int enter_dns_host PROTO ((struct dns_host_entry **, const char *));
int make_const_data PROTO ((struct expression **,
int make_let PROTO ((struct executable_statement **, const char *));
int option_cache PROTO ((struct option_cache **, struct data_string *,
struct expression *, struct option *));
+#if defined (NSUPDATE)
int evaluate_dns_expression PROTO ((ns_updrec **, struct packet *,
struct lease *, struct option_state *,
struct option_state *,
struct binding_scope *,
struct expression *));
+#endif
int evaluate_boolean_expression PROTO ((int *,
struct packet *, struct lease *,
struct option_state *,
struct packet *, struct lease *,
struct option_state *, struct option_state *,
struct binding_scope *,
- struct option_cache *));
+ struct option_cache *,
+ const char *, int));
int evaluate_boolean_option_cache PROTO ((int *,
struct packet *, struct lease *,
struct option_state *,
struct option_state *,
struct option_state *,
struct binding_scope *,
- struct expression *,
- const char *, int));
-void expression_dereference PROTO ((struct expression **, const char *));
+ struct expression *));
+void expression_dereference PROTO ((struct expression **, const char *, int));
int is_dns_expression PROTO ((struct expression *));
int is_boolean_expression PROTO ((struct expression *));
int is_data_expression PROTO ((struct expression *));
enum expression_context op_context PROTO ((enum expr_op));
int write_expression PROTO ((FILE *, struct expression *, int, int, int));
struct binding *find_binding PROTO ((struct binding_scope *, const char *));
-int free_bindings PROTO ((struct binding_scope *, const char *));
-int binding_scope_dereference PROTO ((struct binding_scope **, const char *));
+int free_bindings PROTO ((struct binding_scope *, const char *, int));
+int binding_scope_dereference PROTO ((struct binding_scope **,
+ const char *, int));
/* dhcp.c */
extern int outstanding_pings;
struct lease *mockup_lease PROTO ((struct packet *,
struct shared_network *,
struct host_decl *));
-void static_lease_dereference PROTO ((struct lease *, const char *));
+void static_lease_dereference PROTO ((struct lease *, const char *, int));
struct lease *allocate_lease PROTO ((struct packet *, struct pool *, int));
int permitted PROTO ((struct packet *, struct permit *));
void bootp PROTO ((struct packet *));
/* memory.c */
-struct group *clone_group PROTO ((struct group *, const char *));
+struct group *clone_group PROTO ((struct group *, const char *, int));
/* alloc.c */
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
-extern struct dmalloc_preamble *dmalloc_list;
-extern unsigned long dmalloc_outstanding;
-extern unsigned long dmalloc_longterm;
-extern unsigned long dmalloc_generation;
-extern unsigned long dmalloc_cutoff_generation;
-#endif
-
-#if defined (DEBUG_RC_HISTORY)
-extern struct rc_history_entry rc_history [RC_HISTORY_MAX];
-extern int rc_history_index;
-#endif
-VOIDPTR dmalloc PROTO ((unsigned, const char *, int));
-void dfree PROTO ((VOIDPTR, const char *, int));
-#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
-void dmalloc_reuse PROTO ((VOIDPTR, const char *, int, int));
-void dmalloc_dump_outstanding PROTO ((void));
-#else
-#define dmalloc_reuse(x,y,z)
-#endif
-#if defined (DEBUG_RC_HISTORY)
-void dump_rc_history PROTO ((void));
-#endif
struct dhcp_packet *new_dhcp_packet PROTO ((const char *, int));
struct hash_table *new_hash_table PROTO ((int, const char *, int));
struct hash_bucket *new_hash_bucket PROTO ((const char *, int));
omapi_data_string_t *, omapi_typed_data_t *);
isc_result_t interface_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *, omapi_value_t **);
-isc_result_t interface_destroy (omapi_object_t *, const char *);
+isc_result_t interface_destroy (omapi_object_t *, const char *, int);
isc_result_t interface_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t interface_stuff_values (omapi_object_t *,
isc_result_t dhcp_lease_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_lease_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_lease_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_lease_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_lease_stuff_values (omapi_object_t *,
isc_result_t dhcp_group_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_group_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_group_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_group_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_group_stuff_values (omapi_object_t *,
isc_result_t dhcp_host_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_host_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_host_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_host_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_host_stuff_values (omapi_object_t *,
isc_result_t dhcp_pool_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_pool_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_pool_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_pool_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_pool_stuff_values (omapi_object_t *,
isc_result_t dhcp_shared_network_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_shared_network_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_shared_network_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_shared_network_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_shared_network_stuff_values (omapi_object_t *,
isc_result_t dhcp_subnet_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_subnet_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_subnet_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_subnet_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_subnet_stuff_values (omapi_object_t *,
isc_result_t dhcp_class_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t dhcp_class_destroy (omapi_object_t *, const char *);
+isc_result_t dhcp_class_destroy (omapi_object_t *, const char *, int);
isc_result_t dhcp_class_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t dhcp_class_stuff_values (omapi_object_t *,
void enter_shared_network PROTO ((struct shared_network *));
void new_shared_network_interface PROTO ((struct parse *,
struct shared_network *,
- const char *, int));
+ const char *));
int subnet_inner_than PROTO ((struct subnet *, struct subnet *, int));
void enter_subnet PROTO ((struct subnet *));
void enter_lease PROTO ((struct lease *));
omapi_data_string_t *,
omapi_value_t **));
isc_result_t dhcp_failover_link_destroy PROTO ((omapi_object_t *,
- const char *));
+ const char *, int));
isc_result_t dhcp_failover_link_stuff_values PROTO ((omapi_object_t *,
omapi_object_t *,
omapi_object_t *));
omapi_data_string_t *,
omapi_value_t **));
isc_result_t dhcp_failover_listener_destroy PROTO ((omapi_object_t *,
- const char *));
+ const char *, int));
isc_result_t dhcp_failover_listener_stuff PROTO ((omapi_object_t *,
omapi_object_t *,
omapi_object_t *));
omapi_data_string_t *,
omapi_value_t **));
isc_result_t dhcp_failover_state_destroy PROTO ((omapi_object_t *,
- const char *));
+ const char *, int));
isc_result_t dhcp_failover_state_stuff PROTO ((omapi_object_t *,
omapi_object_t *,
omapi_object_t *));
* http://www.isc.org for more information.
*/
-isc_result_t omapi_buffer_new (omapi_buffer_t **, const char *);
+isc_result_t omapi_buffer_new (omapi_buffer_t **, const char *, int);
isc_result_t omapi_buffer_reference (omapi_buffer_t **,
- omapi_buffer_t *, const char *);
-isc_result_t omapi_buffer_dereference (omapi_buffer_t **, const char *);
+ omapi_buffer_t *, const char *, int);
+isc_result_t omapi_buffer_dereference (omapi_buffer_t **, const char *, int);
+
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+#define DMDOFFSET (sizeof (struct dmalloc_preamble))
+#define DMLFSIZE 16
+#define DMUFSIZE 16
+#define DMDSIZE (DMDOFFSET + DMLFSIZE + DMUFSIZE)
+
+struct dmalloc_preamble {
+ struct dmalloc_preamble *prev, *next;
+ const char *file;
+ int line;
+ size_t size;
+ unsigned long generation;
+ unsigned char low_fence [DMLFSIZE];
+};
+#else
+#define DMDOFFSET 0
+#define DMDSIZE 0
+#endif
+
+#if defined (DEBUG_RC_HISTORY)
+#if !defined (RC_HISTORY_MAX)
+# define RC_HISTORY_MAX 256
+#endif
+
+struct rc_history_entry {
+ const char *file;
+ int line;
+ VOIDPTR addr;
+ int refcnt;
+};
+
+#define rc_register(x, l, y, z) do { \
+ rc_history [rc_history_index].file = (x); \
+ rc_history [rc_history_index].line = (l); \
+ rc_history [rc_history_index].addr = (y); \
+ rc_history [rc_history_index].refcnt = (z); \
+ if (++rc_history_index == RC_HISTORY_MAX) \
+ rc_history_index = 0;\
+ } while (0)
+#define rc_register_mdl(y, z) \
+ rc_register (__FILE__, __LINE__, y, z)
+#else
+#define rc_register(file, line, addr, refcnt)
+#define rc_register_mdl(addr, refcnt)
+#endif
+
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+extern struct dmalloc_preamble *dmalloc_list;
+extern unsigned long dmalloc_outstanding;
+extern unsigned long dmalloc_longterm;
+extern unsigned long dmalloc_generation;
+extern unsigned long dmalloc_cutoff_generation;
+#endif
+
+#if defined (DEBUG_RC_HISTORY)
+extern struct rc_history_entry rc_history [RC_HISTORY_MAX];
+extern int rc_history_index;
+#endif
struct {
void *ptr;
isc_result_t (*reference) (void *,
- void *, char *);
- isc_result_t (*dereference) (void *, char *);
+ void *, const char *, int);
+ isc_result_t (*dereference) (void *,
+ const char *, int);
} ref;
#define OMAPI_TYPED_DATA_INT_LEN (sizeof (int) + \
sizeof (omapi_datatype_t) + \
isc_result_t (*get_value) (omapi_object_t *,
omapi_object_t *,
omapi_data_string_t *, omapi_value_t **);
- isc_result_t (*destroy) (omapi_object_t *, const char *);
+ isc_result_t (*destroy) (omapi_object_t *, const char *, int);
isc_result_t (*signal_handler) (omapi_object_t *,
const char *, va_list);
isc_result_t (*stuff_values) (omapi_object_t *,
omapi_object_t *,
omapi_object_t *);
-isc_result_t omapi_protocol_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_protocol_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_protocol_send_message (omapi_object_t *,
omapi_object_t *,
omapi_object_t *,
omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t omapi_protocol_listener_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_protocol_listener_destroy (omapi_object_t *,
+ const char *, int);
isc_result_t omapi_protocol_listener_signal (omapi_object_t *,
const char *, va_list);
isc_result_t omapi_protocol_listener_stuff (omapi_object_t *,
isc_result_t omapi_connection_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t omapi_connection_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_connection_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_connection_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t omapi_connection_stuff_values (omapi_object_t *,
isc_result_t omapi_listener_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t omapi_listener_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_listener_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_listener_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t omapi_listener_stuff_values (omapi_object_t *,
omapi_typed_data_t *);
isc_result_t omapi_io_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *, omapi_value_t **);
-isc_result_t omapi_io_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_io_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_io_signal_handler (omapi_object_t *, const char *, va_list);
isc_result_t omapi_io_stuff_values (omapi_object_t *,
omapi_object_t *,
isc_result_t omapi_waiter_signal_handler (omapi_object_t *,
const char *, va_list);
-isc_result_t omapi_generic_new (omapi_object_t **, const char *);
+isc_result_t omapi_generic_new (omapi_object_t **, const char *, int);
isc_result_t omapi_generic_set_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_typed_data_t *);
isc_result_t omapi_generic_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t omapi_generic_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_generic_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_generic_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t omapi_generic_stuff_values (omapi_object_t *,
omapi_object_t *,
omapi_object_t *);
-isc_result_t omapi_message_new (omapi_object_t **, const char *);
+isc_result_t omapi_message_new (omapi_object_t **, const char *, int);
isc_result_t omapi_message_set_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_typed_data_t *);
isc_result_t omapi_message_get_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **);
-isc_result_t omapi_message_destroy (omapi_object_t *, const char *);
+isc_result_t omapi_message_destroy (omapi_object_t *, const char *, int);
isc_result_t omapi_message_signal_handler (omapi_object_t *,
const char *, va_list);
isc_result_t omapi_message_stuff_values (omapi_object_t *,
omapi_data_string_t *,
omapi_value_t **),
isc_result_t (*) (omapi_object_t *,
- const char *),
+ const char *, int),
isc_result_t (*) (omapi_object_t *,
const char *,
va_list),
int omapi_ds_strcmp (omapi_data_string_t *, const char *);
int omapi_td_strcmp (omapi_typed_data_t *, const char *);
isc_result_t omapi_make_value (omapi_value_t **, omapi_data_string_t *,
- omapi_typed_data_t *, const char *);
+ omapi_typed_data_t *, const char *, int);
isc_result_t omapi_make_const_value (omapi_value_t **, omapi_data_string_t *,
const unsigned char *,
- unsigned, const char *);
+ unsigned, const char *, int);
isc_result_t omapi_make_int_value (omapi_value_t **, omapi_data_string_t *,
- int, const char *);
+ int, const char *, int);
isc_result_t omapi_make_handle_value (omapi_value_t **, omapi_data_string_t *,
- omapi_object_t *, const char *);
+ omapi_object_t *, const char *, int);
isc_result_t omapi_make_string_value (omapi_value_t **, omapi_data_string_t *,
- const char *, const char *);
+ const char *, const char *, int);
isc_result_t omapi_get_int_value (unsigned long *, omapi_typed_data_t *);
isc_result_t omapi_object_handle (omapi_handle_t *, omapi_object_t *);
isc_result_t omapi_handle_td_lookup (omapi_object_t **, omapi_typed_data_t *);
isc_result_t omapi_object_reference (omapi_object_t **,
- omapi_object_t *, const char *);
-isc_result_t omapi_object_dereference (omapi_object_t **, const char *);
-isc_result_t omapi_typed_data_new (omapi_typed_data_t **,
+ omapi_object_t *, const char *, int);
+isc_result_t omapi_object_dereference (omapi_object_t **, const char *, int);
+isc_result_t omapi_typed_data_new (const char *, int, omapi_typed_data_t **,
omapi_datatype_t, ...);
isc_result_t omapi_typed_data_reference (omapi_typed_data_t **,
- omapi_typed_data_t *, const char *);
+ omapi_typed_data_t *,
+ const char *, int);
isc_result_t omapi_typed_data_dereference (omapi_typed_data_t **,
- const char *);
+ const char *, int);
isc_result_t omapi_data_string_new (omapi_data_string_t **,
- unsigned, const char *);
+ unsigned, const char *, int);
isc_result_t omapi_data_string_reference (omapi_data_string_t **,
- omapi_data_string_t *, const char *);
+ omapi_data_string_t *,
+ const char *, int);
isc_result_t omapi_data_string_dereference (omapi_data_string_t **,
- const char *);
-isc_result_t omapi_value_new (omapi_value_t **, const char *);
+ const char *, int);
+isc_result_t omapi_value_new (omapi_value_t **, const char *, int);
isc_result_t omapi_value_reference (omapi_value_t **,
- omapi_value_t *, const char *);
-isc_result_t omapi_value_dereference (omapi_value_t **, const char *);
+ omapi_value_t *, const char *, int);
+isc_result_t omapi_value_dereference (omapi_value_t **, const char *, int);
+void * dmalloc (unsigned, const char *, int);
+void dfree (void *, const char *, int);
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+void dmalloc_reuse (void *, const char *, int, int);
+void dmalloc_dump_outstanding (void);
+#define MDL __FILE__, __LINE__
+#else
+#define dmalloc_reuse(x,y,l,z)
+#define MDL (char *)0, __LINE__
+#endif
+#if defined (DEBUG_RC_HISTORY)
+void dump_rc_history (void);
+#endif
+extern int log_priority;
+extern int log_perror;
+extern void (*log_cleanup) (void);
+
+void log_fatal (const char *, ...)
+ __attribute__((__format__(__printf__,1,2)));
+int log_error (const char *, ...)
+ __attribute__((__format__(__printf__,1,2)));
+int log_info (const char *, ...)
+ __attribute__((__format__(__printf__,1,2)));
+int log_debug (const char *, ...)
+ __attribute__((__format__(__printf__,1,2)));
+void do_percentm (char *obuf, const char *ibuf);
#endif /* _OMAPIP_H_ */
/* Define this if you want debugging output for DHCP failover protocol
messages. */
-/* #define DEBUG_FAILOVER_MESSAGES */
+#define DEBUG_FAILOVER_MESSAGES
/* Define this if you want debugging output for DHCP failover protocol
lease assignment timing. */
-/* #define DEBUG_FAILOVER_TIMING */
+#define DEBUG_FAILOVER_TIMING
/* Define this if you want DHCP failover protocol support in the DHCP
server. */
-/* #define FAILOVER_PROTOCOL */
+#define FAILOVER_PROTOCOL
/* Define this if you want the dhcpd.pid file to go somewhere other than
the default (which varies from system to system, but is usually either
CATMANPAGES = omapi.cat3
SEDMANPAGES = omapi.man3
-SRC = protocol.c buffer.c alloc.c result.c connection.c \
+SRC = protocol.c buffer.c alloc.c result.c connection.c errwarn.c \
listener.c dispatch.c generic.c support.c handle.c message.c
-OBJ = protocol.o buffer.o alloc.o result.o connection.o \
+OBJ = protocol.o buffer.o alloc.o result.o connection.o errwarn.o \
listener.o dispatch.o generic.o support.o handle.o message.o
MAN = omapi.3
protocol... */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#include <omapip/omapip_p.h>
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+struct dmalloc_preamble *dmalloc_list;
+unsigned long dmalloc_outstanding;
+unsigned long dmalloc_longterm;
+unsigned long dmalloc_generation;
+unsigned long dmalloc_cutoff_generation;
+#endif
+
+#if defined (DEBUG_RC_HISTORY)
+struct rc_history_entry rc_history [RC_HISTORY_MAX];
+int rc_history_index;
+#endif
+
+VOIDPTR dmalloc (size, file, line)
+ unsigned size;
+ const char *file;
+ int line;
+{
+ unsigned char *foo = dmalloc (size + DMDSIZE, file, line);
+ int i;
+ VOIDPTR *bar;
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+ struct dmalloc_preamble *dp;
+#endif
+ if (!foo)
+ return (VOIDPTR)0;
+ bar = (VOIDPTR)(foo + DMDOFFSET);
+ memset (bar, 0, size);
+
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+ dp = (struct dmalloc_preamble *)foo;
+ dp -> prev = dmalloc_list;
+ if (dmalloc_list)
+ dmalloc_list -> next = dp;
+ dmalloc_list = dp;
+ dp -> next = (struct dmalloc_preamble *)0;
+ dp -> size = size;
+ dp -> file = file;
+ dp -> line = line;
+ dp -> generation = dmalloc_generation++;
+ dmalloc_outstanding += size;
+ for (i = 0; i < DMLFSIZE; i++)
+ dp -> low_fence [i] =
+ (((unsigned long)
+ (&dp -> low_fence [i])) % 143) + 113;
+ for (i = DMDOFFSET; i < DMDSIZE; i++)
+ foo [i + size] =
+ (((unsigned long)
+ (&foo [i + size])) % 143) + 113;
+#if defined (DEBUG_MALLOC_POOL_EXHAUSTIVELY)
+ /* Check _every_ entry in the pool! Very expensive. */
+ for (dp = dmalloc_list; dp; dp = dp -> prev) {
+ for (i = 0; i < DMLFSIZE; i++) {
+ if (dp -> low_fence [i] !=
+ (((unsigned long)
+ (&dp -> low_fence [i])) % 143) + 113)
+ {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+ foo = (unsigned char *)dp;
+ for (i = DMDOFFSET; i < DMDSIZE; i++) {
+ if (foo [i + dp -> size] !=
+ (((unsigned long)
+ (&foo [i + dp -> size])) % 143) + 113) {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+ }
+#endif
+#endif
+ return bar;
+}
+
+void dfree (ptr, file, line)
+ VOIDPTR ptr;
+ const char *file;
+ int line;
+{
+ if (!ptr) {
+ log_error ("dfree %s(%d): free on null pointer.", file, line);
+ return;
+ }
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+ {
+ unsigned char *bar = ptr;
+ struct dmalloc_preamble *dp, *cur;
+ int i;
+ bar -= DMDOFFSET;
+ cur = (struct dmalloc_preamble *)bar;
+ for (dp = dmalloc_list; dp; dp = dp -> prev)
+ if (dp == cur)
+ break;
+ if (!dp) {
+ log_error ("%s(%d): freeing unknown memory: %lx",
+ dp -> file, dp -> line, (unsigned long)cur);
+ abort ();
+ }
+ if (dp -> prev)
+ dp -> prev -> next = dp -> next;
+ if (dp -> next)
+ dp -> next -> prev = dp -> prev;
+ if (dp == dmalloc_list)
+ dmalloc_list = dp -> prev;
+ if (dp -> generation >= dmalloc_cutoff_generation)
+ dmalloc_outstanding -= dp -> size;
+ else
+ dmalloc_longterm -= dp -> size;
+
+ for (i = 0; i < DMLFSIZE; i++) {
+ if (dp -> low_fence [i] !=
+ (((unsigned long)
+ (&dp -> low_fence [i])) % 143) + 113)
+ {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+ for (i = DMDOFFSET; i < DMDSIZE; i++) {
+ if (bar [i + dp -> size] !=
+ (((unsigned long)
+ (&bar [i + dp -> size])) % 143) + 113) {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+ ptr = bar;
+ }
+#endif
+ free (ptr);
+}
+
+#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
+/* For allocation functions that keep their own free lists, we want to
+ account for the reuse of the memory. */
+
+void dmalloc_reuse (foo, file, line, justref)
+ VOIDPTR foo;
+ const char *file;
+ int line;
+ int justref;
+{
+ struct dmalloc_preamble *dp;
+
+ /* Get the pointer to the dmalloc header. */
+ dp = foo;
+ dp--;
+
+ /* If we just allocated this and are now referencing it, this
+ function would almost be a no-op, except that it would
+ increment the generation count needlessly. So just return
+ in this case. */
+ if (dp -> generation == dmalloc_generation)
+ return;
+
+ /* If this is longterm data, and we just made reference to it,
+ don't put it on the short-term list or change its name -
+ we don't need to know about this. */
+ if (dp -> generation < dmalloc_cutoff_generation && justref)
+ return;
+
+ /* Take it out of the place in the allocated list where it was. */
+ if (dp -> prev)
+ dp -> prev -> next = dp -> next;
+ if (dp -> next)
+ dp -> next -> prev = dp -> prev;
+ if (dp == dmalloc_list)
+ dmalloc_list = dp -> prev;
+
+ /* Account for its removal. */
+ if (dp -> generation >= dmalloc_cutoff_generation)
+ dmalloc_outstanding -= dp -> size;
+ else
+ dmalloc_longterm -= dp -> size;
+
+ /* Now put it at the head of the list. */
+ dp -> prev = dmalloc_list;
+ if (dmalloc_list)
+ dmalloc_list -> next = dp;
+ dmalloc_list = dp;
+ dp -> next = (struct dmalloc_preamble *)0;
+
+ /* Change the reference location information. */
+ dp -> file = file;
+ dp -> line = line;
+
+ /* Increment the generation. */
+ dp -> generation = dmalloc_generation++;
+
+ /* Account for it. */
+ dmalloc_outstanding += dp -> size;
+}
+
+void dmalloc_dump_outstanding ()
+{
+ static unsigned long dmalloc_cutoff_point;
+ struct dmalloc_preamble *dp;
+ unsigned char *foo;
+ int i;
+
+ if (!dmalloc_cutoff_point)
+ dmalloc_cutoff_point = dmalloc_cutoff_generation;
+ for (dp = dmalloc_list; dp; dp = dp -> prev) {
+ if (dp -> generation <= dmalloc_cutoff_point)
+ break;
+#if defined (DEBUG_MALLOC_POOL)
+ for (i = 0; i < DMLFSIZE; i++) {
+ if (dp -> low_fence [i] !=
+ (((unsigned long)
+ (&dp -> low_fence [i])) % 143) + 113)
+ {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+ foo = (unsigned char *)dp;
+ for (i = DMDOFFSET; i < DMDSIZE; i++) {
+ if (foo [i + dp -> size] !=
+ (((unsigned long)
+ (&foo [i + dp -> size])) % 143) + 113) {
+ log_error ("malloc fence modified: %s(%d)",
+ dp -> file, dp -> line);
+ abort ();
+ }
+ }
+#endif
+#if defined (DEBUG_MEMORY_LEAKAGE)
+ /* Don't count data that's actually on a free list
+ somewhere. */
+ if (dp -> file)
+ log_info (" %s(%d): %d",
+ dp -> file, dp -> line, dp -> size);
+#endif
+ }
+ if (dmalloc_list)
+ dmalloc_cutoff_point = dmalloc_list -> generation;
+}
+#endif /* DEBUG_MEMORY_LEAKAGE || DEBUG_MALLOC_POOL */
+
+#if defined (DEBUG_RC_HISTORY)
+void dump_rc_history ()
+{
+ int i;
+
+ i = rc_history_index;
+ do {
+ log_info (" referenced by %s(%d): addr = %lx refcnt = %x\n",
+ rc_history [i].file, rc_history [i].line,
+ (unsigned long)rc_history [i].addr,
+ rc_history [i].refcnt);
+ ++i;
+ if (i == RC_HISTORY_MAX)
+ i = 0;
+ } while (i != rc_history_index && rc_history [i].file);
+}
+#endif
+
isc_result_t omapi_object_reference (omapi_object_t **r,
omapi_object_t *h,
const char *file, int line)
}
isc_result_t omapi_object_dereference (omapi_object_t **h,
- const char *name)
+ const char *file, int line)
{
int outer_reference = 0;
int inner_reference = 0;
if (!*h) {
#if defined (ALLOCATION_DEBUGGING)
- abort ("%s: dereference of null pointer!", name);
+ abort ("%s(%d): dereference of null pointer!", file, line);
#else
return ISC_R_INVALIDARG;
#endif
if ((*h) -> refcnt <= 0) {
#if defined (ALLOCATION_DEBUGGING)
- abort ("dereference of pointer with refcnt of zero!");
+ abort ("%s(%d): dereference of pointer with refcnt of zero!",
+ file, line);
#else
return ISC_R_INVALIDARG;
#endif
}
isc_result_t omapi_buffer_dereference (omapi_buffer_t **h,
- const char *name)
+ const char *file, int line)
{
if (!h)
return ISC_R_INVALIDARG;
return ISC_R_SUCCESS;
}
-isc_result_t omapi_typed_data_new (omapi_typed_data_t **t,
+isc_result_t omapi_typed_data_new (const char *file, int line,
+ omapi_typed_data_t **t,
omapi_datatype_t type, ...)
{
va_list l;
int intval;
char *s;
isc_result_t status;
- const char *file;
- int line;
omapi_object_t *obj;
va_start (l, type);
return ISC_R_INVALIDARG;
}
- /* XXX not necessary if not doing malloc debugging. */
- file = va_arg (l, const char *);
- line = va_arg (l, int);
-
new = dmalloc (len, file, line);
if (!new)
return ISC_R_NOMEMORY;
}
isc_result_t omapi_typed_data_dereference (omapi_typed_data_t **h,
- const char *file, line)
+ const char *file, int line)
{
if (!h)
return ISC_R_INVALIDARG;
if (!*h) {
#if defined (ALLOCATION_DEBUGGING)
- abort ("%s: dereference of null pointer!", name);
+ abort ("%s(%d): dereference of null pointer!", file, line);
#else
return ISC_R_INVALIDARG;
#endif
if ((*h) -> refcnt <= 0) {
#if defined (ALLOCATION_DEBUGGING)
- abort ("dereference of pointer with refcnt of zero!");
+ abort ("%s(%d): dereference of pointer with refcnt of zero!",
+ file, line);
#else
return ISC_R_INVALIDARG;
#endif
isc_result_t omapi_data_string_reference (omapi_data_string_t **r,
omapi_data_string_t *h,
- const char *file, line)
+ const char *file, int line)
{
if (!h || !r)
return ISC_R_INVALIDARG;
}
isc_result_t omapi_data_string_dereference (omapi_data_string_t **h,
- const char *file, line)
+ const char *file, int line)
{
if (!h)
return ISC_R_INVALIDARG;
}
--((*h) -> refcnt);
- rc_register (file, line, h, h -> refcnt);
+ rc_register (file, line, h, (*h) -> refcnt);
if ((*h) -> refcnt <= 0 ) {
dfree (*h, file, line);
}
isc_result_t omapi_value_reference (omapi_value_t **r,
omapi_value_t *h,
- const char *file, line)
+ const char *file, int line)
{
if (!h || !r)
return ISC_R_INVALIDARG;
}
isc_result_t omapi_value_dereference (omapi_value_t **h,
- const char *name)
+ const char *file, int line)
{
if (!h)
return ISC_R_INVALIDARG;
}
--((*h) -> refcnt);
- rc_register (file, line, h, h -> refcnt);
+ rc_register (file, line, h, (*h) -> refcnt);
if ((*h) -> refcnt <= 0 ) {
if ((*h) -> name)
- omapi_data_string_dereference (&(*h) -> name, name);
+ omapi_data_string_dereference (&(*h) -> name,
+ file, line);
if ((*h) -> value)
- omapi_typed_data_dereference (&(*h) -> value, name);
+ omapi_typed_data_dereference (&(*h) -> value,
+ file, line);
dfree (*h, file, line);
}
*h = 0;
buffer = buffer -> next)
;
if (!BUFFER_BYTES_FREE (buffer)) {
- status = omapi_buffer_new (&buffer -> next,
- "omapi_private_read");
+ status = omapi_buffer_new (&buffer -> next, MDL);
if (status != ISC_R_SUCCESS)
return status;
buffer = buffer -> next;
}
} else {
- status = omapi_buffer_new (&c -> inbufs,
- "omapi_private_read");
+ status = omapi_buffer_new (&c -> inbufs, MDL);
if (status != ISC_R_SUCCESS)
return status;
buffer = c -> inbufs;
buffer -> next; buffer = buffer -> next)
;
} else {
- status = omapi_buffer_new (&c -> outbufs,
- "omapi_private_buffer_copyin");
+ status = omapi_buffer_new (&c -> outbufs, MDL);
if (status != ISC_R_SUCCESS)
return status;
buffer = c -> outbufs;
/* If there is no space available in this buffer,
allocate a new one. */
if (!BUFFER_BYTES_FREE (buffer)) {
- status = (omapi_buffer_new
- (&buffer -> next,
- "omapi_private_buffer_copyin"));
+ status = (omapi_buffer_new (&buffer -> next, MDL));
if (status != ISC_R_SUCCESS)
return status;
buffer = buffer -> next;
while (c -> inbufs &&
!BYTES_IN_BUFFER (c -> inbufs)) {
if (c -> inbufs -> next) {
- omapi_buffer_reference
- (&buffer,
- c -> inbufs -> next,
- "omapi_private_buffer_copyout");
- omapi_buffer_dereference
- (&c -> inbufs -> next,
- "omapi_private_buffer_copyout");
+ omapi_buffer_reference (&buffer,
+ c -> inbufs -> next, MDL);
+ omapi_buffer_dereference (&c -> inbufs -> next, MDL);
}
- omapi_buffer_dereference (&c -> inbufs,
- "omapi_private_buffer_copyout");
+ omapi_buffer_dereference (&c -> inbufs, MDL);
if (buffer) {
omapi_buffer_reference
- (&c -> inbufs, buffer,
- "omapi_private_buffer_copyout");
- omapi_buffer_dereference
- (&buffer, "omapi_private_buffer_copyout");
+ (&c -> inbufs, buffer, MDL);
+ omapi_buffer_dereference (&buffer, MDL);
}
}
return ISC_R_SUCCESS;
while (c -> outbufs &&
!BYTES_IN_BUFFER (c -> outbufs)) {
if (c -> outbufs -> next) {
- omapi_buffer_reference
- (&buffer, c -> outbufs -> next,
- "omapi_private_flush");
- omapi_buffer_dereference
- (&c -> outbufs -> next, "omapi_private_flush");
+ omapi_buffer_reference (&buffer,
+ c -> outbufs -> next, MDL);
+ omapi_buffer_dereference (&c -> outbufs -> next, MDL);
}
- omapi_buffer_dereference (&c -> outbufs,
- "omapi_private_flush");
+ omapi_buffer_dereference (&c -> outbufs, MDL);
if (buffer) {
- omapi_buffer_reference (&c -> outbufs, buffer,
- "omapi_private_flush");
- omapi_buffer_dereference (&buffer,
- "omapi_private_flush");
+ omapi_buffer_reference (&c -> outbufs, buffer, MDL);
+ omapi_buffer_dereference (&buffer, MDL);
}
}
return ISC_R_SUCCESS;
Subroutines for dealing with connections. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
omapi_connection_object_t *obj;
int flag;
- obj = (omapi_connection_object_t *)malloc (sizeof *obj);
+ obj = (omapi_connection_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
+ rc_register_mdl (obj, obj -> refcnt);
obj -> type = omapi_type_connection;
status = omapi_object_reference (&c -> outer, (omapi_object_t *)obj,
- "omapi_protocol_connect");
+ MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, c,
- "omapi_protocol_connect");
+ status = omapi_object_reference (&obj -> inner, c, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
he = gethostbyname (server_name);
if (!he) {
omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ MDL);
return ISC_R_HOSTUNKNOWN;
}
hix = 1;
obj -> socket =
socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (obj -> socket < 0) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (errno == EMFILE || errno == ENFILE || errno == ENOBUFS)
return ISC_R_NORESOURCES;
return ISC_R_UNEXPECTED;
#if defined (HAVE_SETFD)
if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
close (obj -> socket);
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
#endif
flag = 1;
if (setsockopt (obj -> socket, SOL_SOCKET, SO_REUSEADDR,
(char *)&flag, sizeof flag) < 0) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
sizeof obj -> remote_addr)) {
if (!he || !he -> h_addr_list [hix]) {
omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ MDL);
if (errno == ECONNREFUSED)
return ISC_R_CONNREFUSED;
if (errno == ENETUNREACH)
}
if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
omapi_connection_writer,
omapi_connection_reaper);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
/* Disconnect from I/O object, if any. */
if (h -> outer)
- omapi_object_dereference (&h -> outer, "omapi_disconnect");
+ omapi_object_dereference (&h -> outer, MDL);
/* If whatever created us registered a signal handler, send it
a disconnect signal. */
return ISC_R_NOTFOUND;
}
-isc_result_t omapi_connection_destroy (omapi_object_t *h, const char *name)
+isc_result_t omapi_connection_destroy (omapi_object_t *h,
+ const char *file, int line)
{
omapi_connection_object_t *c;
if (c -> state == omapi_connection_connected)
omapi_disconnect (h, 1);
if (c -> listener)
- omapi_object_dereference (&c -> listener, name);
+ omapi_object_dereference (&c -> listener, file, line);
return ISC_R_SUCCESS;
}
I/O dispatcher. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
omapi_io_states.type = omapi_type_io_object;
}
- obj = malloc (sizeof *obj);
+ obj = dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
-
obj -> refcnt = 1;
+ rc_register_mdl (obj, obj -> refcnt);
obj -> type = omapi_type_io_object;
- status = omapi_object_reference (&obj -> inner, h,
- "omapi_register_io_object");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_register_io_object");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "omapi_register_io_object");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_register_io_object");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
omapi_object_t *inner;
if (object) {
- waiter = malloc (sizeof *waiter);
+ waiter = dmalloc (sizeof *waiter, MDL);
if (!waiter)
return ISC_R_NOMEMORY;
memset (waiter, 0, sizeof *waiter);
waiter -> refcnt = 1;
+ rc_register_mdl (waiter, waiter -> refcnt);
waiter -> type = omapi_type_waiter;
/* Paste the waiter object onto the inner object we're
for (inner = object; inner -> inner; inner = inner -> inner)
;
- status = omapi_object_reference (&waiter -> outer, inner,
- "omapi_wait_for_completion");
+ status = omapi_object_reference (&waiter -> outer, inner, MDL);
if (status != ISC_R_SUCCESS) {
omapi_object_dereference ((omapi_object_t **)&waiter,
- "omapi_wait_for_completion");
+ MDL);
return status;
}
status = omapi_object_reference (&inner -> inner,
(omapi_object_t *)waiter,
- "omapi_wait_for_completion");
+ MDL);
if (status != ISC_R_SUCCESS) {
omapi_object_dereference ((omapi_object_t **)&waiter,
- "omapi_wait_for_completion");
+ MDL);
return status;
}
} else
if (waiter -> outer) {
if (waiter -> outer -> inner) {
omapi_object_dereference (&waiter -> outer -> inner,
- "omapi_wait_for_completion");
+ MDL);
if (waiter -> inner)
omapi_object_reference
(&waiter -> outer -> inner,
- waiter -> inner,
- "omapi_wait_for_completion");
+ waiter -> inner, MDL);
}
- omapi_object_dereference (&waiter -> outer,
- "omapi_wait_for_completion");
+ omapi_object_dereference (&waiter -> outer, MDL);
}
if (waiter -> inner)
- omapi_object_dereference (&waiter -> inner,
- "omapi_wait_for_completion");
+ omapi_object_dereference (&waiter -> inner, MDL);
- omapi_object_dereference ((omapi_object_t **)&waiter,
- "omapi_wait_for_completion");
+ omapi_object_dereference ((omapi_object_t **)&waiter, MDL);
return ISC_R_SUCCESS;
}
omapi_object_reference
((omapi_object_t **)&tmp,
(omapi_object_t *)io -> next,
- "omapi_wfc");
+ MDL);
if (prev) {
omapi_object_dereference
(((omapi_object_t **)
- &prev -> next), "omapi_wfc");
+ &prev -> next), MDL);
if (tmp)
omapi_object_reference
(((omapi_object_t **)
&prev -> next),
(omapi_object_t *)tmp,
- "omapi_wfc");
+ MDL);
} else {
omapi_object_dereference
(((omapi_object_t **)
&omapi_io_states.next),
- "omapi_wfc");
+ MDL);
if (tmp)
omapi_object_reference
(((omapi_object_t **)
&omapi_io_states.next),
(omapi_object_t *)tmp,
- "omapi_wfc");
+ MDL);
else
omapi_signal_in
((omapi_object_t *)
}
if (tmp)
omapi_object_dereference
- ((omapi_object_t **)&tmp,
- "omapi_wfc");
+ ((omapi_object_t **)&tmp, MDL);
}
}
prev = io;
return ISC_R_NOTFOUND;
}
-isc_result_t omapi_io_destroy (omapi_object_t *h, const char *name)
+isc_result_t omapi_io_destroy (omapi_object_t *h, const char *file, int line)
{
if (h -> type != omapi_type_io_object)
return ISC_R_INVALIDARG;
/*
* Copyright (c) 1995 RadioMail Corporation.
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
*
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
#ifndef lint
static char copyright[] =
-"$Id: errwarn.c,v 1.1 2000/01/25 20:41:45 mellon Exp $ Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: errwarn.c,v 1.2 2000/01/26 14:56:05 mellon Exp $ Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
-#include "dhcpd.h"
+#include <omapip/omapip_p.h>
#include <errno.h>
-static void do_percentm PROTO ((char *obuf, const char *ibuf));
+#ifdef DEBUG
+int log_perror = -1;
+#else
+int log_perror = 1;
+#endif
+int log_priority;
+void (*log_cleanup) (void);
static char mbuf [1024];
static char fbuf [1024];
fprintf (stderr, "exiting.\n");
fflush (stderr);
}
- cleanup ();
+ if (log_cleanup)
+ (*log_cleanup) ();
exit (1);
}
/* Find %m in the input string and substitute an error message string. */
-static void do_percentm (obuf, ibuf)
+void do_percentm (obuf, ibuf)
char *obuf;
const char *ibuf;
{
*p = 0;
}
-
-int parse_warn (ANSI_DECL (struct parse *)cfile,
- ANSI_DECL (const char *) fmt, VA_DOTDOTDOT)
- KandR (struct parse *cfile;)
- KandR (char *fmt;)
- va_dcl
-{
- va_list list;
- static char spaces [] = " ";
- char lexbuf [256];
- unsigned i, lix;
-
- do_percentm (mbuf, fmt);
-#ifndef NO_SNPRINTF
- snprintf (fbuf, sizeof fbuf, "%s line %d: %s",
- cfile -> tlname, cfile -> lexline, mbuf);
-#else
- sprintf (fbuf, "%s line %d: %s",
- cfile -> tlname, cfile -> lexline, mbuf);
-#endif
-
- VA_start (list, fmt);
- vsnprintf (mbuf, sizeof mbuf, fbuf, list);
- va_end (list);
-
- lix = 0;
- for (i = 0;
- cfile -> token_line [i] && i < (cfile -> lexchar - 1); i++) {
- if (lix < (sizeof lexbuf) - 1)
- lexbuf [lix++] = ' ';
- if (cfile -> token_line [i] == '\t') {
- for (lix;
- lix < (sizeof lexbuf) - 1 && (lix & 7); lix++)
- lexbuf [lix] = ' ';
- }
- }
- lexbuf [lix] = 0;
-
-#ifndef DEBUG
- syslog (log_priority | LOG_ERR, mbuf);
- syslog (log_priority | LOG_ERR, cfile -> token_line);
- if (cfile -> lexchar < 81)
- syslog (log_priority | LOG_ERR, "%s^", lexbuf);
-#endif
-
- if (log_perror) {
- write (2, mbuf, strlen (mbuf));
- write (2, "\n", 1);
- write (2, cfile -> token_line, strlen (cfile -> token_line));
- write (2, "\n", 1);
- if (cfile -> lexchar < 81)
- write (2, lexbuf, lix);
- write (2, "^\n", 2);
- }
-
- cfile -> warnings_occurred = 1;
-
- return 0;
-}
-
#ifdef NO_STRERROR
char *strerror (err)
int err;
Subroutines that support the generic object. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#include <omapip/omapip_p.h>
-isc_result_t omapi_generic_new (omapi_object_t **gen, const char *name)
+isc_result_t omapi_generic_new (omapi_object_t **gen,
+ const char *file, int line)
{
omapi_generic_object_t *obj;
- obj = malloc (sizeof *obj);
+ obj = dmalloc (sizeof *obj, file, line);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 0;
obj -> type = omapi_type_generic;
- return omapi_object_reference (gen, (omapi_object_t *)obj, name);
+ return omapi_object_reference (gen, (omapi_object_t *)obj, file, line);
}
isc_result_t omapi_generic_set_value (omapi_object_t *h,
maps to a name/null pair, ISC_R_NOTFOUND is
returned. */
new = (omapi_value_t *)0;
- status = (omapi_value_new (&new,
- "omapi_message_get_value"));
+ status = (omapi_value_new (&new, MDL));
if (status != ISC_R_SUCCESS)
return status;
- omapi_data_string_reference
- (&new -> name, name,
- "omapi_message_get_value");
+ omapi_data_string_reference (&new -> name, name, MDL);
if (value)
- omapi_typed_data_reference
- (&new -> value, value,
- "omapi_generic_set_value");
+ omapi_typed_data_reference (&new -> value,
+ value, MDL);
- omapi_value_dereference (&(g -> values [i]),
- "omapi_message_set_value");
+ omapi_value_dereference (&(g -> values [i]), MDL);
status = (omapi_value_reference
- (&(g -> values [i]), new,
- "omapi_message_set_value"));
- omapi_value_dereference (&new,
- "omapi_message_set_value");
+ (&(g -> values [i]), new, MDL));
+ omapi_value_dereference (&new, MDL);
return status;
}
}
vm_new = 2 * g -> va_max;
else
vm_new = 10;
- va = malloc (vm_new * sizeof *va);
+ va = dmalloc (vm_new * sizeof *va, MDL);
if (!va)
return ISC_R_NOMEMORY;
if (g -> va_max)
memcpy (va, g -> values, g -> va_max * sizeof *va);
memset (va + g -> va_max, 0,
(vm_new - g -> va_max) * sizeof *va);
- free (g -> values);
+ dfree (g -> values, MDL);
g -> values = va;
g -> va_max = vm_new;
}
- status = omapi_value_new (&g -> values [g -> nvalues],
- "omapi_generic_set_value");
+ status = omapi_value_new (&g -> values [g -> nvalues], MDL);
if (status != ISC_R_SUCCESS)
return status;
- omapi_data_string_reference (&g -> values [g -> nvalues] -> name, name,
- "omapi_generic_set_value");
+ omapi_data_string_reference (&g -> values [g -> nvalues] -> name,
+ name, MDL);
if (value)
omapi_typed_data_reference
- (&g -> values [g -> nvalues] -> value, value,
- "omapi_generic_set_value");
+ (&g -> values [g -> nvalues] -> value, value, MDL);
g -> nvalues++;
return ISC_R_SUCCESS;
}
if (!g -> values [i] -> value)
return ISC_R_NOTFOUND;
/* Otherwise, return the name/value pair. */
- return omapi_value_reference
- (value, g -> values [i],
- "omapi_message_get_value");
+ return omapi_value_reference (value,
+ g -> values [i], MDL);
}
}
return ISC_R_NOTFOUND;
}
-isc_result_t omapi_generic_destroy (omapi_object_t *h, const char *name)
+isc_result_t omapi_generic_destroy (omapi_object_t *h,
+ const char *file, int line)
{
omapi_generic_object_t *g;
int i;
for (i = 0; i < g -> nvalues; i++) {
if (g -> values [i])
omapi_value_dereference (&g -> values [i],
- name);
+ file, line);
}
- free (g -> values);
+ dfree (g -> values, file, line);
g -> values = (omapi_value_t **)0;
g -> va_max = 0;
}
}
if (!omapi_handle_table) {
- omapi_handle_table = malloc (sizeof *omapi_handle_table);
+ omapi_handle_table = dmalloc (sizeof *omapi_handle_table, MDL);
if (!omapi_handle_table)
return ISC_R_NOMEMORY;
memset (omapi_handle_table, 0, sizeof *omapi_handle_table);
while (omapi_next_handle >= omapi_handle_table -> limit) {
omapi_handle_table_t *new;
- new = malloc (sizeof *new);
+ new = dmalloc (sizeof *new, MDL);
if (!new)
return ISC_R_NOMEMORY;
memset (new, 0, sizeof *new);
if (table -> leafp) {
status = (omapi_object_reference
(&table -> children [h - table -> first].object,
- o, "omapi_object_handle_in_table"));
+ o, MDL));
if (status != ISC_R_SUCCESS)
return status;
o -> handle = h;
/* If there is no more direct table than this one in the slot
we came up with, make one. */
if (!inner) {
- inner = malloc (sizeof *inner);
+ inner = dmalloc (sizeof *inner, MDL);
if (!inner)
return ISC_R_NOMEMORY;
memset (inner, 0, sizeof *inner);
we are allocating sequentially. */
index = (base - inner -> first) / OMAPI_HANDLE_TABLE_SIZE;
- new = malloc (sizeof *new);
+ new = dmalloc (sizeof *new, MDL);
if (!new)
return ISC_R_NOMEMORY;
memset (new, 0, sizeof *new);
return ISC_R_NOTFOUND;
return omapi_object_reference
(o, table -> children [h - table -> first].object,
- "omapi_handle_lookup_in");
+ MDL);
}
/* Scale is the number of handles represented by each child of this
omapi_listener_object_t *obj;
/* Get the handle. */
- obj = (omapi_listener_object_t *)malloc (sizeof *obj);
+ obj = (omapi_listener_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
+ rc_register_mdl (obj, obj -> refcnt);
obj -> type = omapi_type_listener;
/* Connect this object to the inner object. */
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "omapi_protocol_listen");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, h,
- "omapi_protocol_listen");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
/* Create a socket on which to listen. */
obj -> socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (!obj -> socket) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (errno == EMFILE || errno == ENFILE || errno == ENOBUFS)
return ISC_R_NORESOURCES;
return ISC_R_UNEXPECTED;
#if defined (HAVE_SETFD)
if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
close (obj -> socket);
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
#endif
we were given. */
if (bind (obj -> socket,
(struct sockaddr *)&obj -> address, sizeof obj -> address)) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (errno == EADDRINUSE)
return ISC_R_ADDRNOTAVAIL;
if (errno == EPERM)
/* Now tell the kernel to listen for connections. */
if (listen (obj -> socket, max)) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
omapi_listener_readfd, 0,
omapi_accept, 0, 0);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
listener = (omapi_listener_object_t *)h;
/* Get the handle. */
- obj = (omapi_connection_object_t *)malloc (sizeof *obj);
+ obj = (omapi_connection_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
+ rc_register_mdl (obj, obj -> refcnt);
obj -> type = omapi_type_connection;
/* Accept the connection. */
((struct sockaddr *)
&(obj -> remote_addr)), &len);
if (obj -> socket < 0) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (errno == EMFILE || errno == ENFILE || errno == ENOBUFS)
return ISC_R_NORESOURCES;
return ISC_R_UNEXPECTED;
omapi_connection_writer,
omapi_connection_reaper);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- omapi_object_reference (&obj -> listener, (omapi_object_t *)listener,
- "omapi_accept");
+ omapi_object_reference (&obj -> listener,
+ (omapi_object_t *)listener, MDL);
status = omapi_signal (h, "connect", obj);
/* Lose our reference to the connection, so it'll be gc'd when it's
reaped. */
- omapi_object_dereference ((omapi_object_t **)&obj, "omapi_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
return ISC_R_NOTFOUND;
}
-isc_result_t omapi_listener_destroy (omapi_object_t *h, const char *name)
+isc_result_t omapi_listener_destroy (omapi_object_t *h,
+ const char *file, int line)
{
omapi_listener_object_t *l;
omapi_object_t *g;
isc_result_t status;
- m = malloc (sizeof *m);
+ m = dmalloc (sizeof *m, file, line);
if (!m)
return ISC_R_NOMEMORY;
memset (m, 0, sizeof *m);
m -> type = omapi_type_message;
+ rc_register (file, line, m, m -> refcnt);
m -> refcnt = 1;
g = (omapi_object_t *)0;
status = omapi_generic_new (&g, file, line);
if (status != ISC_R_SUCCESS) {
- free (m);
+ dfree (m, file, line);
return status;
}
status = omapi_object_reference (&m -> inner, g, file, line);
if (status != ISC_R_SUCCESS) {
omapi_object_dereference ((omapi_object_t **)&m, file, line);
- omapi_object_dereference (&g, name);
+ omapi_object_dereference (&g, file, line);
return status;
}
status = omapi_object_reference (&g -> outer,
if (status != ISC_R_SUCCESS) {
omapi_object_dereference ((omapi_object_t **)&m, file, line);
- omapi_object_dereference (&g, name);
+ omapi_object_dereference (&g, file, line);
return status;
}
/* Can set authenticator, but the value must be typed data. */
if (!omapi_ds_strcmp (name, "authenticator")) {
if (m -> authenticator)
- omapi_typed_data_dereference
- (&m -> authenticator, MDL);
- omapi_typed_data_reference (&m -> authenticator,
- value, MDL);
+ omapi_typed_data_dereference (&m -> authenticator,
+ MDL);
+ omapi_typed_data_reference (&m -> authenticator, value, MDL);
return ISC_R_SUCCESS;
} else if (!omapi_ds_strcmp (name, "object")) {
if (value -> type != omapi_datatype_object)
return ISC_R_INVALIDARG;
if (m -> object)
- omapi_object_dereference
- (&m -> object, MDL);
- omapi_object_reference (&m -> object,
- value -> u.object, MDL);
+ omapi_object_dereference (&m -> object, MDL);
+ omapi_object_reference (&m -> object, value -> u.object, MDL);
return ISC_R_SUCCESS;
} else if (!omapi_ds_strcmp (name, "notify-object")) {
if (value -> type != omapi_datatype_object)
return ISC_R_INVALIDARG;
if (m -> notify_object)
- omapi_object_dereference
- (&m -> notify_object, MDL);
+ omapi_object_dereference (&m -> notify_object, MDL);
omapi_object_reference (&m -> notify_object,
value -> u.object, MDL);
return ISC_R_SUCCESS;
omapi_message_object_t *m;
if (h -> type != omapi_type_message)
return ISC_R_INVALIDARG;
- m = (omapi_message_object *)h;
+ m = (omapi_message_object_t *)h;
if (m -> authenticator) {
omapi_typed_data_dereference (&m -> authenticator, file, line);
}
if (omapi_registered_messages) {
omapi_object_reference
((omapi_object_t **)&m -> next,
- (omapi_object_t *)omapi_registered_messages,
- file, line);
+ (omapi_object_t *)omapi_registered_messages, MDL);
omapi_object_reference
((omapi_object_t **)&omapi_registered_messages -> prev,
- (omapi_object_t *)m, file, line);
+ (omapi_object_t *)m, MDL);
omapi_object_dereference
- ((omapi_object_t **)&omapi_registered_messages,
- file, line);
+ ((omapi_object_t **)&omapi_registered_messages, MDL);
}
omapi_object_reference
((omapi_object_t **)&omapi_registered_messages,
- (omapi_object_t *)m, file, line);
+ (omapi_object_t *)m, MDL);
return ISC_R_SUCCESS;;
}
isc_result_t status;
omapi_protocol_object_t *obj;
- obj = (omapi_protocol_object_t *)malloc (sizeof *obj);
+ obj = (omapi_protocol_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
+ rc_register_mdl (obj, obj -> refcnt);
obj -> type = omapi_type_protocol;
status = omapi_connect ((omapi_object_t *)obj, server_name, port);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "omapi_protocol_connect");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, h,
- "omapi_protocol_connect");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
OMAPI_PROTOCOL_VERSION,
sizeof (omapi_protocol_header_t));
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_connect");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
if (authinfo)
- omapi_object_reference (&obj -> authinfo, authinfo,
- "omapi_protocol_connect");
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_accept");
+ omapi_object_reference (&obj -> authinfo, authinfo, MDL);
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_SUCCESS;
}
case omapi_protocol_header_wait:
status = omapi_message_new ((omapi_object_t **)&p -> message,
- "omapi_protocol_signal_handler");
+ MDL);
if (status != ISC_R_SUCCESS) {
omapi_disconnect (c, 1);
return status;
}
/* Allocate a buffer for the name. */
- status = (omapi_data_string_new
- (&p -> name, nlen, "omapi_protocol_signal_handler"));
+ status = (omapi_data_string_new (&p -> name, nlen, MDL));
if (status != ISC_R_SUCCESS) {
omapi_disconnect (c, 1);
return ISC_R_NOMEMORY;
if (!vlen)
goto insert_new_value;
- status = (omapi_typed_data_new
- (&p -> value, omapi_datatype_data, vlen,
- "omapi_protocol_signal_handler"));
+ status = omapi_typed_data_new (MDL, &p -> value,
+ omapi_datatype_data,
+ vlen);
if (status != ISC_R_SUCCESS) {
omapi_disconnect (c, 1);
return ISC_R_NOMEMORY;
/* We need a generic object to hang off of the
incoming message. */
status = (omapi_generic_new
- (&p -> message -> object,
- "omapi_protocol_signal_handler"));
+ (&p -> message -> object, MDL));
if (status != ISC_R_SUCCESS) {
omapi_disconnect (c, 1);
return status;
omapi_disconnect (c, 1);
return status;
}
- omapi_data_string_dereference
- (&p -> name, "omapi_protocol_signal_handler");
- omapi_typed_data_dereference (&p -> value,
- "omapi_protocol_signal_handler");
+ omapi_data_string_dereference (&p -> name, MDL);
+ omapi_typed_data_dereference (&p -> value, MDL);
goto need_name_length;
signature_wait:
case omapi_protocol_signature_wait:
- status = omapi_typed_data_new (&p -> message -> authenticator,
+ status = omapi_typed_data_new (MDL,
+ &p -> message -> authenticator,
omapi_datatype_data,
p -> message -> authlen);
/* XXX unbind the authenticator. */
auth_unbind:
omapi_object_dereference ((omapi_object_t **)&p -> message,
- "omapi_protocol_signal_handler");
+ MDL);
/* Now wait for the next message. */
goto to_header_wait;
return ISC_R_NOTFOUND;
}
-isc_result_t omapi_protocol_destroy (omapi_object_t *h, const char *name)
+isc_result_t omapi_protocol_destroy (omapi_object_t *h,
+ const char *file, int line)
{
omapi_protocol_object_t *p;
if (h -> type != omapi_type_protocol)
p = (omapi_protocol_object_t *)h;
if (p -> message)
omapi_object_dereference ((omapi_object_t **)&p -> message,
- name);
+ file, line);
if (p -> authinfo)
- return omapi_object_dereference (&p -> authinfo, name);
+ return omapi_object_dereference (&p -> authinfo, file, line);
return ISC_R_SUCCESS;
}
isc_result_t status;
omapi_protocol_listener_object_t *obj;
- obj = (omapi_protocol_listener_object_t *)malloc (sizeof *obj);
+ obj = (omapi_protocol_listener_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
obj -> type = omapi_type_protocol_listener;
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "omapi_protocol_listen");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, h,
- "omapi_protocol_listen");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
status = omapi_listen ((omapi_object_t *)obj, port, max);
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
if (!c || c -> type != omapi_type_connection)
return ISC_R_INVALIDARG;
- obj = (omapi_protocol_object_t *)malloc (sizeof *obj);
+ obj = (omapi_protocol_object_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
obj -> type = omapi_type_protocol;
- status = omapi_object_reference (&obj -> outer, c,
- "omapi_protocol_accept");
+ status = omapi_object_reference (&obj -> outer, c, MDL);
if (status != ISC_R_SUCCESS) {
lose:
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
omapi_disconnect (c, 1);
return status;
}
- status = omapi_object_reference (&c -> inner, (omapi_object_t *)obj,
- "omapi_protocol_accept");
+ status = omapi_object_reference (&c -> inner,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS)
goto lose;
if (status != ISC_R_SUCCESS)
goto lose;
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
}
isc_result_t omapi_protocol_listener_destroy (omapi_object_t *h,
- const char *name)
+ const char *file, int line)
{
if (h -> type != omapi_type_protocol_listener)
return ISC_R_INVALIDARG;
if (po -> type != omapi_type_protocol)
return ISC_R_INVALIDARG;
- status = omapi_message_new (&message, "omapi_protocol_send_status");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS)
return status;
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_STATUS);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "omapi_protocol_send_status");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"rid", (int)rid);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "omapi_protocol_send_status");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"result", (int)waitstatus);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "omapi_protocol_send_status");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_string_value (message, (omapi_object_t *)0,
"message", msg);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference
- (&message, "omapi_protocol_send_status");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
if (po -> type != omapi_type_protocol)
return ISC_R_INVALIDARG;
- status = omapi_message_new (&message, "omapi_protocol_send_update");
+ status = omapi_message_new (&message, MDL);
if (status != ISC_R_SUCCESS)
return status;
status = omapi_set_int_value (message, (omapi_object_t *)0,
"op", OMAPI_OP_UPDATE);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message,
- "omapi_protocol_send_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"rid", (int)rid);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference
- (&message, "omapi_protocol_send_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_object_handle (&handle, object);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference
- (&message, "omapi_protocol_send_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
status = omapi_set_int_value (message, (omapi_object_t *)0,
"handle", (int)handle);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference
- (&message, "omapi_protocol_send_update");
+ omapi_object_dereference (&message, MDL);
return status;
}
}
status = omapi_set_object_value (message, (omapi_object_t *)0,
"object", object);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference (&message, "dhcpctl_open_object");
+ omapi_object_dereference (&message, MDL);
return status;
}
omapi_value_t **),
isc_result_t (*destroy)
(omapi_object_t *,
- const char *),
+ const char *, int),
isc_result_t (*signal_handler)
(omapi_object_t *,
const char *, va_list),
{
omapi_object_type_t *t;
- t = malloc (sizeof *t);
+ t = dmalloc (sizeof *t, MDL);
if (!t)
return ISC_R_NOMEMORY;
memset (t, 0, sizeof *t);
isc_result_t status;
nds = (omapi_data_string_t *)0;
- status = omapi_data_string_new (&nds, strlen (name),
- "omapi_set_value_str");
+ status = omapi_data_string_new (&nds, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (nds -> value, name, strlen (name));
int len;
int ip;
- status = omapi_data_string_new (&n, strlen (name),
- "omapi_set_boolean_value");
+ status = omapi_data_string_new (&n, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (n -> value, name, strlen (name));
- status = omapi_typed_data_new (&tv, omapi_datatype_int, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&n,
- "omapi_set_boolean_value");
+ omapi_data_string_dereference (&n, MDL);
return status;
}
status = omapi_set_value (h, id, n, tv);
- omapi_data_string_dereference (&n, "omapi_set_boolean_value");
- omapi_typed_data_dereference (&tv, "omapi_set_boolean_value");
+ omapi_data_string_dereference (&n, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&n, strlen (name),
- "omapi_set_int_value");
+ status = omapi_data_string_new (&n, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (n -> value, name, strlen (name));
- status = omapi_typed_data_new (&tv, omapi_datatype_int, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&n,
- "omapi_set_int_value");
+ omapi_data_string_dereference (&n, MDL);
return status;
}
status = omapi_set_value (h, id, n, tv);
- omapi_data_string_dereference (&n, "omapi_set_int_value");
- omapi_typed_data_dereference (&tv, "omapi_set_int_value");
+ omapi_data_string_dereference (&n, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&n, strlen (name),
- "omapi_set_object_value");
+ status = omapi_data_string_new (&n, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (n -> value, name, strlen (name));
- status = omapi_typed_data_new (&tv, omapi_datatype_object, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_object, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&n,
- "omapi_set_object_value");
+ omapi_data_string_dereference (&n, MDL);
return status;
}
status = omapi_set_value (h, id, n, tv);
- omapi_data_string_dereference (&n, "omapi_set_object_value");
- omapi_typed_data_dereference (&tv, "omapi_set_object_value");
+ omapi_data_string_dereference (&n, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
int len;
int ip;
- status = omapi_data_string_new (&n, strlen (name),
- "omapi_set_string_value");
+ status = omapi_data_string_new (&n, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (n -> value, name, strlen (name));
- status = omapi_typed_data_new (&tv, omapi_datatype_string, value);
+ status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value);
if (status != ISC_R_SUCCESS) {
- omapi_data_string_dereference (&n,
- "omapi_set_string_value");
+ omapi_data_string_dereference (&n, MDL);
return status;
}
status = omapi_set_value (h, id, n, tv);
- omapi_data_string_dereference (&n, "omapi_set_string_value");
- omapi_typed_data_dereference (&tv, "omapi_set_string_value");
+ omapi_data_string_dereference (&n, MDL);
+ omapi_typed_data_dereference (&tv, MDL);
return status;
}
isc_result_t status;
nds = (omapi_data_string_t *)0;
- status = omapi_data_string_new (&nds, strlen (name),
- "omapi_get_value_str");
+ status = omapi_data_string_new (&nds, strlen (name), MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (nds -> value, name, strlen (name));
return 0;
}
-isc_result_t omapi_make_value (omapi_value_t **vp, omapi_data_string_t *name,
- omapi_typed_data_t *value, const char *caller)
+isc_result_t omapi_make_value (omapi_value_t **vp,
+ omapi_data_string_t *name,
+ omapi_typed_data_t *value,
+ const char *file, int line)
{
isc_result_t status;
- status = omapi_value_new (vp, caller);
+ status = omapi_value_new (vp, file, line);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_data_string_reference (&(*vp) -> name, name, caller);
+ status = omapi_data_string_reference (&(*vp) -> name,
+ name, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
if (value) {
status = omapi_typed_data_reference (&(*vp) -> value,
- value, caller);
+ value, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
}
isc_result_t omapi_make_const_value (omapi_value_t **vp,
omapi_data_string_t *name,
const unsigned char *value,
- unsigned len, const char *caller)
+ unsigned len,
+ const char *file, int line)
{
isc_result_t status;
- status = omapi_value_new (vp, caller);
+ status = omapi_value_new (vp, file, line);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_data_string_reference (&(*vp) -> name, name, caller);
+ status = omapi_data_string_reference (&(*vp) -> name,
+ name, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
if (value) {
- status = omapi_typed_data_new (&(*vp) -> value,
+ status = omapi_typed_data_new (file, line, &(*vp) -> value,
omapi_datatype_data, len);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
memcpy ((*vp) -> value -> u.buffer.value, value, len);
isc_result_t omapi_make_int_value (omapi_value_t **vp,
omapi_data_string_t *name,
- int value, const char *caller)
+ int value, const char *file, int line)
{
isc_result_t status;
- status = omapi_value_new (vp, caller);
+ status = omapi_value_new (vp, file, line);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_data_string_reference (&(*vp) -> name, name, caller);
+ status = omapi_data_string_reference (&(*vp) -> name,
+ name, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
if (value) {
- status = omapi_typed_data_new (&(*vp) -> value,
+ status = omapi_typed_data_new (file, line, &(*vp) -> value,
omapi_datatype_int);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
(*vp) -> value -> u.integer = value;
isc_result_t omapi_make_handle_value (omapi_value_t **vp,
omapi_data_string_t *name,
omapi_object_t *value,
- const char *caller)
+ const char *file, int line)
{
isc_result_t status;
- status = omapi_value_new (vp, caller);
+ status = omapi_value_new (vp, file, line);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_data_string_reference (&(*vp) -> name, name, caller);
+ status = omapi_data_string_reference (&(*vp) -> name,
+ name, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
if (value) {
- status = omapi_typed_data_new (&(*vp) -> value,
+ status = omapi_typed_data_new (file, line, &(*vp) -> value,
omapi_datatype_int);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
status = (omapi_object_handle
((omapi_handle_t *)&(*vp) -> value -> u.integer,
value));
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
}
isc_result_t omapi_make_string_value (omapi_value_t **vp,
omapi_data_string_t *name,
- const char *value, const char *caller)
+ const char *value,
+ const char *file, int line)
{
isc_result_t status;
- status = omapi_value_new (vp, caller);
+ status = omapi_value_new (vp, file, line);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_data_string_reference (&(*vp) -> name, name, caller);
+ status = omapi_data_string_reference (&(*vp) -> name,
+ name, file, line);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
if (value) {
- status = omapi_typed_data_new (&(*vp) -> value,
+ status = omapi_typed_data_new (file, line, &(*vp) -> value,
omapi_datatype_string, value);
if (status != ISC_R_SUCCESS) {
- omapi_value_dereference (vp, caller);
+ omapi_value_dereference (vp, file, line);
return status;
}
}
fprintf (stderr, "Usage: test listen port\n");
exit (1);
}
- status = omapi_generic_new (&listener, "main");
+ status = omapi_generic_new (&listener, MDL);
if (status != ISC_R_SUCCESS) {
fprintf (stderr, "omapi_generic_new: %s\n",
isc_result_totext (status));
fprintf (stderr, "Usage: test listen address port\n");
exit (1);
}
- status = omapi_generic_new (&connection, "main");
+ status = omapi_generic_new (&connection, MDL);
if (status != ISC_R_SUCCESS) {
fprintf (stderr, "omapi_generic_new: %s\n",
isc_result_totext (status));
DHCP/BOOTP Relay Agent. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char ocopyright[] =
-"$Id: dhcrelay.c,v 1.37 2000/01/05 18:11:53 mellon Exp $ Copyright (c) 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dhcrelay.c,v 1.38 2000/01/26 14:56:16 mellon Exp $ Copyright (c) 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
TIME max_lease_time = 86400; /* 24 hours... */
struct tree_cache *global_options [256];
-int log_perror = 1;
-
/* Needed to prevent linking against conflex.c. */
int lexline;
int lexchar;
u_int16_t local_port;
u_int16_t remote_port;
-int log_priority;
struct server_list {
struct server_list *next;
} else if (!strcmp (argv [i], "-i")) {
struct interface_info *tmp =
((struct interface_info *)
- dmalloc (sizeof *tmp, "specified_interface"));
+ dmalloc (sizeof *tmp, MDL));
if (!tmp)
log_fatal ("Insufficient memory to %s %s",
"record interface", argv [i]);
}
}
if (iap) {
- sp = (struct server_list *)malloc (sizeof *sp);
+ sp = ((struct server_list *)
+ dmalloc (sizeof *sp, MDL));
if (!sp)
log_fatal ("no memory for server.\n");
sp -> next = servers;
" [server1 [... serverN]]");
}
-void cleanup ()
-{
-}
-
int write_lease (lease)
struct lease *lease;
{
#ifndef lint
static char copyright[] =
-"$Id: confpars.c,v 1.96 2000/01/25 01:38:17 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: confpars.c,v 1.97 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
return;
}
- peer = dmalloc (sizeof *peer, "parse_failover_peer");
+ peer = dmalloc (sizeof *peer, MDL);
if (!peer)
log_fatal ("no memory for failover peer%s.", name);
memset (peer, 0, sizeof *peer);
if (token == RBRACE) {
token = next_token (&val, cfile);
if (!share -> subnets) {
- parse_warn (cfile, MDL);
+ parse_warn (cfile,
+ "empty shared-network decl");
return;
}
enter_shared_network (share);
#ifndef lint
static char copyright[] =
-"$Id: db.c,v 1.41 2000/01/25 01:39:57 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
+"$Id: db.c,v 1.42 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
(struct option_state *)0,
(struct option_state *)0,
&global_scope,
- host -> fixed_addr)) {
+ host -> fixed_addr, MDL)) {
errno = 0;
fprintf (db_file, "\n fixed-address ");
#ifndef lint
static char copyright[] =
-"$Id: dhcp.c,v 1.133 2000/01/25 01:35:38 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dhcp.c,v 1.134 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
/* If it's an expired lease, get rid of any bindings. */
if (lease -> ends < cur_time && lease -> scope.bindings)
- free_bindings (&lease -> scope, "dhcpdiscover");
+ free_bindings (&lease -> scope, MDL);
/* Set the lease to really expire in 2 minutes, unless it has
not yet expired, in which case leave its expiry time alone. */
&global_scope, oc, MDL)) {
cip.len = 4;
memcpy (cip.iabuf, data.data, 4);
- data_string_forget (&data, "dhcprequest");
+ data_string_forget (&data, MDL);
} else {
oc = (struct option_cache *)0;
cip.len = 4;
packet -> options, (struct option_state *)0,
&global_scope, oc, MDL)) {
lease = find_lease_by_uid (data.data, data.len);
- data_string_forget (&data, "dhcprelease");
+ data_string_forget (&data, MDL);
/* See if we can find a lease that matches the IP address
the client is claiming. */
cip.len = 4;
memcpy (cip.iabuf, data.data, 4);
- data_string_forget (&data, "dhcpdecline");
+ data_string_forget (&data, MDL);
lease = find_lease_by_ip_addr (cip);
- option_state_allocate (&options, "dhcpdecline");
+ option_state_allocate (&options, MDL);
/* Execute statements in scope starting with the subnet scope. */
if (lease)
status);
}
- option_state_dereference (&options, "dhcpdecline");
+ option_state_dereference (&options, MDL);
}
void dhcpinform (packet)
}
memset (&d1, 0, sizeof d1);
- option_state_allocate (&options, "dhcpinform");
+ option_state_allocate (&options, MDL);
memset (&outgoing, 0, sizeof outgoing);
memset (&raw, 0, sizeof raw);
outgoing.raw = &raw;
else
raw.file [i] = 0;
memcpy (raw.file, d1.data, i);
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
}
/* Choose a server name as above. */
else
raw.sname [i] = 0;
memcpy (raw.sname, d1.data, i);
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
}
/* Set a flag if this client is a lame Microsoft client that NUL
&global_scope, oc, MDL)) {
if (d1.data [d1.len - 1] == '\0')
nulltp = 1;
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
}
}
/* Put in DHCP-specific options. */
i = DHO_DHCP_MESSAGE_TYPE;
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression, &dhcpack, 1, 0, 0)) {
oc -> option = dhcp_universe.options [i];
save_option (&dhcp_universe, options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
i = DHO_DHCP_SERVER_IDENTIFIER;
if (!(oc = lookup_option (&dhcp_universe, options, i))) {
use_primary:
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data
(&oc -> expression,
((unsigned char *)
save_option (&dhcp_universe,
options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
from = packet -> interface -> primary_address;
} else {
packet -> options, options,
&global_scope, oc, MDL)) {
if (!d1.len || d1.len != sizeof from) {
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
goto use_primary;
}
memcpy (&from, d1.data, sizeof from);
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
} else
goto use_primary;
}
i = DHO_SUBNET_MASK;
if (subnet && !lookup_option (&dhcp_universe, options, i)) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
subnet -> netmask.iabuf,
subnet -> netmask.len, 0, 0)) {
oc -> option = dhcp_universe.options [i];
save_option (&dhcp_universe, options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
}
i = DHO_NWIP_SUBOPTIONS;
if (!lookup_option (&dhcp_universe, options, i)) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
memset (&d1, 0, sizeof d1);
d1.data = "nwip";
d1.len = 4;
oc -> option = dhcp_universe.options [i];
save_option (&dhcp_universe, options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
}
packet -> options, options,
&global_scope, oc, MDL)) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_encapsulation (&oc -> expression, &d1)) {
oc -> option = dhcp_universe.options [i];
save_option (&dhcp_universe, options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
}
/* If a site option space has been specified, use that for
hash_lookup (&universe_hash, d1.data, d1.len));
if (!u) {
log_error ("unknown option space %s.", d1.data);
- option_state_dereference (&options, "dhcpinform");
+ option_state_dereference (&options, MDL);
return;
}
options -> site_universe = u -> index;
options -> site_code_min = 128; /* XXX */
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
} else {
options -> site_universe = dhcp_universe.index;
options -> site_code_min = 0; /* Trust me, it works. */
take the first. */
if (d1.len >= 4 && d1.data)
memcpy (&raw.siaddr, d1.data, 4);
- data_string_forget (&d1, "dhcpinform");
+ data_string_forget (&d1, MDL);
}
}
0, packet -> options, options, &global_scope,
0, nulltp, 0,
prl.len ? &prl : (struct data_string *)0);
- option_state_dereference (&options, "dhcpinform");
- data_string_forget (&prl, "dhcpinform");
+ option_state_dereference (&options, MDL);
+ data_string_forget (&prl, MDL);
/* Make sure that the packet is at least as big as a BOOTP packet. */
if (outgoing.packet_length < BOOTP_MIN_LEN)
struct expression *expr;
struct option_cache *oc = (struct option_cache *)0;
- option_state_allocate (&options, "nak_lease");
+ option_state_allocate (&options, MDL);
memset (&outgoing, 0, sizeof outgoing);
memset (&raw, 0, sizeof raw);
outgoing.raw = &raw;
/* Set DHCP_MESSAGE_TYPE to DHCPNAK */
- if (!option_cache_allocate (&oc, "nak_lease")) {
+ if (!option_cache_allocate (&oc, MDL)) {
log_error ("No memory for DHCPNAK message type.");
- option_state_dereference (&options, "nak_lease");
+ option_state_dereference (&options, MDL);
return;
}
if (!make_const_data (&oc -> expression, &nak, sizeof nak, 0, 0)) {
log_error ("No memory for expr_const expression.");
- option_cache_dereference (&oc, "nak_lease");
- option_state_dereference (&options, "nak_lease");
+ option_cache_dereference (&oc, MDL);
+ option_state_dereference (&options, MDL);
return;
}
oc -> option = dhcp_universe.options [DHO_DHCP_MESSAGE_TYPE];
save_option (&dhcp_universe, options, oc);
- option_cache_dereference (&oc, "nak_lease");
+ option_cache_dereference (&oc, MDL);
/* Set DHCP_MESSAGE to whatever the message is */
- if (!option_cache_allocate (&oc, "nak_lease")) {
+ if (!option_cache_allocate (&oc, MDL)) {
log_error ("No memory for DHCPNAK message type.");
- option_state_dereference (&options, "nak_lease");
+ option_state_dereference (&options, MDL);
return;
}
if (!make_const_data (&oc -> expression,
(unsigned char *)dhcp_message,
strlen (dhcp_message), 1, 0)) {
log_error ("No memory for expr_const expression.");
- option_cache_dereference (&oc, "nak_lease");
- option_state_dereference (&options, "nak_lease");
+ option_cache_dereference (&oc, MDL);
+ option_state_dereference (&options, MDL);
return;
}
oc -> option = dhcp_universe.options [DHO_DHCP_MESSAGE];
save_option (&dhcp_universe, options, oc);
- option_cache_dereference (&oc, "nak_lease");
+ option_cache_dereference (&oc, MDL);
/* Do not use the client's requested parameter list. */
delete_option (&dhcp_universe, packet -> options,
cons_options (packet, outgoing.raw, (struct lease *)0,
0, packet -> options, options, &global_scope,
0, 0, 0, (struct data_string *)0);
- option_state_dereference (&options, "nak_lease");
+ option_state_dereference (&options, MDL);
/* memset (&raw.ciaddr, 0, sizeof raw.ciaddr);*/
raw.siaddr = packet -> interface -> primary_address;
return;
/* Allocate a lease state structure... */
- state = new_lease_state ("ack_lease");
+ state = new_lease_state (MDL);
if (!state)
log_fatal ("unable to allocate lease state!");
state -> got_requested_address = packet -> got_requested_address;
strlen (lease -> client_hostname) == d1.len &&
!memcmp (lease -> client_hostname, d1.data, d1.len)) {
/* Hasn't changed. */
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
} else if (oc && s1) {
if (lease -> client_hostname)
- dfree (lease -> client_hostname, "ack_lease");
+ dfree (lease -> client_hostname, MDL);
lease -> client_hostname =
- dmalloc (d1.len + 1, "ack_lease");
+ dmalloc (d1.len + 1, MDL);
if (!lease -> client_hostname)
log_error ("no memory for client hostname.");
else {
memcpy (lease -> client_hostname, d1.data, d1.len);
lease -> client_hostname [d1.len] = 0;
}
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
} else if (lease -> client_hostname) {
- dfree (lease -> client_hostname, "ack_lease");
+ dfree (lease -> client_hostname, MDL);
lease -> client_hostname = 0;
}
ones if there are any to insert. */
if (lease -> on_expiry)
executable_statement_dereference (&lease -> on_expiry,
- "ack_lease");
+ MDL);
if (lease -> on_commit)
executable_statement_dereference (&lease -> on_commit,
- "ack_lease");
+ MDL);
if (lease -> on_release)
executable_statement_dereference (&lease -> on_release,
- "ack_lease");
+ MDL);
}
/* Execute statements in scope starting with the subnet scope. */
if (d1.len && packet -> raw -> secs < d1.data [0]) {
log_info ("%s: %d secs < %d", msg,
packet -> raw -> secs, d1.data [0]);
- data_string_forget (&d1, "ack_lease");
- free_lease_state (state, "ack_lease");
- static_lease_dereference (lease, "ack_lease");
+ data_string_forget (&d1, MDL);
+ free_lease_state (state, MDL);
+ static_lease_dereference (lease, MDL);
return;
}
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
packet -> options, state -> options,
&lease -> scope, oc, MDL)) {
hp = find_hosts_by_uid (d1.data, d1.len);
- data_string_forget (&d1, "dhcpdiscover");
+ data_string_forget (&d1, MDL);
if (!hp)
hp = find_hosts_by_haddr
(packet -> raw -> htype,
&lease -> scope, oc, MDL)) {
if (!ignorep)
log_info ("%s: unknown client", msg);
- free_lease_state (state, "ack_lease");
- static_lease_dereference (lease, "ack_lease");
+ free_lease_state (state, MDL);
+ static_lease_dereference (lease, MDL);
return;
}
&lease -> scope, oc, MDL)) {
if (!ignorep)
log_info ("%s: bootp disallowed", msg);
- free_lease_state (state, "ack_lease");
- static_lease_dereference (lease, "ack_lease");
+ free_lease_state (state, MDL);
+ static_lease_dereference (lease, MDL);
return;
}
&lease -> scope, oc, MDL)) {
if (!ignorep)
log_info ("%s: booting disallowed", msg);
- free_lease_state (state, "ack_lease");
- static_lease_dereference (lease, "ack_lease");
+ free_lease_state (state, MDL);
+ static_lease_dereference (lease, MDL);
return;
}
if (i == packet -> class_count) {
log_info ("%s: no available billing",
msg);
- free_lease_state (state, "ack_lease");
+ free_lease_state (state, MDL);
/* XXX probably not necessary: */
- static_lease_dereference (lease,
- "ack_lease");
+ static_lease_dereference (lease, MDL);
return;
}
}
if (d1.len == sizeof (u_int32_t))
default_lease_time =
getULong (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
s1 = 0;
if (s1 && d1.len == sizeof (u_int32_t)) {
lease_time = getULong (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
} else {
if (s1)
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
lease_time = default_lease_time;
}
if (d1.len == sizeof (u_int32_t))
max_lease_time =
getULong (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
&lease -> scope, oc, MDL)) {
if (d1.len == sizeof (u_int32_t))
min_lease_time = getULong (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
&lease -> scope, oc, MDL)) {
if (d1.len == sizeof (u_int32_t))
lease_time = getULong (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
if (d1.len == sizeof (u_int32_t))
lease_time = (getULong (d1.data) -
cur_time);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
unsigned char *tuid;
lt.uid_max = d1.len;
lt.uid_len = d1.len;
- tuid = (unsigned char *)dmalloc (lt.uid_max,
- "ack_lease");
+ tuid = (unsigned char *)dmalloc (lt.uid_max, MDL);
/* XXX inelegant */
if (!tuid)
log_fatal ("no memory for large uid.");
memcpy (tuid, d1.data, lt.uid_len);
lt.uid = tuid;
}
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
lt.host = lease -> host;
lease -> on_commit);
if (lease -> on_commit)
executable_statement_dereference (&lease -> on_commit,
- "ack_lease");
+ MDL);
}
/* Save any bindings. */
if (!(supersede_lease (lease, <, !offer || offer == DHCPACK)
|| (offer && offer != DHCPACK))) {
log_info ("%s: database update failed", msg);
- free_lease_state (state, "ack_lease");
- static_lease_dereference (lease, "ack_lease");
+ free_lease_state (state, MDL);
+ static_lease_dereference (lease, MDL);
return;
} else {
/* If this is a DHCPOFFER transaction, supersede_lease
&lease -> scope, oc, MDL)) {
if (d1.len == sizeof (u_int16_t))
state -> max_message_size = getUShort (d1.data);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
/* Now, if appropriate, put in DHCP-specific options that
if (state -> offer) {
i = DHO_DHCP_MESSAGE_TYPE;
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
&state -> offer, 1, 0, 0)) {
oc -> option =
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
i = DHO_DHCP_SERVER_IDENTIFIER;
if (!(oc = lookup_option (&dhcp_universe,
state -> options, i))) {
use_primary:
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data
(&oc -> expression,
((unsigned char *)
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
state -> from.len =
sizeof state -> ip -> primary_address;
&lease -> scope, oc, MDL)) {
if (!d1.len ||
d1.len > sizeof state -> from.iabuf) {
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
goto use_primary;
}
memcpy (state -> from.iabuf, d1.data, d1.len);
state -> from.len = d1.len;
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
} else
goto use_primary;
}
log_error ("dhcp-lease-time option for %s overridden.",
inet_ntoa (state -> ciaddr));
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
(unsigned char *)&state -> expiry,
sizeof state -> expiry, 0, 0)) {
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
/* Renewal time is lease time * 0.5. */
log_error ("overriding dhcp-renewal-time for %s.",
inet_ntoa (state -> ciaddr));
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
(unsigned char *)
&state -> renewal,
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
/* Rebinding time is lease time * 0.875. */
log_error ("overriding dhcp-rebinding-time for %s.",
inet_ntoa (state -> ciaddr));
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
(unsigned char *)&state -> rebind,
sizeof state -> rebind, 0, 0)) {
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
} else {
state -> from.len =
take the first. */
if (d1.len >= 4 && d1.data)
memcpy (&state -> siaddr, d1.data, 4);
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
}
mask has been provided. */
i = DHO_SUBNET_MASK;
if (!lookup_option (&dhcp_universe, state -> options, i)) {
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
lease -> subnet -> netmask.iabuf,
lease -> subnet -> netmask.len,
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
}
&lease -> scope,
lookup_option (&server_universe, state -> options, j), MDL))) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
((unsigned char *)
lease -> host -> name),
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
}
log_error ("No hostname for %s", inet_ntoa (ia));
else {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
((unsigned char *)
h -> h_name),
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
}
}
oc = lookup_option (&dhcp_universe, state -> options, i);
if (!oc) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_const_data (&oc -> expression,
lease -> ip_addr.iabuf,
lease -> ip_addr.len,
}
}
if (oc)
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
/* Make an encapsulation for the NWIP suboptions if the client
i = DHO_NWIP_SUBOPTIONS;
if (!(oc = lookup_option (&dhcp_universe, state -> options, i))) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "dhcpinform")) {
+ if (option_cache_allocate (&oc, MDL)) {
memset (&d1, 0, sizeof d1);
d1.data = "nwip";
d1.len = 4;
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "dhcpinform");
+ option_cache_dereference (&oc, MDL);
}
}
packet -> options, state -> options,
&lease -> scope, oc, MDL)) {
oc = (struct option_cache *)0;
- if (option_cache_allocate (&oc, "ack_lease")) {
+ if (option_cache_allocate (&oc, MDL)) {
if (make_encapsulation (&oc -> expression, &d1)) {
oc -> option = dhcp_universe.options [i];
save_option (&dhcp_universe,
state -> options, oc);
}
- option_cache_dereference (&oc, "ack_lease");
+ option_cache_dereference (&oc, MDL);
}
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
}
/* If a site option space has been specified, use that for
state -> options -> site_universe = u -> index;
state -> options -> site_code_min = 128; /* XXX */
- data_string_forget (&d1, "ack_lease");
+ data_string_forget (&d1, MDL);
} else {
state -> options -> site_code_min = 0;
state -> options -> site_universe = dhcp_universe.index;
log_info ("%s", msg);
/* Hang the packet off the lease state. */
- packet_reference (&lease -> state -> packet, packet, "ack_lease");
+ packet_reference (&lease -> state -> packet, packet, MDL);
/* If this is a DHCPOFFER, ping the lease address before actually
sending the offer. */
++outstanding_pings;
} else {
lease -> timestamp = cur_time;
- static_lease_dereference (lease, "ack_lease");
+ static_lease_dereference (lease, MDL);
dhcp_reply (lease);
}
}
raw.siaddr, &to,
(struct hardware *)0);
- free_lease_state (state, "dhcp_reply fallback 1");
+ free_lease_state (state, MDL);
lease -> state = (struct lease_state *)0;
return;
}
&raw, packet_length,
raw.siaddr, &to,
(struct hardware *)0);
- free_lease_state (state, "dhcp_reply fallback 2");
+ free_lease_state (state, MDL);
lease -> state = (struct lease_state *)0;
return;
}
/* Free all of the entries in the option_state structure
now that we're done with them. */
- free_lease_state (state, "dhcp_reply");
+ free_lease_state (state, MDL);
lease -> state = (struct lease_state *)0;
}
packet -> got_requested_address = 1;
cip.len = 4;
memcpy (cip.iabuf, d1.data, cip.len);
- data_string_forget (&d1, "find_lease");
+ data_string_forget (&d1, MDL);
} else if (packet -> raw -> ciaddr.s_addr) {
cip.len = 4;
memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);
out:
if (have_client_identifier)
- data_string_forget (&client_identifier, "find_lease");
+ data_string_forget (&client_identifier, MDL);
#if defined (DEBUG_FIND_LEASE)
if (lease)
dangling from the lease will be lost, so reference counts will be screwed
up and memory leaks will occur. */
-void static_lease_dereference (lease, name)
+void static_lease_dereference (lease, file, line)
struct lease *lease;
- const char *name;
+ const char *file;
+ int line;
{
if (!(lease -> flags & STATIC_LEASE))
return;
if (lease -> on_release)
- executable_statement_dereference (&lease -> on_release, name);
+ executable_statement_dereference (&lease -> on_release,
+ file, line);
if (lease -> on_expiry)
- executable_statement_dereference (&lease -> on_expiry, name);
+ executable_statement_dereference (&lease -> on_expiry,
+ file, line);
if (lease -> on_commit)
- executable_statement_dereference (&lease -> on_commit, name);
+ executable_statement_dereference (&lease -> on_commit,
+ file, line);
if (&lease -> scope)
- free_bindings (&lease -> scope, name);
+ free_bindings (&lease -> scope, file, line);
}
/* Look through all the pools in a list starting with the specified pool
return 0;
/* Make space for this suboption. */
t = (struct option_tag *)
- dmalloc (op [1] + 1 + sizeof *t,
- "parse_agent_information_option");
+ dmalloc (op [1] + 1 + sizeof *t, MDL);
if (!t)
log_fatal ("no memory for option tag data.");
}
/* Make an agent options structure to put on the list. */
- a = (struct agent_options *)dmalloc (sizeof *a,
- "parse_agent_information_option");
+ a = (struct agent_options *)dmalloc (sizeof *a, MDL);
if (!a)
log_fatal ("can't allocate space for agent option structure.");
DHCP Server Daemon. */
/*
- * Copyright (c) 1996-1999 Internet Software Consortium.
+ * Copyright (c) 1996-2000 Internet Software Consortium.
* Use is subject to license terms which appear in the file named
* ISC-LICENSE that should have accompanied this file when you
* received it. If a file named ISC-LICENSE did not accompany this
#ifndef lint
static char ocopyright[] =
-"$Id: dhcpd.c,v 1.80 2000/01/05 18:17:10 mellon Exp $ Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.";
+"$Id: dhcpd.c,v 1.81 2000/01/26 14:56:18 mellon Exp $ Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.";
#endif
static char copyright[] =
struct in_addr limited_broadcast;
-int log_priority;
-#ifdef DEBUG
-int log_perror = -1;
-#else
-int log_perror = 1;
-#endif
-
const char *path_dhcpd_conf = _PATH_DHCPD_CONF;
const char *path_dhcpd_db = _PATH_DHCPD_DB;
const char *path_dhcpd_pid = _PATH_DHCPD_PID;
} else {
struct interface_info *tmp =
((struct interface_info *)
- dmalloc (sizeof *tmp, "get_interface_list"));
+ dmalloc (sizeof *tmp, MDL));
if (!tmp)
log_fatal ("Insufficient memory to %s %s",
"record interface", argv [i]);
exit(0);
/* Now try to get the lease file name. */
- option_state_allocate (&options, "dhcpinform");
+ option_state_allocate (&options, MDL);
execute_statements_in_scope ((struct packet *)0,
(struct lease *)0,
(struct option_state *)0,
- options,
+ options, &global_scope,
&root_group,
(struct group *)0);
memset (&fname, 0, sizeof fname);
if (oc &&
evaluate_option_cache (&fname, (struct packet *)0,
(struct lease *)0, options,
- (struct option_state *)0, oc)) {
- s = dmalloc (fname.len + 1, "main");
+ (struct option_state *)0,
+ &global_scope, oc, MDL)) {
+ s = dmalloc (fname.len + 1, MDL);
if (!s)
log_fatal ("no memory for lease db filename.");
memcpy (s, fname.data, fname.len);
s [fname.len] = 0;
- data_string_forget (&fname, "main");
+ data_string_forget (&fname, MDL);
path_dhcpd_db = s;
}
if (oc &&
evaluate_option_cache (&fname, (struct packet *)0,
(struct lease *)0, options,
- (struct option_state *)0, oc)) {
- s = dmalloc (fname.len + 1, "main");
+ (struct option_state *)0,
+ &global_scope, oc, MDL)) {
+ s = dmalloc (fname.len + 1, MDL);
if (!s)
log_fatal ("no memory for lease db filename.");
memcpy (s, fname.data, fname.len);
s [fname.len] = 0;
- data_string_forget (&fname, "main");
+ data_string_forget (&fname, MDL);
path_dhcpd_pid = s;
}
/* Don't need the options anymore. */
- option_state_dereference (&options, "main");
+ option_state_dereference (&options, MDL);
/* Start up the database... */
db_startup (lftest);
/* Start up a listener for the object management API protocol. */
listener = (omapi_object_t *)0;
- result = omapi_generic_new (&listener, "main");
+ result = omapi_generic_new (&listener, MDL);
if (result != ISC_R_SUCCESS)
log_fatal ("Can't allocate new generic object: %s\n",
isc_result_totext (result));
"\n [-lf lease-file] [if0 [...ifN]]");
}
-void cleanup ()
-{
-}
-
void lease_pinged (from, packet, length)
struct iaddr from;
u_int8_t *packet;
}
if (lp -> ends > cur_time) {
- log_error ("ICMP Echo reply arrived while lease %s was valid.\n",
- piaddr (from));
+ log_error ("ICMP Echo reply while lease %s valid\n",
+ piaddr (from));
}
/* At this point it looks like we pinged a lease and got a
response, which shouldn't have happened. */
- data_string_forget (&lp -> state -> parameter_request_list,
- "lease_pinged");
- free_lease_state (lp -> state, "lease_pinged");
+ data_string_forget (&lp -> state -> parameter_request_list, MDL);
+ free_lease_state (lp -> state, MDL);
lp -> state = (struct lease_state *)0;
abandon_lease (lp, "pinged before offer");
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.
+ class declarations and conditional declarations may be
+ used to group parameter assignments based on information
+ the client sends.
+
+ When a client is to be booted, its boot parameters are
+ determined by consulting that client's _\bh_\bo_\bs_\bt declaration
+ (if any), and then consulting the any _\bc_\bl_\ba_\bs_\bs declarations
+ matching the client, followed by the _\bp_\bo_\bo_\bl, _\bs_\bu_\bb_\bn_\be_\bt and
+ _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk declarations for the IP address assigned to
+ the client. Each of these declarations itself appears
+ within a lexical scope, and all declarations at less speÂ
+ cific lexical scopes are also consulted for client option
+ declarations as well. Scopes are never considered twice,
+ and if parameters are declared in more than one scope, the
+ parameter declared in the most specific scope is the one
+ that is used.
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-
range 204.254.239.10 204.254.239.30;
}
- 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;
- }
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;
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.
-
+ for each interface on your router, it's perfectly
dhcpd.conf(5) dhcpd.conf(5)
- 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Â
+ 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.
+
+ 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Â
+ machines. If we wanted to test the DHCP leasing mechaÂ
nism, we might set the lease timeout somewhat shorter than
the default:
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
+ 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
+ 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
+ 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.
- 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
+ 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:
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;
-
dhcpd.conf(5) dhcpd.conf(5)
+ }
+
+ 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; }
}
}
A\bAD\bDD\bDR\bRE\bES\bSS\bS P\bPO\bOO\bOL\bLS\bS
- The p\bpo\boo\bol\bl declaration can be used to specify a pool of
- addresses that will be treated differently than another
- pool of addresses, even on the same network segment or
+ The p\bpo\boo\bol\bl declaration can be used to specify a pool of
+ addresses that will be treated differently than another
+ pool of addresses, even on the same network segment or
subnet. For example, you may want to provide a large set
of addresses that can be assigned to DHCP clients that are
- registered to your DHCP server, while providing a smaller
- set of addresses, possibly with short lease times, that
- are available for unknown clients. If you have a fireÂ
- wall, you may be able to arrange for addresses from one
+ registered to your DHCP server, while providing a smaller
+ set of addresses, possibly with short lease times, that
+ are available for unknown clients. If you have a fireÂ
+ wall, you may be able to arrange for addresses from one
pool to be allowed access to the Internet, while addresses
- in another pool are not, thus encouraging users to regisÂ
- ter their DHCP clients. To do this, you would set up a
+ in another pool are not, thus encouraging users to regisÂ
+ ter their DHCP clients. To do this, you would set up a
pair of pool declarations:
subnet 10.0.0.0 netmask 255.255.255.0 {
}
}
- It is also possible to set up entirely different subnets
- for known and unknown clients - address pools exist at the
- level of shared networks, so address ranges within pool
- declarations can be on different subnets.
-
- As you can see in the preceding example, pools can have
dhcpd.conf(5) dhcpd.conf(5)
+ It is also possible to set up entirely different subnets
+ for known and unknown clients - address pools exist at the
+ level of shared networks, so address ranges within pool
+ declarations can be on different subnets.
+
+ As you can see in the preceding example, pools can have
permit lists that control which clients are allowed access
to the pool and which aren't. Each entry in a pool's perÂ
- mit list is introduced with the _\ba_\bl_\bl_\bo_\bw or _\bd_\be_\bn_\by keyword.
- If a pool has a permit list, then only those clients that
+ mit list is introduced with the _\ba_\bl_\bl_\bo_\bw or _\bd_\be_\bn_\by keyword.
+ If a pool has a permit list, then only those clients that
match specific entries on the permit list will be elegible
- to be assigned addresses from the pool. If a pool has a
- deny list, then only those clients that do not match any
+ to be assigned addresses from the pool. If a pool has a
+ deny list, then only those clients that do not match any
entries on the deny list will be elegible. If both perÂ
- mit and deny lists exist for a pool, then only clients
- that match the permit list and do not match the deny list
+ mit and deny lists exist for a pool, then only clients
+ that match the permit list and do not match the deny list
will be allowed access.
A\bAD\bDD\bDR\bRE\bES\bSS\bS A\bAL\bLL\bLO\bOC\bCA\bAT\bTI\bIO\bON\bN
- Address allocation is actually only done when a client is
+ Address allocation is actually only done when a client is
in the INIT state and has sent a DHCPDISCOVER message. If
the client thinks it has a valid lease and sends a DHCPREÂ
QUEST to initiate or renew that lease, the server has only
- three choices - it can ignore the DHCPREQUEST, send a
- DHCPNAK to tell the client it should stop using the
+ three choices - it can ignore the DHCPREQUEST, send a
+ DHCPNAK to tell the client it should stop using the
address, or send a DHCPACK, telling the client to go ahead
- and use the address for a while. If the server finds the
- address the client is requesting, and that address is
- available to the client, the server will send a DHCPACK.
+ and use the address for a while. If the server finds the
+ address the client is requesting, and that address is
+ available to the client, the server will send a DHCPACK.
If the address is no longer available, or the client isn't
- permitted to have it, the server will send a DHCPNAK. If
+ permitted to have it, the server will send a DHCPNAK. If
the server knows nothing about the, it will remain silent,
unless the address is incorrect for the network segment to
- which the client has been attached and the server is
- authoritative for that network segment, in which case the
- server will send a DHCPNAK even though it doesn't know
+ which the client has been attached and the server is
+ authoritative for that network segment, in which case the
+ server will send a DHCPNAK even though it doesn't know
about the address.
- When the DHCP server allocates a new address for a client
- (remember, this only happens if the client has sent a
+ When the DHCP server allocates a new address for a client
+ (remember, this only happens if the client has sent a
DHCPDISCOVER), it first looks to see if the client already
- has a valid lease on an IP address, or if there is an old
- IP address the client had before that hasn't yet been
- reassigned. In that case, the server will take that
+ has a valid lease on an IP address, or if there is an old
+ IP address the client had before that hasn't yet been
+ reassigned. In that case, the server will take that
address and check it to see if the client is still permitÂ
- ted to use it. If the client is no longer permitted to
- use it, the lease is freed if the server thought it was
- still in use - the fact that the client has sent a
- DHCPDISCOVER proves to the server that the client is no
+ ted to use it. If the client is no longer permitted to
+ use it, the lease is freed if the server thought it was
+ still in use - the fact that the client has sent a
+ DHCPDISCOVER proves to the server that the client is no
longer using the lease.
If no existing lease is found, or if the client is forbidÂ
- den to receive the existing lease, then the server will
- look in the list of address pools for the network segment
- to which the client is attached for a lease that is not in
- use and that the client is permitted to have. It looks
- through each pool declaration in sequence (all _\br_\ba_\bn_\bg_\be decÂ
- larations that appear outside of pool declarations are
- grouped into a single pool with no permit list). If the
- permit list for the pool allows the client to be allocated
+ den to receive the existing lease, then the server will
+ look in the list of address pools for the network segment
dhcpd.conf(5) dhcpd.conf(5)
- an address from that pool, the pool is examined to see if
+ to which the client is attached for a lease that is not in
+ use and that the client is permitted to have. It looks
+ through each pool declaration in sequence (all _\br_\ba_\bn_\bg_\be decÂ
+ larations that appear outside of pool declarations are
+ grouped into a single pool with no permit list). If the
+ permit list for the pool allows the client to be allocated
+ an address from that pool, the pool is examined to see if
there is an address available. If so, then the client is
- tentatively assigned that address. Otherwise, the next
- pool is tested. If no addresses are found that can be
+ tentatively assigned that address. Otherwise, the next
+ pool is tested. If no addresses are found that can be
assigned to the client, no response is sent to the client.
- If an address is found that the client is permitted to
- have, and that has never been assigned to any client
+ If an address is found that the client is permitted to
+ have, and that has never been assigned to any client
before, the address is immediately allocated to the
- client. If the address is available for allocation but
- has been previously assigned to a different client, the
- server will keep looking in hopes of finding an address
+ client. If the address is available for allocation but
+ has been previously assigned to a different client, the
+ server will keep looking in hopes of finding an address
that has never before been assigned to a client.
C\bCL\bLI\bIE\bEN\bNT\bT C\bCL\bLA\bAS\bSS\bSI\bIN\bNG\bG
Clients can be seperated into classes, and treated differÂ
- ently depending on what class they are in. This seperaÂ
- tion can be done either with a conditional statement, or
- with a match statement within the class declaration. It
- is possible to specify a limit on the total number of
- clients within a particular class or subclass that may
- hold leases at one time, and it is possible to specify
- automatic subclassing based on the contents of the client
+ ently depending on what class they are in. This seperaÂ
+ tion can be done either with a conditional statement, or
+ with a match statement within the class declaration. It
+ is possible to specify a limit on the total number of
+ clients within a particular class or subclass that may
+ hold leases at one time, and it is possible to specify
+ automatic subclassing based on the contents of the client
packet.
To add clients to classes based on conditional evaluation,
- you would write an conditional statement to match the
- clients you wanted in the class, and then put an a\bad\bdd\bd
+ you would write an conditional statement to match the
+ clients you wanted in the class, and then put an a\bad\bdd\bd
statement in the conditional's list of statements:
if substring (option dhcp-client-identifier, 0, 3) = "RAS" {
add "ras-clients";
}
- A nearly equivalent way to do this is to simply specify
+ A nearly equivalent way to do this is to simply specify
the conditional expression as a matching expression in the
class statement:
class "ras-clients" {
match if substring (option dhcp-client-identifier, 0, 3) = "RAS";
}
- Note that whether you use matching expressions or add
- statements (or both) to classify clients, you must always
+ Note that whether you use matching expressions or add
+ statements (or both) to classify clients, you must always
write a class declaration for any class that you use. If
- there will be no match statement and no in-scope stateÂ
+ there will be no match statement and no in-scope stateÂ
ments for a class, the declaration should look like this:
class "ras-clients" {
}
- Also, the a\bad\bdd\bd statement adds the client to the class as
- the client's scopes are being evaluated - after any
- address assignment decision has been made. This means
- that a client that's a member of a class due to an add
- statement will not be affected by pool permits related to
-
7
dhcpd.conf(5) dhcpd.conf(5)
- that class - when the pool permit list is computed, the
- client will not yet be a member of the pool. This is an
- inconsistency that will probably be addressed in later
- versions of the DHCP server, but it important to be aware
+ Also, the a\bad\bdd\bd statement adds the client to the class as
+ the client's scopes are being evaluated - after any
+ address assignment decision has been made. This means
+ that a client that's a member of a class due to an add
+ statement will not be affected by pool permits related to
+ that class - when the pool permit list is computed, the
+ client will not yet be a member of the pool. This is an
+ inconsistency that will probably be addressed in later
+ versions of the DHCP server, but it important to be aware
of it at lease for the time being.
S\bSU\bUB\bBC\bCL\bLA\bAS\bSS\bSE\bES\bS
- In addition to classes, it is possible to declare subÂ
- classes. A subclass is a class with the same name as a
- regular class, but with a specific submatch expression
+ In addition to classes, it is possible to declare subÂ
+ classes. A subclass is a class with the same name as a
+ regular class, but with a specific submatch expression
which is hashed for quick matching. This is essentially a
speed hack - the main difference between five classes with
- match expressions and one class with five subclasses is
- that it will be quicker to find the subclasses. SubÂ
+ match expressions and one class with five subclasses is
+ that it will be quicker to find the subclasses. SubÂ
classes work as follows:
class "allocation-class-1" {
}
The data following the class name in the subclass declaraÂ
- tion is a constant value to use in matching the match
- expression for the class. When class matching is done,
- the server will evaluate the match expression and then
- look the result up in the hash table. If it finds a
+ tion is a constant value to use in matching the match
+ expression for the class. When class matching is done,
+ the server will evaluate the match expression and then
+ look the result up in the hash table. If it finds a
match, the client is considered a member of both the class
and the subclass.
Subclasses can be declared with or without scope. In the
- above example, the sole purpose of the subclass is to
- allow some clients access to one address pool, while other
- clients are given access to the other pool, so these subÂ
- classes are declared without scopes. If part of the purÂ
- pose of the subclass were to define different parameter
- values for some clients, you might want to declare some
+ above example, the sole purpose of the subclass is to
dhcpd.conf(5) dhcpd.conf(5)
+ allow some clients access to one address pool, while other
+ clients are given access to the other pool, so these subÂ
+ classes are declared without scopes. If part of the purÂ
+ pose of the subclass were to define different parameter
+ values for some clients, you might want to declare some
subclasses with scopes.
- In the above example, if you had a single client that
- needed some configuration parameters, while most didn't,
- you might write the following subclass declaration for
+ In the above example, if you had a single client that
+ needed some configuration parameters, while most didn't,
+ you might write the following subclass declaration for
that client:
subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
filename "/tftpboot/netbsd.alphapc-diskless";
}
- In this example, we've used subclassing as a way to conÂ
- trol address allocation on a per-client basis. However,
+ In this example, we've used subclassing as a way to conÂ
+ trol address allocation on a per-client basis. However,
it's also possible to use subclassing in ways that are not
specific to clients - for example, to use the value of the
vendor-class-identifier option to determine what values to
- send in the vendor-encapsulated-options option. An examÂ
+ send in the vendor-encapsulated-options option. An examÂ
ple of this is shown under the VENDOR ENCAPSULATED OPTIONS
head later on in this document.
P\bPE\bER\bR-\b-C\bCL\bLA\bAS\bSS\bS A\bAD\bDD\bDR\bRE\bES\bSS\bS A\bAS\bSS\bSI\bIG\bGN\bNM\bME\bEN\bNT\bT L\bLI\bIM\bMI\bIT\bTS\bS
- You may specify a limit to the number of clients in a
- class that can be assigned leases. The effect of this
- will be to make it difficult for a new client in a class
- to get an address. Once a class with such a limit has
+ You may specify a limit to the number of clients in a
+ class that can be assigned leases. The effect of this
+ will be to make it difficult for a new client in a class
+ to get an address. Once a class with such a limit has
reached its limit, the only way a new client in that class
- can get a lease is for an existing client to relinquish
- its lease, either by letting it expire, or by sending a
+ can get a lease is for an existing client to relinquish
+ its lease, either by letting it expire, or by sending a
DHCPRELEASE packet. Classes with lease limits are speciÂ
fied as follows:
lease limit 4;
}
- This will produce a class in which a maximum of four memÂ
+ This will produce a class in which a maximum of four memÂ
bers may hold a lease at one time.
S\bSP\bPA\bAW\bWN\bNI\bIN\bNG\bG C\bCL\bLA\bAS\bSS\bSE\bES\bS
- It is possible to declare a _\bs_\bp_\ba_\bw_\bn_\bi_\bn_\bg _\bc_\bl_\ba_\bs_\bs. A spawning
- class is a class that automatically produces subclasses
+ It is possible to declare a _\bs_\bp_\ba_\bw_\bn_\bi_\bn_\bg _\bc_\bl_\ba_\bs_\bs. A spawning
+ class is a class that automatically produces subclasses
based on what the client sends. The reason that spawning
- classes were created was to make it possible to create
- lease-limited classes on the fly. The envisioned appliÂ
- cation is a cable-modem environment where the ISP wishes
+ classes were created was to make it possible to create
+ lease-limited classes on the fly. The envisioned appliÂ
+ cation is a cable-modem environment where the ISP wishes
to provide clients at a particular site with more than one
IP address, but does not wish to provide such clients with
- their own subnet, nor give them an unlimited number of IP
- addresses from the network segment to which they are conÂ
- nected.
-
- Many cable modem head-end systems can be configured to add
- a Relay Agent Information option to DHCP packets when
+ their own subnet, nor give them an unlimited number of IP
dhcpd.conf(5) dhcpd.conf(5)
- relaying them to the DHCP server. These systems typiÂ
- cally add a circuit ID or remote ID option that uniquely
+ addresses from the network segment to which they are conÂ
+ nected.
+
+ Many cable modem head-end systems can be configured to add
+ a Relay Agent Information option to DHCP packets when
+ relaying them to the DHCP server. These systems typiÂ
+ cally add a circuit ID or remote ID option that uniquely
identifies the customer site. To take advantage of this,
you can write a class declaration as follows:
class "customer" {
- match if exists agent.circuit-id;
spawn with option agent.circuit-id;
lease limit 4;
}
- Now whenever a request comes in from a customer site, the
+ Now whenever a request comes in from a customer site, the
circuit ID option will be checked against the class's hash
- table. If a subclass is found that matches the circuit
- ID, the client will be classified in that subclass and
- treated accordingly. If no subclass is found matching
- the circuit ID, a new one will be created and logged in
- the d\bdh\bhc\bcp\bpd\bd.\b.l\ble\bea\bas\bse\bes\bs file, and the client will be classified
- in this new class. Once the client has been classified,
- it will be treated according to the rules of the class,
- including, in this case, being subject to the per-site
+ table. If a subclass is found that matches the circuit
+ ID, the client will be classified in that subclass and
+ treated accordingly. If no subclass is found matching
+ the circuit ID, a new one will be created and logged in
+ the d\bdh\bhc\bcp\bpd\bd.\b.l\ble\bea\bas\bse\bes\bs file, and the client will be classified
+ in this new class. Once the client has been classified,
+ it will be treated according to the rules of the class,
+ including, in this case, being subject to the per-site
limit of four leases.
- The use of the subclass spawning mechanism is not
- restricted to relay agent options - this particular examÂ
- ple is given only because it is a fairly straightforward
+ The use of the subclass spawning mechanism is not
+ restricted to relay agent options - this particular examÂ
+ ple is given only because it is a fairly straightforward
one.
R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: E\bEV\bVE\bEN\bNT\bTS\bS
- There are three kinds of events that can happen regarding
- a lease, and it is possible to declare statements that
- occur when any of these events happen. These events are
+ There are three kinds of events that can happen regarding
+ a lease, and it is possible to declare statements that
+ occur when any of these events happen. These events are
the commit event, when the server has made a commitment of
- a certain lease to a client, the release event, when the
- client has released the server from its commitment, and
+ a certain lease to a client, the release event, when the
+ client has released the server from its commitment, and
the expiry event, when the commitment expires.
- Currently, only the commit event is fully supported. The
- commit event occurs just before the DHCP server sends a
- DHCPACK message to a DHCP client, or a BOOTREPLY message
+ Currently, only the commit event is fully supported. The
+ commit event occurs just before the DHCP server sends a
+ DHCPACK message to a DHCP client, or a BOOTREPLY message
to a BOOTP client.
- The release event is partially supported, but currently
- will not occur if the server is restarted after the lease
+ The release event is partially supported, but currently
+ will not occur if the server is restarted after the lease
is assigned. This will be fixed in the near future.
The expiry event is not currently supported at all. This
will also be fixed in the reasonably near future.
- To declare a set of statements to execute when an event
- happens, you must use the o\bon\bn statement, followed by the
- name of the event, followed by a series of statements to
- execute when the event happens, enclosed in braces. For
- example:
+ To declare a set of statements to execute when an event
dhcpd.conf(5) dhcpd.conf(5)
+ happens, you must use the o\bon\bn statement, followed by the
+ name of the event, followed by a series of statements to
+ execute when the event happens, enclosed in braces. For
+ example:
+
on commit {
if dns-update ("a",
concat (option host-name, ".ssd.example.net"),
[ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
}\b}
- The _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk statement is used to inform the DHCP
+ 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
+ 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
+ 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,
+ 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
[ _\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
-
11
dhcpd.conf(5) dhcpd.conf(5)
- 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 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
+ 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
+ are sufficient to determine whether any given IP address
is on the specified subnet.
- Although a netmask must be given with every subnet declaÂ
+ 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
+ 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.
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 dynamiÂ
- cally, 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
+ cally, 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 sinÂ
+ _\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 sinÂ
gle 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
[ _\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
+ 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Â
+ 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.
-
dhcpd.conf(5) dhcpd.conf(5)
- If a client is to be booted using a fixed address if it's
+ 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
+ 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
+ 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
+ _\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
+ 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
+ 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
+ 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
[ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
}\b}
- The group statement is used simply to apply one or more
+ 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
+ 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
- response of the DHCP server to various sorts of requests.
- The allow and deny keywords actually have different meanÂ
- ings depending on the context. In a pool context, these
- keywords can be used to set up access lists for address
- allocation pools. In other contexts, the keywords simply
- control general server behaviour with respect to clients
- based on scope. In a non-pool context, the _\bi_\bg_\bn_\bo_\br_\be keyÂ
- word can be used in place of the _\bd_\be_\bn_\by keyword to prevent
+ The _\ba_\bl_\bl_\bo_\bw and _\bd_\be_\bn_\by statements can be used to control the
+ response of the DHCP server to various sorts of requests.
+ The allow and deny keywords actually have different meanÂ
+ ings depending on the context. In a pool context, these
+ keywords can be used to set up access lists for address
+ allocation pools. In other contexts, the keywords simply
+ control general server behaviour with respect to clients
+ based on scope. In a non-pool context, the _\bi_\bg_\bn_\bo_\br_\be keyÂ
+ word can be used in place of the _\bd_\be_\bn_\by keyword to prevent
logging of denied requests.
A\bAL\bLL\bLO\bOW\bW D\bDE\bEN\bNY\bY A\bAN\bND\bD I\bIG\bGN\bNO\bOR\bRE\bE I\bIN\bN S\bSC\bCO\bOP\bPE\bE
- The following usages of allow and deny will work in any
+ The following usages of allow and deny will work in any
scope, although it is not recommended that they be used in
pool declarations.
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;
- i\big\bgn\bno\bor\bre\be u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs;\b;
-
dhcpd.conf(5) dhcpd.conf(5)
- 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
+ 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;
+ i\big\bgn\bno\bor\bre\be 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
d\bde\ben\bny\by b\bbo\boo\bot\btp\bp;\b;
i\big\bgn\bno\bor\bre\be b\bbo\boo\bot\btp\bp;\b;
- The b\bbo\boo\bot\btp\bp flag is used to tell dhcpd whether or not to
- respond to bootp queries. Bootp queries are a\bal\bll\blo\bow\bwed by
+ The b\bbo\boo\bot\btp\bp 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
d\bde\ben\bny\by b\bbo\boo\bot\bti\bin\bng\bg;\b;
i\big\bgn\bno\bor\bre\be 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
+ 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
+ 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. T\bTh\bhe\be _\bd_\bu_\bp_\bl_\bi_\bc_\ba_\bt_\be_\bs k\bke\bey\byÂ\bÂ
w\bwo\bor\brd\bd
a\bal\bll\blo\bow\bw d\bdu\bup\bpl\bli\bic\bca\bat\bte\bes\bs;\b;
d\bde\ben\bny\by d\bdu\bup\bpl\bli\bic\bca\bat\bte\bes\bs;\b;
- Host declarations can match client messages based on the
+ Host declarations can match client messages based on the
DHCP Client Identifer option or based on the client's netÂ
- work hardware type and MAC address. If the MAC address
- is used, the host declaration will match any client with
- that MAC address - even clients with different client
+ work hardware type and MAC address. If the MAC address
+ is used, the host declaration will match any client with
+ that MAC address - even clients with different client
identifiers. This doesn't normally happen, but is possiÂ
- ble when one computer has more than one operating system
- installed on it - for example, Microsoft Windows and
+ ble when one computer has more than one operating system
+ installed on it - for example, Microsoft Windows and
NetBSD or Linux.
- The d\bdu\bup\bpl\bli\bic\bca\bat\bte\bes\bs flag tells the DHCP server that if a
- request is received from a client that matches the MAC
- address of a host declaration, any other leases matching
- that MAC address should be discarded by the server, even
- if the UID is not the same. This is a violation of the
- DHCP protocol, but can prevent clients whose client idenÂ
- tifiers change regularly from holding many leases at the
- same time. By default, duplicates are a\bal\bll\blo\bow\bwed. T\bTh\bhe\be
- _\bd_\be_\bc_\bl_\bi_\bn_\be_\bs k\bke\bey\byw\bwo\bor\brd\bd
-
- a\bal\bll\blo\bow\bw d\bde\bec\bcl\bli\bin\bne\bes\bs;\b;
- d\bde\ben\bny\by d\bde\bec\bcl\bli\bin\bne\bes\bs;\b;
+ The d\bdu\bup\bpl\bli\bic\bca\bat\bte\bes\bs flag tells the DHCP server that if a
+ request is received from a client that matches the MAC
+ address of a host declaration, any other leases matching
+ that MAC address should be discarded by the server, even
+ if the UID is not the same. This is a violation of the
+ DHCP protocol, but can prevent clients whose client idenÂ
+ tifiers change regularly from holding many leases at the
+ same time. By default, duplicates are a\bal\bll\blo\bow\bwed. T\bTh\bhe\be
dhcpd.conf(5) dhcpd.conf(5)
+ _\bd_\be_\bc_\bl_\bi_\bn_\be_\bs k\bke\bey\byw\bwo\bor\brd\bd
+
+ a\bal\bll\blo\bow\bw d\bde\bec\bcl\bli\bin\bne\bes\bs;\b;
+ d\bde\ben\bny\by d\bde\bec\bcl\bli\bin\bne\bes\bs;\b;
i\big\bgn\bno\bor\bre\be d\bde\bec\bcl\bli\bin\bne\bes\bs;\b;
- The DHCPDECLINE message is used by DHCP clients to indiÂ
- cate that the lease the server has offered is not valid.
- When the server receives a DHCPDECLINE for a particular
- address, it normally abandons that address, assuming that
- some unauthorized system is using it. Unfortunately, a
+ The DHCPDECLINE message is used by DHCP clients to indiÂ
+ cate that the lease the server has offered is not valid.
+ When the server receives a DHCPDECLINE for a particular
+ address, it normally abandons that address, assuming that
+ some unauthorized system is using it. Unfortunately, a
malicious or buggy client can, using DHCPDECLINE messages,
- completely exhaust the DHCP server's allocation pool.
+ completely exhaust the DHCP server's allocation pool.
The server will reclaim these leases, but while the client
- is running through the pool, it may cause serious thrashÂ
- ing in the DNS, and it will also cause the DHCP server to
+ is running through the pool, it may cause serious thrashÂ
+ ing in the DNS, and it will also cause the DHCP server to
forget old DHCP client address allocations.
- The d\bde\bec\bcl\bli\bin\bne\bes\bs flag tells the DHCP server whether or not to
- honor DHCPDECLINE messages. If it is set to d\bde\ben\bny\by or
- i\big\bgn\bno\bor\bre\be in a particular scope, the DHCP server will not
+ The d\bde\bec\bcl\bli\bin\bne\bes\bs flag tells the DHCP server whether or not to
+ honor DHCPDECLINE messages. If it is set to d\bde\ben\bny\by or
+ i\big\bgn\bno\bor\bre\be in a particular scope, the DHCP server will not
respond to DHCPDECLINE messages.
A\bAL\bLL\bLO\bOW\bW A\bAN\bND\bD D\bDE\bEN\bNY\bY W\bWI\bIT\bTH\bHI\bIN\bN P\bPO\bOO\bOL\bL D\bDE\bEC\bCL\bLA\bAR\bRA\bAT\bTI\bIO\bON\bNS\bS
The uses of the allow and deny keyword shown in the previÂ
- ous section work pretty much the same way whether the
- client is sending a DHCPDISCOVER or a DHCPREQUEST message
- - an address will be allocated to the client (either the
- old address it's requesting, or a new address) and then
+ ous section work pretty much the same way whether the
+ client is sending a DHCPDISCOVER or a DHCPREQUEST message
+ - an address will be allocated to the client (either the
+ old address it's requesting, or a new address) and then
that address will be tested to see if it's okay to let the
client have it. If the client requested it, and it's not
okay, the server will send a DHCPNAK message. Otherwise,
- the server will simply not respond to the client. If it
+ the server will simply not respond to the client. If it
is okay to give the address to the client, the server will
send a DHCPACK message.
The primary motivation behind pool declarations is to have
- address allocation pools whose allocation policies are
- different. A client may be denied access to one pool,
- but allowed access to another pool on the same network
- segment. In order for this to work, access control has
- to be done during address allocation, not after address
+ address allocation pools whose allocation policies are
+ different. A client may be denied access to one pool,
+ but allowed access to another pool on the same network
+ segment. In order for this to work, access control has
+ to be done during address allocation, not after address
allocation is done.
- When a DHCPREQUEST message is processed, address allocaÂ
- tion simply consists of looking up the address the client
- is requesting and seeing if it's still available for the
- client. If it is, then the DHCP server checks both the
- address pool permit lists and the relevant in-scope allow
- and deny statements to see if it's okay to give the lease
+ When a DHCPREQUEST message is processed, address allocaÂ
+ tion simply consists of looking up the address the client
+ is requesting and seeing if it's still available for the
+ client. If it is, then the DHCP server checks both the
+ address pool permit lists and the relevant in-scope allow
+ and deny statements to see if it's okay to give the lease
to the client. In the case of a DHCPDISCOVER message, the
- allocation process is done as described previously in the
+ allocation process is done as described previously in the
ADDRESS ALLOCATION section.
- When declaring permit lists for address allocation pools,
- the following syntaxes are recognized following the allow
- or deny keyword:
-
dhcpd.conf(5) dhcpd.conf(5)
+ When declaring permit lists for address allocation pools,
+ the following syntaxes are recognized following the allow
+ or deny keyword:
+
k\bkn\bno\bow\bwn\bn c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
- allocation from this pool to any client that has a host
+ If specified, this statement either allows or prevents
+ allocation from this pool to any client that has a host
declaration (i.e., is known).
u\bun\bnk\bkn\bno\bow\bwn\bn c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
- allocation from this pool to any client that has no host
+ If specified, this statement either allows or prevents
+ allocation from this pool to any client that has no host
declaration (i.e., is not known).
m\bme\bem\bmb\bbe\ber\brs\bs o\bof\bf "\b"class"\b";\b;
- If specified, this statement either allows or prevents
- allocation from this pool to any client that is a member
+ If specified, this statement either allows or prevents
+ allocation from this pool to any client that is a member
of the named class.
d\bdy\byn\bna\bam\bmi\bic\bc b\bbo\boo\bot\btp\bp c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
+ If specified, this statement either allows or prevents
allocation from this pool to any bootp client.
a\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bte\bed\bd c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
- allocation from this pool to any client that has been
+ If specified, this statement either allows or prevents
+ allocation from this pool to any client that has been
authenticated using the DHCP authentication protocol.
This is not yet supported.
u\bun\bna\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bte\bed\bd c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
- allocation from this pool to any client that has not been
+ If specified, this statement either allows or prevents
+ allocation from this pool to any client that has not been
authenticated using the DHCP authentication protocol.
This is not yet supported.
a\bal\bll\bl c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- If specified, this statement either allows or prevents
- allocation from this pool to all clients. This can be
- used when you want to write a pool declaration for some
+ If specified, this statement either allows or prevents
+ allocation from this pool to all clients. This can be
+ used when you want to write a pool declaration for some
reason, but hold it in reserve, or when you want to renumÂ
- ber your network quickly, and thus want the server to
- force all clients that have been allocated addresses from
- this pool to obtain new addresses immediately when they
+ ber your network quickly, and thus want the server to
+ force all clients that have been allocated addresses from
+ this pool to obtain new addresses immediately when they
next renew.
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 _\bl_\be_\ba_\bs_\be_\b-_\bf_\bi_\bl_\be_\b-_\bn_\ba_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
- l\ble\bea\bas\bse\be-\b-f\bfi\bil\ble\be-\b-n\bna\bam\bme\be _\bn_\ba_\bm_\be;\b;
-
- _\bN_\ba_\bm_\be should be the name of the DHCP server's lease file.
-
16
dhcpd.conf(5) dhcpd.conf(5)
+ l\ble\bea\bas\bse\be-\b-f\bfi\bil\ble\be-\b-n\bna\bam\bme\be _\bn_\ba_\bm_\be;\b;
+
+ _\bN_\ba_\bm_\be should be the name of the DHCP server's lease file.
By default, this is /var/db/dhcpd.leases. This statement
m\bmu\bus\bst\bt appear in the outer scope of the configuration file -
if it appears in some other scope, it will have no effect.
p\bpi\bid\bd-\b-f\bfi\bil\ble\be-\b-n\bna\bam\bme\be _\bn_\ba_\bm_\be;\b;
- _\bN_\ba_\bm_\be should be the name of the DHCP server's process ID
- file. This is the file in which the DHCP server's proÂ
- cess ID is stored when the server starts. By default,
- this is /var/run/dhcpd.pid. Like the lease-file-name
- statement, this statement must appear in the outer scope
+ _\bN_\ba_\bm_\be should be the name of the DHCP server's process ID
+ file. This is the file in which the DHCP server's proÂ
+ cess ID is stored when the server starts. By default,
+ this is /var/run/dhcpd.pid. Like the lease-file-name
+ statement, this statement must appear in the outer scope
of the configuration file.
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
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. The only exception to this is that
- Dynamic BOOTP lease lengths, which are not specified by
+ _\bT_\bi_\bm_\be should be the maximum length in seconds that will be
+ assigned to a lease. The only exception to this is that
+ Dynamic BOOTP lease lengths, which are not specified by
the client, are not limited by this maximum.
T\bTh\bhe\be _\bm_\bi_\bn_\b-_\bl_\be_\ba_\bs_\be_\b-_\bt_\bi_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
m\bmi\bin\bn-\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 minimum length in seconds that will be
+ _\bT_\bi_\bm_\be should be the minimum length in seconds that will be
assigned to a lease.
T\bTh\bhe\be _\bm_\bi_\bn_\b-_\bs_\be_\bc_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
m\bmi\bin\bn-\b-s\bse\bec\bcs\bs _\bs_\be_\bc_\bo_\bn_\bd_\bs;\b;
- _\bS_\be_\bc_\bo_\bn_\bd_\bs should be the minimum number of seconds since a
+ _\bS_\be_\bc_\bo_\bn_\bd_\bs should be the minimum number of seconds since a
client began trying to acquire a new lease before the DHCP
server will respond to its request. The number of seconds
is based on what the client reports, and the maximum value
- that the client can report is 255 seconds. Generally,
- setting this to one will result in the DHCP server not
- responding to the client's first request, but always
+ that the client can report is 255 seconds. Generally,
+ setting this to one will result in the DHCP server not
+ responding to the client's first request, but always
responding to its second request.
- This can be used to set up a secondary DHCP server which
- never offers an address to a client until the primary
-
17
dhcpd.conf(5) dhcpd.conf(5)
- server has been given a chance to do so. If the primary
- server is down, the client will bind to the secondary
- server, but otherwise clients should always bind to the
- primary. Note that this does not, by itself, permit a
- primary server and a secondary server to share a pool of
+ This can be used to set up a secondary DHCP server which
+ never offers an address to a client until the primary
+ server has been given a chance to do so. If the primary
+ server is down, the client will bind to the secondary
+ server, but otherwise clients should always bind to the
+ primary. Note that this does not, by itself, permit a
+ primary server and a secondary server to share a pool of
dynamically-allocatable addresses.
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 and t\bto\bok\bke\ben\bn-\b-r\bri\bin\bng\bg types are recognized, although
- support for a f\bfd\bdd\bdi\bi hardware type (and others) 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 statement may also be used for
+ 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 and t\bto\bok\bke\ben\bn-\b-r\bri\bin\bng\bg types are recognized, although
+ support for a f\bfd\bdd\bdi\bi hardware type (and others) 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 statement may also be used for
DHCP clients.
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 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
+ 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
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
+ 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 DHCP server's IP address 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;
-
18
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
+ 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;
+
+ 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Â
+ 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.
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
+ 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
+ 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
+ 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.
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
+ 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
+ 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
+ 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
+ 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.
+ so a BOOTP client that boots frequently enough will never
dhcpd.conf(5) dhcpd.conf(5)
+ lose its lease. Needless to say, this parameter should be
+ adjusted with extreme caution.
+
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
+ 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
+ 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Â
+ 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 {
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
+ 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.
T\bTh\bhe\be _\ba_\bu_\bt_\bh_\bo_\br_\bi_\bt_\ba_\bt_\bi_\bv_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
n\bno\bot\bt a\bau\but\bth\bho\bor\bri\bit\bta\bat\bti\biv\bve\be;\b;
- The DHCP server will normally assume that the configuraÂ
+ The DHCP server will normally assume that the configuraÂ
tion information about a given network segment is known to
be correct and is authoritative. So if a client requests
- an IP address on a given network segment that the server
- knows is not valid for that segment, the server will
- respond with a DHCPNAK message, causing the client to forÂ
- get its IP address and try to get a new one.
+ an IP address on a given network segment that the server
dhcpd.conf(5) dhcpd.conf(5)
- If a DHCP server is being configured by somebody who is
- not the network administrator and who therefore does not
+ knows is not valid for that segment, the server will
+ respond with a DHCPNAK message, causing the client to forÂ
+ get its IP address and try to get a new one.
+
+ If a DHCP server is being configured by somebody who is
+ not the network administrator and who therefore does not
wish to assert this level of authority, then the statement
- "not authoritative" should be written in the appropriate
+ "not authoritative" should be written in the appropriate
scope in the configuration file.
- Usually, writing n\bno\bot\bt a\bau\but\bth\bho\bor\bri\bit\bta\bat\bti\biv\bve\be;\b; at the top level of
+ Usually, writing n\bno\bot\bt a\bau\but\bth\bho\bor\bri\bit\bta\bat\bti\biv\bve\be;\b; at the top level of
the file should be sufficient. However, if a DHCP server
- is to be set up so that it is aware of some networks for
- which it is authoritative and some networks for which it
+ is to be set up so that it is aware of some networks for
+ which it is authoritative and some networks for which it
is not, it may be more appropriate to declare authority on
a per-network-segment basis.
Note that the most specific scope for which the concept of
- authority makes any sense is the physical network segment
- - either a shared-network statement or a subnet statement
- that is not contained within a shared-network statement.
+ authority makes any sense is the physical network segment
+ - either a shared-network statement or a subnet statement
+ that is not contained within a shared-network statement.
It is not meaningful to specify that the server is authorÂ
- itative for some subnets within a shared network, but not
- authoritative for others, nor is it meaningful to specify
- that the server is authoritative for some host declaraÂ
+ itative for some subnets within a shared network, but not
+ authoritative for others, nor is it meaningful to specify
+ that the server is authoritative for some host declaraÂ
tions and not others.
T\bTh\bhe\be _\ba_\bl_\bw_\ba_\by_\bs_\b-_\br_\be_\bp_\bl_\by_\b-_\br_\bf_\bc_\b1_\b0_\b4_\b8 s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
a\bal\blw\bwa\bay\bys\bs-\b-r\bre\bep\bpl\bly\by-\b-r\brf\bfc\bc1\b10\b04\b48\b8 _\bf_\bl_\ba_\bg;\b;
- Some BOOTP clients expect RFC1048-style responses, but do
- not follow RFC1048 when sending their requests. You can
- tell that a client is having this problem if it is not
- getting the options you have configured for it and if you
- see in the server log the message "(non-rfc1048)" printed
+ Some BOOTP clients expect RFC1048-style responses, but do
+ not follow RFC1048 when sending their requests. You can
+ tell that a client is having this problem if it is not
+ getting the options you have configured for it and if you
+ see in the server log the message "(non-rfc1048)" printed
with each BOOTREQUEST that is logged.
- If you want to send rfc1048 options to such a client, you
- can set the a\bal\blw\bwa\bay\bys\bs-\b-r\bre\bep\bpl\bly\by-\b-r\brf\bfc\bc1\b10\b04\b48\b8 option in that client's
+ If you want to send rfc1048 options to such a client, you
+ can set the a\bal\blw\bwa\bay\bys\bs-\b-r\bre\bep\bpl\bly\by-\b-r\brf\bfc\bc1\b10\b04\b48\b8 option in that client's
host declaration, and the DHCP server will respond with an
- RFC-1048-style vendor options field. This flag can be
- set in any scope, and will affect all clients covered by
+ RFC-1048-style vendor options field. This flag can be
+ set in any scope, and will affect all clients covered by
that scope.
T\bTh\bhe\be _\ba_\bl_\bw_\ba_\by_\bs_\b-_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
a\bal\blw\bwa\bay\bys\bs-\b-b\bbr\bro\boa\bad\bdc\bca\bas\bst\bt _\bf_\bl_\ba_\bg;\b;
- The DHCP and BOOTP protocols both require DHCP and BOOTP
+ The DHCP and BOOTP protocols both require DHCP and BOOTP
clients to set the broadcast bit in the flags field of the
- BOOTP message header. Unfortunately, some DHCP and BOOTP
- clients do not do this, and therefore may not receive
- responses from the DHCP server. The DHCP server can be
- made to always broadcast its responses to clients by setÂ
- ting this flag to 'on' for the relevant scope. To avoid
- creating excess broadcast traffic on your network, we recÂ
- ommend that you restrict the use of this option to as few
+ BOOTP message header. Unfortunately, some DHCP and BOOTP
+ clients do not do this, and therefore may not receive
+ responses from the DHCP server. The DHCP server can be
dhcpd.conf(5) dhcpd.conf(5)
- clients as possible. For example, the Microsoft DHCP
+ made to always broadcast its responses to clients by setÂ
+ ting this flag to 'on' for the relevant scope. To avoid
+ creating excess broadcast traffic on your network, we recÂ
+ ommend that you restrict the use of this option to as few
+ clients as possible. For example, the Microsoft DHCP
client is known not to have this problem, as are the OpenÂ
Transport and ISC DHCP clients.
o\bon\bne\be-\b-l\ble\bea\bas\bse\be-\b-p\bpe\ber\br-\b-c\bcl\bli\bie\ben\bnt\bt _\bf_\bl_\ba_\bg;\b;
If this flag is enabled, whenever a client sends a DHCPREÂ
- QUEST for a particular lease, the server will automatiÂ
- cally free any other leases the client holds. This preÂ
- sumes that when the client sends a DHCPREQUEST, it has
- forgotten any lease not mentioned in the DHCPREQUEST -
- i.e., the client has only a single network interface _\ba_\bn_\bd
- it does not remember leases it's holding on networks to
- which it is not currently attached. Neither of these
+ QUEST for a particular lease, the server will automatiÂ
+ cally free any other leases the client holds. This preÂ
+ sumes that when the client sends a DHCPREQUEST, it has
+ forgotten any lease not mentioned in the DHCPREQUEST -
+ i.e., the client has only a single network interface _\ba_\bn_\bd
+ it does not remember leases it's holding on networks to
+ which it is not currently attached. Neither of these
assumptions are guaranteed or provable, so we urge caution
in the use of this statement.
u\bus\bse\be-\b-l\ble\bea\bas\bse\be-\b-a\bad\bdd\bdr\br-\b-f\bfo\bor\br-\b-d\bde\bef\bfa\bau\bul\blt\bt-\b-r\bro\bou\but\bte\be _\bf_\bl_\ba_\bg;\b;
- If the _\bu_\bs_\be_\b-_\bl_\be_\ba_\bs_\be_\b-_\ba_\bd_\bd_\br_\b-_\bf_\bo_\br_\b-_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b-_\br_\bo_\bu_\bt_\be parameter is true
+ If the _\bu_\bs_\be_\b-_\bl_\be_\ba_\bs_\be_\b-_\ba_\bd_\bd_\br_\b-_\bf_\bo_\br_\b-_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b-_\br_\bo_\bu_\bt_\be parameter is true
in a given scope, then instead of sending the value speciÂ
- fied in the routers option (or sending no value at all),
- the IP address of the lease being assigned is sent to the
+ fied in the routers option (or sending no value at all),
+ the IP address of the lease being assigned is sent to the
client. This supposedly causes Win95 machines to ARP for
- all IP addresses, which can be helpful if your router is
+ all IP addresses, which can be helpful if your router is
configured for proxy ARP.
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 statement can be used to define the
- value that is sent in the DHCP Server Identifier option
- for a given scope. The value specified m\bmu\bus\bst\bt be an IP
- address for the DHCP server, and must be reachable by all
+ The server-identifier statement can be used to define the
+ value that is sent in the DHCP Server Identifier option
+ for a given scope. The value specified m\bmu\bus\bst\bt be an IP
+ address for the DHCP server, and must be reachable by all
clients served by a particular scope.
- The use of the server-identifier statement is not recomÂ
- mended - the only reason to use it is to force a value
+ The use of the server-identifier statement is not recomÂ
+ mended - the only reason to use it is to force a value
other than the default value to be sent on occasions where
- the default value would be incorrect. The default value
- is the first IP address associated with the physical netÂ
+ the default value would be incorrect. The default value
+ is the first IP address associated with the physical netÂ
work interface on which the request arrived.
The usual case where the _\bs_\be_\br_\bv_\be_\br_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br statement needs
- to be sent is when a physical interface has more than one
- IP address, and the one being sent by default isn't approÂ
- priate for some or all clients served by that interface.
- Another common case is when an alias is defined for the
- purpose of having a consistent IP address for the DHCP
+ to be sent is when a physical interface has more than one
dhcpd.conf(5) dhcpd.conf(5)
- server, and it is desired that the clients use this IP
+ IP address, and the one being sent by default isn't approÂ
+ priate for some or all clients served by that interface.
+ Another common case is when an alias is defined for the
+ purpose of having a consistent IP address for the DHCP
+ server, and it is desired that the clients use this IP
address when contacting the server.
Supplying a value for the dhcp-server-identifier option is
equivalent to using the server-identifier statement.
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 option statements are documented in the d\bdh\bhc\bcp\bp-\b-
+ DHCP option statements are documented in the d\bdh\bhc\bcp\bp-\b-
o\bop\bpt\bti\bio\bon\bns\bs(\b(5\b5)\b) manual page.
-V\bVE\bEN\bND\bDO\bOR\bR E\bEN\bNC\bCA\bAP\bPS\bSU\bUL\bLA\bAT\bTE\bED\bD O\bOP\bPT\bTI\bIO\bON\bNS\bS
- The DHCP protocol defines the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs
- option, which allows vendors to define their own options
- that will be sent encapsulated in a standard DHCP option.
- The format of the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option is
- either a hunk of opaque data, or an actual option buffer
- just like a standard DHCP option buffer.
-
- You can send this option to clients in one of two ways -
- either define the data directly, using a text string or a
- colon-seperated list of hexadecimal values, or define an
- option space, define some options in that option space,
- provide values for them, and specify that that option
- space should be used to generate the v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-
- o\bop\bpt\bti\bio\bon\bns\bs option in some scope.
-
- To send a simple clump of data, simply provide a value for
- the option in the right scope - for example:
-
- option vendor-encapsulated-options
- 2:4:AC:11:41:1:
- 3:12:73:75:6e:64:68:63:70:2d:73:65:72:76:65:72:31:37:2d:31:
- 4:12:2f:65:78:70:6f:72:74:2f:72:6f:6f:74:2f:69:38:36:70:63;
-
- To define a new option space in which vendor options can
- be stored, use the option space statement:
-
- o\bop\bpt\bti\bio\bon\bn s\bsp\bpa\bac\bce\be _\bn_\ba_\bm_\be ;\b;
-
- The name can then be used in option definitions, as
- described in the d\bdh\bhc\bcp\bp-\b-o\bop\bpt\bti\bio\bon\bns\bs(\b(5\b5)\b) manual page. For examÂ
- ple:
-
- option space SUNW;
- option SUNW.server-address code 2 = ip-address;
- option SUNW.server-name code 3 = text;
- option SUNW.root-path code 4 = text;
-
- Once you have defined an option space and some options,
- you can set up scopes that define values for those
- options, and you can say when to use them. For example,
- suppose you want to handle two different classes of
- clients, as in the example in the V\bVE\bEN\bND\bDO\bOR\bR E\bEN\bNC\bCA\bAP\bPS\bSU\bUL\bLA\bAT\bTE\bED\bD
- O\bOP\bPT\bTI\bIO\bON\bNS\bS section. Using the option space definition shown
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+ dhcpd.conf(5), dhcpd.leases(5), RFC2132, RFC2131.
+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 Consortium. Information
+ 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.
- 23
-dhcpd.conf(5) dhcpd.conf(5)
- in the previous example, something very similar to the
- vendor-encapsulated-options definition shown earlier can
- be done as follows:
- class "vendor-classes" {
- match option vendor-class-identifier;
- }
- option SUNW.server-address 172.17.65.1;
- option SUNW.server-name "sundhcp-server17-1";
- subclass "vendor-classes" "SUNW.Ultra-5_10" {
- vendor-option-space SUNW;
- option SUNW.root-path "/export/root/sparc";
- }
- subclass "vendor-classes" "SUNW.i86pc" {
- vendor-option-space SUNW;
- option SUNW.root-path "/export/root/i86pc";
- }
- As you can see in the preceding example, regular scoping
- rules apply, so you can define values that are global in
- the global scope, and only define values that are specific
- to a particular class in the local scope. The v\bve\ben\bnd\bdo\bor\br-\b-
- o\bop\bpt\bti\bio\bon\bn-\b-s\bsp\bpa\bac\bce\be declaration indicates that in that scope, the
- v\bve\ben\bnd\bdo\bor\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bte\bed\bd-\b-o\bop\bpt\bti\bio\bon\bns\bs option should be constructed
- using the values of all the options in the SUNW option
- space.
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
- dhcpd.conf(5), dhcpd.leases(5), RFC2132, RFC2131.
-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 Consortium. Information
- 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.
- 24
+ 23
#ifndef lint
static char copyright[] =
-"$Id: failover.c,v 1.6 2000/01/05 18:21:01 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: failover.c,v 1.7 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
break;
if (p)
return omapi_object_reference ((omapi_object_t **)peer,
- (omapi_object_t *)p,
- "find_failover_peer");
+ (omapi_object_t *)p, MDL);
return ISC_R_NOTFOUND;
}
return ISC_R_INVALIDARG;
state = (dhcp_failover_state_t *)o;
- obj = (dhcp_failover_link_t *)malloc (sizeof *obj);
+ obj = (dhcp_failover_link_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
obj -> type = dhcp_type_failover_link;
- option_cache_reference (&obj -> peer_address, state -> address,
- "dhcp_failover_link_initiate");
+ option_cache_reference (&obj -> peer_address, state -> address, MDL);
obj -> peer_port = state -> port;
memset (&ds, 0, sizeof ds);
if (!evaluate_option_cache (&ds, (struct packet *)0, (struct lease *)0,
(struct option_state *)0,
(struct option_state *)0,
- obj -> peer_address)) {
- option_cache_dereference (&obj -> peer_address,
- "dhcp_failover_link_initiate");
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_link_initiate");
+ &global_scope, obj -> peer_address, MDL)) {
+ option_cache_dereference (&obj -> peer_address, MDL);
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_UNEXPECTED;
}
if (status == ISC_R_SUCCESS)
break;
}
- data_string_forget (&ds, "dhcp_failover_link_initiate");
+ data_string_forget (&ds, MDL);
/* If we didn't connect to any of the addresses, give up. */
if (status != ISC_R_SUCCESS) {
lose:
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_link_initiate");
- option_cache_dereference (&obj -> peer_address,
- "dhcp_failover_link_initiate");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
+ option_cache_dereference (&obj -> peer_address, MDL);
return status;
}
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "dhcp_failover_link_initiate");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS)
goto lose;
- status = omapi_object_reference (&obj -> inner, h,
- "dhcp_failover_link_initiate");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS)
goto lose;
if (status != ISC_R_SUCCESS)
goto lose;
- omapi_object_dereference ((omapi_object_t **)&obj,
- "omapi_protocol_accept");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return ISC_R_SUCCESS;
}
break;
case dhcp_flink_message_length_wait:
link -> state = dhcp_flink_message_wait;
- link -> imsg = dmalloc (sizeof (failover_message_t),
- "dhcp_failover_link_signal");
+ link -> imsg = dmalloc (sizeof (failover_message_t), MDL);
if (!link -> imsg) {
dhcp_flink_fail:
if (link -> imsg) {
- dfree (link -> imsg,
- "dhcp_failover_link_signal");
+ dfree (link -> imsg, MDL);
link -> imsg = (failover_message_t *)0;
}
link -> state = dhcp_flink_disconnected;
op_count = option_len - op_count;
ddns -> length = op_count;
- ddns -> data = malloc (op_count);
+ ddns -> data = dmalloc (op_count, MDL);
if (!ddns -> data) {
log_error ("FAILOVER: no memory getting%s(%d)",
" DNS data ", op_count);
ft_options [option_code].offset));
fo -> count = op_count;
- fo -> data = malloc (option_len);
+ fo -> data = dmalloc (option_len, MDL);
if (!fo -> data) {
log_error ("FAILOVER: no memory getting %s (%d)",
"option data", op_count);
if (!omapi_ds_strcmp (name, "link-port")) {
return omapi_make_int_value (value, name,
- (int)link -> peer_port,
- "dhcp_failover_link_get_value");
+ (int)link -> peer_port, MDL);
} else if (!omapi_ds_strcmp (name, "link-state")) {
if (link -> state < 0 ||
link -> state >= dhcp_flink_state_max)
- return omapi_make_string_value
- (value, name, "invalid link state",
- "dhcp_failover_link_get_value");
+ return omapi_make_string_value (value, name,
+ "invalid link state",
+ MDL);
return omapi_make_string_value
(value, name,
- dhcp_flink_state_names [link -> state],
- "dhcp_failover_link_get_value");
+ dhcp_flink_state_names [link -> state], MDL);
}
if (h -> inner && h -> inner -> type -> get_value)
return ISC_R_NOTFOUND;
}
-isc_result_t dhcp_failover_link_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcp_failover_link_destroy (omapi_object_t *h,
+ const char *file, int line)
{
dhcp_failover_link_t *link;
if (h -> type != dhcp_type_failover_link)
return ISC_R_INVALIDARG;
link = (dhcp_failover_link_t *)h;
if (link -> imsg) {
- dfree (link -> imsg, "dhcp_failover_link_destroy");
+ dfree (link -> imsg, file, line);
link -> imsg = (failover_message_t *)0;
}
return ISC_R_SUCCESS;
if (status != ISC_R_SUCCESS)
return status;
if (!value -> value) {
- omapi_value_dereference (&value, "dhcp_failover_listen");
+ omapi_value_dereference (&value, MDL);
return ISC_R_INVALIDARG;
}
status = omapi_get_int_value (&port, value -> value);
- omapi_value_dereference (&value, "dhcp_failover_listen");
+ omapi_value_dereference (&value, MDL);
if (status != ISC_R_SUCCESS)
return status;
- obj = (dhcp_failover_listener_t *)malloc (sizeof *obj);
+ obj = (dhcp_failover_listener_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> local_port = port;
status = omapi_listen ((omapi_object_t *)obj, port, 1);
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (status != ISC_R_SUCCESS)
return status;
- status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "dhcp_failover_listen");
+ status = omapi_object_reference (&h -> outer,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, h,
- "dhcp_failover_listen");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
(struct lease *)0,
(struct option_state *)0,
(struct option_state *)0,
- state -> address)) {
+ &global_scope,
+ state -> address, MDL)) {
for (i = 0; i < ds.len; i += 4) {
if (!memcmp (&ds.data [i],
&c -> remote_addr, 4))
return ISC_R_INVALIDARG;
}
- obj = (dhcp_failover_link_t *)malloc (sizeof *obj);
+ obj = (dhcp_failover_link_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> refcnt = 1;
obj -> type = dhcp_type_failover_link;
- option_cache_reference (&obj -> peer_address, state -> address,
- "dhcp_failover_listen_signal");
+ option_cache_reference (&obj -> peer_address, state -> address, MDL);
obj -> peer_port = ntohs (c -> remote_addr.sin_port);
- status = omapi_object_reference (&obj -> outer, (omapi_object_t *)c,
- "dhcp_failover_listener_signal");
+ status = omapi_object_reference (&obj -> outer,
+ (omapi_object_t *)c, MDL);
if (status != ISC_R_SUCCESS) {
lose:
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listener_signal");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
omapi_disconnect ((omapi_object_t *)c, 1);
return status;
}
- status = omapi_object_reference (&c -> inner, (omapi_object_t *)obj,
- "dhcp_failover_listener_signal");
+ status = omapi_object_reference (&c -> inner,
+ (omapi_object_t *)obj, MDL);
if (status != ISC_R_SUCCESS)
goto lose;
if (status != ISC_R_SUCCESS)
goto lose;
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listener_signal");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
}
isc_result_t dhcp_failover_listener_destroy (omapi_object_t *h,
- const char *name)
+ const char *file, int line)
{
if (h -> type != dhcp_type_failover_listener)
return ISC_R_INVALIDARG;
if (status != ISC_R_SUCCESS)
return status;
if (!value -> value) {
- omapi_value_dereference (&value, "dhcp_failover_register");
+ omapi_value_dereference (&value, MDL);
return ISC_R_INVALIDARG;
}
status = omapi_get_int_value (&port, value -> value);
- omapi_value_dereference (&value, "dhcp_failover_listen");
+ omapi_value_dereference (&value, MDL);
if (status != ISC_R_SUCCESS)
return status;
- obj = (dhcp_failover_state_t *)malloc (sizeof *obj);
+ obj = (dhcp_failover_state_t *)dmalloc (sizeof *obj, MDL);
if (!obj)
return ISC_R_NOMEMORY;
memset (obj, 0, sizeof *obj);
obj -> listen_port = port;
status = omapi_listen ((omapi_object_t *)obj, port, 1);
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
if (status != ISC_R_SUCCESS)
return status;
status = omapi_object_reference (&h -> outer, (omapi_object_t *)obj,
- "dhcp_failover_listen");
+ MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
- status = omapi_object_reference (&obj -> inner, h,
- "dhcp_failover_listen");
+ status = omapi_object_reference (&obj -> inner, h, MDL);
if (status != ISC_R_SUCCESS) {
- omapi_object_dereference ((omapi_object_t **)&obj,
- "dhcp_failover_listen");
+ omapi_object_dereference ((omapi_object_t **)&obj, MDL);
return status;
}
}
isc_result_t dhcp_failover_state_destroy (omapi_object_t *h,
- const char *name)
+ const char *file, int line)
{
if (h -> type != dhcp_type_failover_state)
return ISC_R_INVALIDARG;
if (status == ISC_R_SUCCESS) {
status = omapi_handle_td_lookup (sp, tv -> value);
- omapi_value_dereference (&tv, "dhcp_failover_state_lookup");
+ omapi_value_dereference (&tv, MDL);
if (status != ISC_R_SUCCESS)
return status;
/* Don't return the object if the type is wrong. */
if ((*sp) -> type != dhcp_type_failover_state) {
- omapi_object_dereference
- (sp, "dhcp_failover_state_lookup");
+ omapi_object_dereference (sp, MDL);
return ISC_R_INVALIDARG;
}
}
tv -> value -> u.buffer.value, l))
break;
}
- omapi_value_dereference (&tv, "dhcp_failover_state_lookup");
+ omapi_value_dereference (&tv, MDL);
/* If we already have a lease, and it's not the same one,
then the query was invalid. */
if (*sp && *sp != (omapi_object_t *)s) {
- omapi_object_dereference
- (sp, "dhcp_failover_state_lookup");
+ omapi_object_dereference (sp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!s) {
if (*sp)
- omapi_object_dereference
- (sp, "dhcp_failover_state_lookup");
+ omapi_object_dereference (sp, MDL);
return ISC_R_NOTFOUND;
} else if (!*sp)
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (sp, (omapi_object_t *)s,
- "dhcp_failover_state_lookup");
+ omapi_object_reference (sp, (omapi_object_t *)s, MDL);
}
/* If we get to here without finding a lease, no valid key was
/* Allocate a buffer for the option. */
option.count = size;
- option.data = dmalloc (option.count, "dhcp_failover_make_option");
+ option.data = dmalloc (option.count, MDL);
if (!option.data)
return &null_failover_option;
for (i = 0; i < count; i++) {
ival = va_arg (va, struct iaddr *);
if (ival -> len != 4) {
- dfree (option.data,
- "dhcp_failover_make_option");
+ dfree (option.data, MDL);
log_error ("IP addrlen=%d, should be 4.",
ival -> len);
return &null_failover_option;
failover_print (obuf, obufix, obufmax, ")");
/* Now allocate a place to store what we just set up. */
- op = dmalloc (sizeof (failover_option_t),
- "dhcp_failover_make_option");
+ op = dmalloc (sizeof (failover_option_t), MDL);
if (!op) {
- dfree (option.data, "dhcp_failover_make_option");
+ dfree (option.data, MDL);
return &null_failover_option;
}
/* Allocate an option buffer, unless we got an error. */
if (!bad_option) {
- opbuf = dmalloc (size, "dhcp_failover_put_message");
+ opbuf = dmalloc (size, MDL);
if (!opbuf)
status = ISC_R_NOMEMORY;
}
memcpy (&opbuf [opix],
option -> data, option -> count);
opix += option -> count;
- dfree (option -> data, "dhcp_failover_put_message");
- dfree (option, "dhcp_failover_put_message");
+ dfree (option -> data, MDL);
+ dfree (option, MDL);
}
if (bad_option || !opbuf)
status = omapi_connection_copyin (connection, opbuf, size);
if (status != ISC_R_SUCCESS)
goto err;
- dfree (opbuf, "dhcp_failover_put_message");
+ dfree (opbuf, MDL);
return status;
err:
- dfree (opbuf, "dhcp_failover_put_message");
+ dfree (opbuf, MDL);
omapi_disconnect (connection, 1);
return status;
}
#ifndef lint
static char copyright[] =
-"$Id: mdb.c,v 1.25 2000/01/25 01:42:48 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: mdb.c,v 1.26 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
(&hd -> client_identifier, (struct packet *)0,
(struct lease *)0, (struct option_state *)0,
(struct option_state *)0, &global_scope,
- esp -> data.option);
+ esp -> data.option, MDL);
break;
}
}
hd -> n_ipaddr -> refcnt++;
}
omapi_object_dereference ((omapi_object_t **)&hd -> n_ipaddr,
- "delete_host");
+ MDL);
}
if (host_name_hash) {
(struct lease *)0,
(struct option_state *)0,
(struct option_state *)0,
- &global_scope, hp -> fixed_addr))
+ &global_scope,
+ hp -> fixed_addr, MDL))
continue;
for (i = 0; i < fixed_addr.len; i += 4) {
ip_address.len = 4;
if (subnet) {
*addr = ip_address;
*host = hp;
- data_string_forget (&fixed_addr,
- "find_host_for_network");
+ data_string_forget (&fixed_addr, MDL);
return subnet;
}
}
- data_string_forget (&fixed_addr, "find_host_for_network");
+ data_string_forget (&fixed_addr, MDL);
}
return (struct subnet *)0;
}
} else {
group -> flags |= GROUP_OBJECT_DELETED;
if (group -> group) {
- dfree (group -> group, "delete_group");
+ dfree (group -> group, MDL);
group -> group = (struct group *)0;
}
}
(unsigned char *)group -> name,
strlen (group -> name));
omapi_object_dereference
- ((omapi_object_t **)&t,
- "supersede_group");
+ ((omapi_object_t **)&t, MDL);
}
}
} else {
}
/* Get a lease structure for each address in the range. */
- address_range = new_leases (max - min + 1, "new_address_range");
+ address_range = new_leases (max - min + 1, MDL);
if (!address_range) {
strcpy (lowbuf, piaddr (low));
strcpy (highbuf, piaddr (high));
address_range [lhost - i].client_hostname =
lp -> client_hostname;
supersede_lease (&address_range [lhost - i], lp, 0);
- free_lease (lp, "new_address_range");
+ free_lease (lp, MDL);
} else
plp = lp;
}
if (!strcmp (ip -> name, name))
break;
if (!ip) {
- ip = dmalloc (sizeof *ip, "parse_subnet_declaration");
+ ip = dmalloc (sizeof *ip, MDL);
if (!ip)
log_fatal ("No memory to record interface %s", name);
memset (ip, 0, sizeof *ip);
/* If we don't have a place for this lease yet, save it for
later. */
if (!comp) {
- comp = new_lease ("enter_lease");
+ comp = new_lease (MDL);
if (!comp) {
log_fatal ("No memory for lease %s\n",
piaddr (lease -> ip_addr));
uid_hash_delete (comp);
enter_uid = 1;
if (comp -> uid != &comp -> uid_buf [0]) {
- free (comp -> uid);
+ dfree (comp -> uid, MDL);
comp -> uid_max = 0;
comp -> uid_len = 0;
}
comp -> flags = ((lease -> flags & ~PERSISTENT_FLAGS) |
(comp -> flags & ~EPHEMERAL_FLAGS));
if (comp -> scope.bindings)
- free_bindings (&comp -> scope, "supersede_lease");
+ free_bindings (&comp -> scope, MDL);
comp -> scope.bindings = lease -> scope.bindings;
lease -> scope.bindings = (struct binding *)0;
if (lease -> on_expiry) {
if (comp -> on_expiry)
executable_statement_dereference (&comp -> on_expiry,
- "supersede_lease");
+ MDL);
executable_statement_reference (&comp -> on_expiry,
lease -> on_expiry,
- "supersede_lease");
+ MDL);
}
if (lease -> on_commit) {
if (comp -> on_commit)
executable_statement_dereference (&comp -> on_commit,
- "supersede_lease");
+ MDL);
executable_statement_reference (&comp -> on_commit,
lease -> on_commit,
- "supersede_lease");
+ MDL);
}
if (lease -> on_release) {
if (comp -> on_release)
executable_statement_dereference (&comp -> on_release,
- "supersede_lease");
+ MDL);
executable_statement_reference (&comp -> on_release,
- lease -> on_release,
- "supersede_lease");
+ lease -> on_release, MDL);
}
/* Record the lease in the uid hash if necessary. */
&lease -> scope,
comp -> on_expiry);
executable_statement_dereference (&comp -> on_expiry,
- "supersede_lease");
+ MDL);
#if defined (FAILOVER_PROTOCOL)
}
#endif
/* No sense releasing a lease after it's expired. */
if (comp -> on_release)
executable_statement_dereference
- (&comp -> on_release,
- "supersede_lease");
+ (&comp -> on_release, MDL);
} else {
/* If this is the next lease that will timeout on the
pool, zap the old timeout and set the timeout on
&lease -> scope, lease -> on_release);
if (lease -> on_release)
executable_statement_dereference (&lease -> on_release,
- "dhcprelease");
+ MDL);
}
/* We do either the on_release or the on_expiry events, but
not both (it's possible that they could be the same,
in any case). */
if (lease -> on_expiry)
- executable_statement_dereference (&lease -> on_expiry,
- "dhcprelease");
+ executable_statement_dereference (&lease -> on_expiry, MDL);
if (lease -> ends > cur_time) {
lt = *lease;
lease -> on_expiry);
if (lease -> on_expiry)
executable_statement_dereference
- (&lease -> on_expiry, "pool_timer");
+ (&lease -> on_expiry, MDL);
}
/* If there's an on_release event, blow it away. */
if (lease -> on_release)
executable_statement_dereference (&lease -> on_release,
- "pool_timer");
+ MDL);
#if defined (FAILOVER_PROTOCOL)
lease -> tstp = 0;
update_partner (lease);
(l -> flags & ABANDONED_LEASE)) {
if (!write_lease (l))
log_fatal ("Can't rewrite %s",
- "lease database");
+ "lease database");
num_written++;
}
}
#ifndef lint
static char copyright[] =
-"$Id: omapi.c,v 1.25 2000/01/25 01:43:48 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: omapi.c,v 1.26 2000/01/26 14:56:18 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
if (!omapi_ds_strcmp (name, "abandoned"))
return omapi_make_int_value (value, name,
(lease -> flags &
- ABANDONED_LEASE) ? 1 : 0,
- "dhcp_lease_get_value");
+ ABANDONED_LEASE) ? 1 : 0, MDL);
else if (!omapi_ds_strcmp (name, "bootpp"))
return omapi_make_int_value (value, name,
(lease -> flags &
- BOOTP_LEASE) ? 1 : 0,
- "dhcp_lease_get_value");
+ BOOTP_LEASE) ? 1 : 0, MDL);
else if (!omapi_ds_strcmp (name, "ip-address"))
return omapi_make_const_value (value, name,
lease -> ip_addr.iabuf,
- lease -> ip_addr.len,
- "dhcp_lease_get_value");
+ lease -> ip_addr.len, MDL);
else if (!omapi_ds_strcmp (name, "dhcp-client-identifier")) {
return omapi_make_const_value (value, name,
lease -> uid,
- lease -> uid_len,
- "dhcp_lease_get_value");
+ lease -> uid_len, MDL);
} else if (!omapi_ds_strcmp (name, "hostname")) {
if (lease -> hostname)
return omapi_make_string_value
- (value, name, lease -> hostname,
- "dhcp_lease_get_value");
+ (value, name, lease -> hostname, MDL);
return ISC_R_NOTFOUND;
} else if (!omapi_ds_strcmp (name, "client-hostname")) {
if (lease -> client_hostname)
return omapi_make_string_value
- (value, name, lease -> client_hostname,
- "dhcp_lease_get_value");
+ (value, name, lease -> client_hostname, MDL);
return ISC_R_NOTFOUND;
} else if (!omapi_ds_strcmp (name, "host")) {
if (lease -> host)
return omapi_make_handle_value
(value, name,
- ((omapi_object_t *)lease -> host),
- "dhcp_lease_get_value");
+ ((omapi_object_t *)lease -> host), MDL);
} else if (!omapi_ds_strcmp (name, "subnet"))
return omapi_make_handle_value (value, name,
((omapi_object_t *)
- lease -> subnet),
- "dhcp_lease_get_value");
+ lease -> subnet), MDL);
else if (!omapi_ds_strcmp (name, "pool"))
return omapi_make_handle_value (value, name,
((omapi_object_t *)
- lease -> pool),
- "dhcp_lease_get_value");
+ lease -> pool), MDL);
else if (!omapi_ds_strcmp (name, "billing-class")) {
if (lease -> billing_class)
return omapi_make_handle_value
(value, name,
((omapi_object_t *)lease -> billing_class),
- "dhcp_lease_get_value");
+ MDL);
return ISC_R_NOTFOUND;
} else if (!omapi_ds_strcmp (name, "hardware-address"))
return omapi_make_const_value
(value, name, &lease -> hardware_addr.hbuf [1],
- (unsigned)(lease -> hardware_addr.hlen - 1),
- "dhcp_lease_get_value");
+ (unsigned)(lease -> hardware_addr.hlen - 1), MDL);
else if (!omapi_ds_strcmp (name, "hardware-type"))
return omapi_make_int_value (value, name,
lease -> hardware_addr.hbuf [0],
- "dhcp_lease_get_value");
+ MDL);
/* Try to find some inner object that can take the value. */
if (h -> inner && h -> inner -> type -> get_value) {
return ISC_R_NOTFOUND;
}
-isc_result_t dhcp_lease_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcp_lease_destroy (omapi_object_t *h, const char *file, int line)
{
struct lease *lease;
isc_result_t status;
hw_hash_delete (lease);
if (lease -> billing_class)
omapi_object_dereference
- ((omapi_object_t **)&lease -> billing_class, name);
+ ((omapi_object_t **)&lease -> billing_class,
+ file, line);
if (lease -> uid && lease -> uid != &lease -> uid_buf [0]) {
- free (lease -> uid);
+ dfree (lease -> uid, MDL);
lease -> uid = &lease -> uid_buf [0];
lease -> uid_len = 0;
}
if (lease -> hostname) {
- free (lease -> hostname);
+ dfree (lease -> hostname, MDL);
lease -> hostname = (char *)0;
}
if (lease -> client_hostname) {
- free (lease -> client_hostname);
+ dfree (lease -> client_hostname, MDL);
lease -> hostname = (char *)0;
}
if (lease -> host)
omapi_object_dereference ((omapi_object_t **)&lease -> host,
- name);
+ file, line);
if (lease -> subnet)
omapi_object_dereference ((omapi_object_t **)&lease -> subnet,
- name);
+ file, line);
if (lease -> pool)
omapi_object_dereference ((omapi_object_t **)&lease -> pool,
- name);
+ file, line);
if (lease -> on_expiry)
- executable_statement_dereference (&lease -> on_expiry, name);
+ executable_statement_dereference (&lease -> on_expiry,
+ file, line);
if (lease -> on_commit)
- executable_statement_dereference (&lease -> on_commit, name);
+ executable_statement_dereference (&lease -> on_commit,
+ file, line);
if (lease -> on_release)
- executable_statement_dereference (&lease -> on_release, name);
+ executable_statement_dereference (&lease -> on_release,
+ file, line);
if (lease -> state) {
data_string_forget (&lease -> state -> parameter_request_list,
- name);
- free_lease_state (lease -> state, name);
+ file, line);
+ free_lease_state (lease -> state, file, line);
lease -> state = (struct lease_state *)0;
cancel_timeout (lease_ping_timeout, lease);
if (status == ISC_R_SUCCESS) {
status = omapi_handle_td_lookup (lp, tv -> value);
- omapi_value_dereference (&tv, "dhcp_lease_lookup");
+ omapi_value_dereference (&tv, MDL);
if (status != ISC_R_SUCCESS)
return status;
/* Don't return the object if the type is wrong. */
if ((*lp) -> type != dhcp_type_lease) {
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_INVALIDARG;
}
}
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_lease_lookup");
+ omapi_value_dereference (&tv, MDL);
/* If we already have a lease, and it's not the same one,
then the query was invalid. */
if (*lp && *lp != (omapi_object_t *)lease) {
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!lease) {
if (*lp)
- omapi_object_dereference (lp,
- "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (!*lp)
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)lease,
- "dhcp_lease_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)lease, MDL);
}
/* Now look for a client identifier. */
hash_lookup (lease_uid_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_lease_lookup");
+ omapi_value_dereference (&tv, MDL);
if (*lp && *lp != (omapi_object_t *)lease) {
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!lease) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (lease -> n_uid) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_MULTIPLE;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)lease,
- "dhcp_lease_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)lease, MDL);
}
}
hash_lookup (lease_hw_addr_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_lease_lookup");
+ omapi_value_dereference (&tv, MDL);
if (*lp && *lp != (omapi_object_t *)lease) {
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!lease) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (lease -> n_hw) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_lease_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_MULTIPLE;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)lease,
- "dhcp_lease_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)lease, MDL);
}
}
return ISC_R_EXISTS;
if (value -> type == omapi_datatype_data ||
value -> type == omapi_datatype_string) {
- group -> name = malloc (value -> u.buffer.len + 1);
+ group -> name = dmalloc (value -> u.buffer.len + 1,
+ MDL);
if (!group -> name)
return ISC_R_NOMEMORY;
memcpy (group -> name,
if (group -> group && group -> group -> statements)
return ISC_R_EXISTS;
if (!group -> group)
- group -> group = clone_group (&root_group,
- "dhcp_group_set_value");
+ group -> group = clone_group (&root_group, MDL);
if (!group -> group)
return ISC_R_NOMEMORY;
if (value -> type == omapi_datatype_data ||
group = (struct group_object *)h;
if (!omapi_ds_strcmp (name, "name"))
- return omapi_make_string_value (value, name, group -> name,
- "dhcp_group_get_value");
+ return omapi_make_string_value (value,
+ name, group -> name, MDL);
/* Try to find some inner object that can take the value. */
if (h -> inner && h -> inner -> type -> get_value) {
return ISC_R_NOTFOUND;
}
-isc_result_t dhcp_group_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcp_group_destroy (omapi_object_t *h, const char *file, int line)
{
struct group_object *group, *t;
isc_result_t status;
--group -> refcnt;
}
}
- free (group -> name);
+ dfree (group -> name, file, line);
group -> name = (char *)0;
}
if (group -> group)
char hnbuf [64];
sprintf (hnbuf, "ng%08lx%08lx",
cur_time, (unsigned long)group);
- group -> name = malloc (strlen (hnbuf) + 1);
+ group -> name = dmalloc (strlen (hnbuf) + 1, MDL);
if (!group -> name)
return ISC_R_NOMEMORY;
strcpy (group -> name, hnbuf);
if (status == ISC_R_SUCCESS) {
status = omapi_handle_td_lookup (lp, tv -> value);
- omapi_value_dereference (&tv, "dhcp_group_lookup");
+ omapi_value_dereference (&tv, MDL);
if (status != ISC_R_SUCCESS)
return status;
/* Don't return the object if the type is wrong. */
if ((*lp) -> type != dhcp_type_group) {
- omapi_object_dereference (lp, "dhcp_group_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_INVALIDARG;
}
}
hash_lookup (group_name_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_group_lookup");
+ omapi_value_dereference (&tv, MDL);
/* Don't register a deleted group here. */
if (group -> flags & GROUP_OBJECT_DELETED) {
}
if (*lp && *lp != (omapi_object_t *)group) {
- omapi_object_dereference (lp, "dhcp_group_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!group) {
- omapi_object_dereference (lp, "dhcp_group_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
omapi_object_reference (lp,
(omapi_object_t *)group,
- "dhcp_group_lookup");
+ MDL);
}
} else if (!*lp)
return ISC_R_NOTFOUND;
return ISC_R_NOKEYS;
if (((struct group_object *)(*lp)) -> flags & GROUP_OBJECT_DELETED) {
- omapi_object_dereference (lp, "dhcp_group_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
}
return ISC_R_SUCCESS;
{
struct group_object *group;
group = (struct group_object *)dmalloc (sizeof (struct group_object),
- "dhcp_group_create");
+ MDL);
if (!group)
return ISC_R_NOMEMORY;
memset (group, 0, sizeof *group);
group -> refcnt = 0;
group -> type = dhcp_type_group;
group -> flags = GROUP_OBJECT_DYNAMIC;
- return omapi_object_reference (lp, (omapi_object_t *)group,
- "dhcp_group_create");
+ return omapi_object_reference (lp, (omapi_object_t *)group, MDL);
}
isc_result_t dhcp_group_remove (omapi_object_t *lp,
if (!write_group (group) || !commit_leases ())
return ISC_R_IOERROR;
- status = dhcp_group_destroy ((omapi_object_t *)group,
- "dhcp_group_remove");
+ status = dhcp_group_destroy ((omapi_object_t *)group, MDL);
return ISC_R_SUCCESS;
}
return ISC_R_EXISTS;
if (value -> type == omapi_datatype_data ||
value -> type == omapi_datatype_string) {
- host -> name = malloc (value -> u.buffer.len + 1);
+ host -> name = dmalloc (value -> u.buffer.len + 1,
+ MDL);
if (!host -> name)
return ISC_R_NOMEMORY;
memcpy (host -> name,
if (host -> named_group)
omapi_object_dereference
((omapi_object_t **)
- &host -> named_group,
- "dhcp_host_set_value");
+ &host -> named_group, MDL);
omapi_object_reference ((omapi_object_t **)
&host -> named_group,
- (omapi_object_t *)group,
- "dhcp_host_set_value");
+ (omapi_object_t *)group, MDL);
} else
return ISC_R_INVALIDARG;
return ISC_R_SUCCESS;
return ISC_R_EXISTS;
if (value -> type == omapi_datatype_data ||
value -> type == omapi_datatype_string) {
- if (!buffer_allocate
- (&host -> client_identifier.buffer,
- value -> u.buffer.len,
- "dhcp_host_set_value"))
- return ISC_R_NOMEMORY;
- host -> client_identifier.data =
- &host -> client_identifier.buffer -> data [0];
- memcpy (host -> client_identifier.buffer -> data,
- value -> u.buffer.value,
- value -> u.buffer.len);
- host -> client_identifier.len = value -> u.buffer.len;
+ if (!buffer_allocate (&host -> client_identifier.buffer,
+ value -> u.buffer.len, MDL))
+ return ISC_R_NOMEMORY;
+ host -> client_identifier.data =
+ &host -> client_identifier.buffer -> data [0];
+ memcpy (host -> client_identifier.buffer -> data,
+ value -> u.buffer.value,
+ value -> u.buffer.len);
+ host -> client_identifier.len = value -> u.buffer.len;
} else
- return ISC_R_INVALIDARG;
+ return ISC_R_INVALIDARG;
return ISC_R_SUCCESS;
}
struct data_string ds;
memset (&ds, 0, sizeof ds);
ds.len = value -> u.buffer.len;
- if (!buffer_allocate (&ds.buffer, ds.len,
- "dhcp_host_set_value"))
+ if (!buffer_allocate (&ds.buffer, ds.len, MDL))
return ISC_R_NOMEMORY;
ds.data = (&ds.buffer -> data [0]);
memcpy (ds.buffer -> data,
if (!option_cache (&host -> fixed_addr,
&ds, (struct expression *)0,
(struct option *)0)) {
- data_string_forget (&ds,
- "dhcp_host_set_value");
+ data_string_forget (&ds, MDL);
return ISC_R_NOMEMORY;
}
- data_string_forget (&ds, "dhcp_host_set_value");
+ data_string_forget (&ds, MDL);
} else
return ISC_R_INVALIDARG;
return ISC_R_SUCCESS;
if (!omapi_ds_strcmp (name, "statements")) {
if (!host -> group)
- host -> group = clone_group (&root_group,
- "dhcp_host_set_value");
+ host -> group = clone_group (&root_group, MDL);
else {
if (host -> group -> statements &&
(!host -> named_group ||
host -> group != host -> named_group -> group) &&
host -> group != &root_group)
return ISC_R_EXISTS;
- host -> group = clone_group (host -> group,
- "dhcp_host_set_value");
+ host -> group = clone_group (host -> group, MDL);
}
if (!host -> group)
return ISC_R_NOMEMORY;
host = (struct host_decl *)h;
if (!omapi_ds_strcmp (name, "ip-addresses")) {
- memset (&ip_addrs, 0, sizeof ip_addrs);
- if (host -> fixed_addr &&
- evaluate_option_cache (&ip_addrs, (struct packet *)0,
- (struct lease *)0,
- (struct option_state *)0,
- (struct option_state *)0,
- &global_scope,
- host -> fixed_addr)) {
- status = (omapi_make_const_value
- (value, name, ip_addrs.data, ip_addrs.len,
- "dhcp_host_get_value"));
- data_string_forget (&ip_addrs, "dhcp_host_get_value");
- return status;
- }
- return ISC_R_NOTFOUND;
+ memset (&ip_addrs, 0, sizeof ip_addrs);
+ if (host -> fixed_addr &&
+ evaluate_option_cache (&ip_addrs, (struct packet *)0,
+ (struct lease *)0,
+ (struct option_state *)0,
+ (struct option_state *)0,
+ &global_scope,
+ host -> fixed_addr, MDL)) {
+ status = omapi_make_const_value (value, name,
+ ip_addrs.data,
+ ip_addrs.len, MDL);
+ data_string_forget (&ip_addrs, MDL);
+ return status;
+ }
+ return ISC_R_NOTFOUND;
}
if (!omapi_ds_strcmp (name, "dhcp-client-identifier")) {
return omapi_make_const_value (value, name,
host -> client_identifier.data,
host -> client_identifier.len,
- "dhcp_host_get_value");
+ MDL);
}
if (!omapi_ds_strcmp (name, "name"))
return omapi_make_string_value (value, name, host -> name,
- "dhcp_host_get_value");
+ MDL);
if (!omapi_ds_strcmp (name, "hardware-address")) {
if (!host -> interface.hlen)
return ISC_R_NOTFOUND;
return (omapi_make_const_value
(value, name, &host -> interface.hbuf [1],
- (unsigned long)(host -> interface.hlen - 1),
- "dhcp_host_get_value"));
+ (unsigned long)(host -> interface.hlen - 1), MDL));
}
if (!omapi_ds_strcmp (name, "hardware-type")) {
if (!host -> interface.hlen)
return ISC_R_NOTFOUND;
return omapi_make_int_value (value, name,
- host -> interface.hbuf [0],
- "dhcp_host_get_value");
+ host -> interface.hbuf [0], MDL);
}
/* Try to find some inner object that can take the value. */
return ISC_R_NOTFOUND;
}
-isc_result_t dhcp_host_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcp_host_destroy (omapi_object_t *h, const char *file, int line)
{
struct host_decl *host;
isc_result_t status;
char hnbuf [64];
sprintf (hnbuf, "nh%08lx%08lx",
cur_time, (unsigned long)host);
- host -> name = malloc (strlen (hnbuf) + 1);
+ host -> name = dmalloc (strlen (hnbuf) + 1, MDL);
if (!host -> name)
return ISC_R_NOMEMORY;
strcpy (host -> name, hnbuf);
(struct option_state *)0,
(struct option_state *)0,
&global_scope,
- host -> fixed_addr)) {
+ host -> fixed_addr, MDL)) {
status = omapi_connection_put_name (c, "ip-address");
if (status != ISC_R_SUCCESS)
return status;
if (status == ISC_R_SUCCESS) {
status = omapi_handle_td_lookup (lp, tv -> value);
- omapi_value_dereference (&tv, "dhcp_host_lookup");
+ omapi_value_dereference (&tv, MDL);
if (status != ISC_R_SUCCESS)
return status;
/* Don't return the object if the type is wrong. */
if ((*lp) -> type != dhcp_type_host) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_INVALIDARG;
}
if (((struct host_decl *)(*lp)) -> flags & HOST_DECL_DELETED) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
}
}
hash_lookup (host_uid_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_host_lookup");
+ omapi_value_dereference (&tv, MDL);
if (*lp && *lp != (omapi_object_t *)host) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!host || (host -> flags & HOST_DECL_DELETED)) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)host,
- "dhcp_host_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)host, MDL);
}
}
hash_lookup (host_hw_addr_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_host_lookup");
+ omapi_value_dereference (&tv, MDL);
if (*lp && *lp != (omapi_object_t *)host) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!host || (host -> flags & HOST_DECL_DELETED)) {
if (*lp)
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_NOTFOUND;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)host,
- "dhcp_host_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)host, MDL);
}
}
hash_lookup (lease_ip_addr_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_host_lookup");
+ omapi_value_dereference (&tv, MDL);
if (!l && !*lp)
return ISC_R_NOTFOUND;
l -> hardware_addr.hlen));
if (host && *lp && *lp != (omapi_object_t *)host) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!host || (host -> flags &
HOST_DECL_DELETED)) {
XXX the reference. */
omapi_object_reference (lp,
(omapi_object_t *)host,
- "dhcp_host_lookup");
+ MDL);
}
}
}
hash_lookup (host_name_hash,
tv -> value -> u.buffer.value,
tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, "dhcp_host_lookup");
+ omapi_value_dereference (&tv, MDL);
if (*lp && *lp != (omapi_object_t *)host) {
- omapi_object_dereference (lp, "dhcp_host_lookup");
+ omapi_object_dereference (lp, MDL);
return ISC_R_KEYCONFLICT;
} else if (!host || (host -> flags & HOST_DECL_DELETED)) {
return ISC_R_NOTFOUND;
} else if (!*lp) {
/* XXX fix so that hash lookup itself creates
XXX the reference. */
- omapi_object_reference (lp, (omapi_object_t *)host,
- "dhcp_host_lookup");
+ omapi_object_reference (lp,
+ (omapi_object_t *)host, MDL);
}
}
omapi_object_t *id)
{
struct host_decl *hp;
- hp = (struct host_decl *)dmalloc (sizeof (struct host_decl),
- "dhcp_host_create");
+ hp = (struct host_decl *)dmalloc (sizeof (struct host_decl), MDL);
if (!hp)
return ISC_R_NOMEMORY;
memset (hp, 0, sizeof *hp);
hp -> type = dhcp_type_host;
hp -> group = &root_group; /* XXX */
hp -> flags = HOST_DECL_DYNAMIC;
- return omapi_object_reference (lp, (omapi_object_t *)hp,
- "dhcp_host_create");
+ return omapi_object_reference (lp, (omapi_object_t *)hp, MDL);
}
isc_result_t dhcp_host_remove (omapi_object_t *lp,
return ISC_R_NOTFOUND;
}
-isc_result_t dhcp_pool_destroy (omapi_object_t *h, const char *name)
+isc_result_t dhcp_pool_destroy (omapi_object_t *h, const char *file, int line)
{
struct pool *pool;
isc_result_t status;