2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-29 13:28:14 +00:00

Sync with 3.0rc7

This commit is contained in:
Ted Lemon 2001-05-17 19:04:09 +00:00
parent cb7cfe5cb7
commit 31bbee784c
21 changed files with 449 additions and 167 deletions

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: conflex.c,v 1.92 2001/05/02 06:32:54 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; "$Id: conflex.c,v 1.93 2001/05/17 19:03:43 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -926,6 +926,8 @@ static enum dhcp_token intern (atom, dfv)
return TOKEN_RESET; return TOKEN_RESET;
if (!strcasecmp (atom + 1, "eserved")) if (!strcasecmp (atom + 1, "eserved"))
return TOKEN_RESERVED; return TOKEN_RESERVED;
if (!strcasecmp (atom + 1, "emove"))
return REMOVE;
break; break;
case 's': case 's':
if (!strcasecmp (atom + 1, "tate")) if (!strcasecmp (atom + 1, "tate"))

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: discover.c,v 1.42 2001/05/02 06:36:54 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; "$Id: discover.c,v 1.43 2001/05/17 19:03:44 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -184,6 +184,15 @@ void discover_interfaces (state)
if (i < 0) if (i < 0)
log_fatal ("ioctl: SIOCGIFCONF: %m"); log_fatal ("ioctl: SIOCGIFCONF: %m");
#ifdef SIOCGIFCONF_ZERO_PROBE
/* Workaround for SIOCGIFCONF bug on some Linux versions. */
if (ic.ifc_ifcu.ifcu_buf == 0 && ic.ifc_len == 0) {
ic.ifc_len = sizeof buf;
ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
goto gifconf_again;
}
#endif
/* If the SIOCGIFCONF resulted in more data than would fit in /* If the SIOCGIFCONF resulted in more data than would fit in
a buffer, allocate a bigger buffer. */ a buffer, allocate a bigger buffer. */
if ((ic.ifc_ifcu.ifcu_buf == buf if ((ic.ifc_ifcu.ifcu_buf == buf
@ -198,7 +207,7 @@ void discover_interfaces (state)
#ifdef SIOCGIFCONF_ZERO_PROBE #ifdef SIOCGIFCONF_ZERO_PROBE
} else if (ic.ifc_ifcu.ifcu_buf == 0) { } else if (ic.ifc_ifcu.ifcu_buf == 0) {
ic.ifc_ifcu.ifcu_buf = (caddr_t)buf; ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
if.ifc_len = sizeof buf; ic.ifc_len = sizeof buf;
goto gifconf_again; goto gifconf_again;
#endif #endif
} }

View File

@ -321,6 +321,43 @@ dhcpctl_status dhcpctl_set_string_value (dhcpctl_handle h, const char *value,
return status; return status;
} }
/* dhcpctl_set_buffer_value
Sets a NUL-terminated ASCII value on an object referred to by
a dhcpctl_handle. like dhcpctl_set_value, but saves the
trouble of creating a data_string for a NUL-terminated string.
Does not update the server - just sets the value on the handle. */
dhcpctl_status dhcpctl_set_data_value (dhcpctl_handle h,
const char *value, unsigned len,
const char *value_name)
{
isc_result_t status;
omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
omapi_data_string_t *name = (omapi_data_string_t *)0;
int ip;
unsigned ll;
ll = strlen (value_name);
status = omapi_data_string_new (&name, ll, MDL);
if (status != ISC_R_SUCCESS)
return status;
memcpy (name -> value, value_name, ll);
status = omapi_typed_data_new (MDL, &tv,
omapi_datatype_data, len, value);
if (status != ISC_R_SUCCESS) {
omapi_data_string_dereference (&name, MDL);
return status;
}
memcpy (tv -> u.buffer.value, value, len);
status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
omapi_data_string_dereference (&name, MDL);
omapi_typed_data_dereference (&tv, MDL);
return status;
}
/* dhcpctl_set_boolean_value /* dhcpctl_set_boolean_value
Sets a boolean value on an object - like dhcpctl_set_value, Sets a boolean value on an object - like dhcpctl_set_value,

View File

@ -85,6 +85,8 @@ dhcpctl_status dhcpctl_set_value (dhcpctl_handle,
dhcpctl_data_string, const char *); dhcpctl_data_string, const char *);
dhcpctl_status dhcpctl_set_string_value (dhcpctl_handle, const char *, dhcpctl_status dhcpctl_set_string_value (dhcpctl_handle, const char *,
const char *); const char *);
dhcpctl_status dhcpctl_set_data_value (dhcpctl_handle,
const char *, unsigned, const char *);
dhcpctl_status dhcpctl_set_boolean_value (dhcpctl_handle, int, const char *); dhcpctl_status dhcpctl_set_boolean_value (dhcpctl_handle, int, const char *);
dhcpctl_status dhcpctl_set_int_value (dhcpctl_handle, int, const char *); dhcpctl_status dhcpctl_set_int_value (dhcpctl_handle, int, const char *);
dhcpctl_status dhcpctl_object_update (dhcpctl_handle, dhcpctl_handle); dhcpctl_status dhcpctl_object_update (dhcpctl_handle, dhcpctl_handle);

View File

@ -107,6 +107,13 @@ int main (int argc, char **argv, char **envp)
usage(argv[0]); usage(argv[0]);
} }
/* Initially, log errors to stderr as well as to syslogd. */
#ifdef SYSLOG_4_2
openlog ("dhcpd", LOG_NDELAY);
log_priority = DHCPD_LOG_FACILITY;
#else
openlog ("dhcpd", LOG_NDELAY, DHCPD_LOG_FACILITY);
#endif
status = dhcpctl_initialize (); status = dhcpctl_initialize ();
if (status != ISC_R_SUCCESS) { if (status != ISC_R_SUCCESS) {
fprintf (stderr, "dhcpctl_initialize: %s\n", fprintf (stderr, "dhcpctl_initialize: %s\n",
@ -208,7 +215,7 @@ int main (int argc, char **argv, char **envp)
if (se) if (se)
port = ntohs (se -> s_port); port = ntohs (se -> s_port);
else { else {
printf ("unknown service name: %s", val); printf ("unknown service name: %s\n", val);
break; break;
} }
} else if (token == NUMBER) { } else if (token == NUMBER) {
@ -287,7 +294,7 @@ int main (int argc, char **argv, char **envp)
s = dmalloc (strlen (val) + 1, MDL); s = dmalloc (strlen (val) + 1, MDL);
if (!server) { if (!server) {
printf ("no memory to store server name."); printf ("no memory to store server name.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -305,13 +312,13 @@ int main (int argc, char **argv, char **envp)
case KEY: case KEY:
token = next_token (&val, (unsigned *)0, cfile); token = next_token (&val, (unsigned *)0, cfile);
if (!is_identifier (token)) { if (!is_identifier (token)) {
printf ("usage: key <name> <value>"); printf ("usage: key <name> <value>\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
s = dmalloc (strlen (val) + 1, MDL); s = dmalloc (strlen (val) + 1, MDL);
if (!s) { if (!s) {
printf ("no memory for key name."); printf ("no memory for key name.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -379,7 +386,7 @@ int main (int argc, char **argv, char **envp)
} }
if (!connected) { if (!connected) {
printf ("not connected."); printf ("not connected.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -408,7 +415,7 @@ int main (int argc, char **argv, char **envp)
} }
if (!connected) { if (!connected) {
printf ("not connected."); printf ("not connected.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -434,7 +441,7 @@ int main (int argc, char **argv, char **envp)
} }
if (!connected) { if (!connected) {
printf ("not connected."); printf ("not connected.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -450,23 +457,77 @@ int main (int argc, char **argv, char **envp)
switch (token) { switch (token) {
case STRING: case STRING:
dhcpctl_set_string_value (oh, val, s1); dhcpctl_set_string_value (oh, val, s1);
token = next_token (&val, (unsigned *)0, cfile);
break; break;
case NUMBER: case NUMBER:
dhcpctl_set_int_value (oh, atoi (val), s1); strcpy (buf, val);
token = peek_token (&val, (unsigned *)0, cfile);
/* Colon-seperated hex list? */
if (token == COLON)
goto cshl;
else if (token == DOT) {
s = buf;
val = buf;
do {
int intval = atoi (val);
if (intval > 255) {
parse_warn (cfile,
"dotted octet > 255: %s",
val);
skip_to_semi (cfile);
goto badnum;
}
*s++ = intval;
token = next_token (&val,
(unsigned *)0, cfile);
if (token != DOT)
break;
token = next_token (&val,
(unsigned *)0, cfile);
} while (token == NUMBER);
dhcpctl_set_data_value (oh, buf,
(unsigned)(s - buf),
s1);
break;
}
dhcpctl_set_int_value (oh, atoi (buf), s1);
token = next_token (&val, (unsigned *)0, cfile);
badnum:
break;
case NUMBER_OR_NAME:
strcpy (buf, val);
cshl:
s = buf;
val = buf;
do {
convert_num (cfile, s, val, 16, 8);
++s;
token = next_token (&val,
(unsigned *)0, cfile);
if (token != COLON)
break;
token = next_token (&val,
(unsigned *)0, cfile);
} while (token == NUMBER ||
token == NUMBER_OR_NAME);
dhcpctl_set_data_value (oh, buf,
(unsigned)(s - buf), s1);
break; break;
default: default:
printf ("invalid value.\n"); printf ("invalid value.\n");
skip_to_semi (cfile);
} }
token = next_token (&val, (unsigned *)0, cfile);
if (token != END_OF_FILE && token != EOL) if (token != END_OF_FILE && token != EOL)
goto set_usage; goto set_usage;
break; break;
case TOKEN_CREATE: case TOKEN_CREATE:
case TOKEN_OPEN: case TOKEN_OPEN:
i = token;
token = next_token (&val, (unsigned *)0, cfile); token = next_token (&val, (unsigned *)0, cfile);
if (token != END_OF_FILE && token != EOL) { if (token != END_OF_FILE && token != EOL) {
printf ("usage: %s\n", val); printf ("usage: %s\n", val);
@ -475,14 +536,21 @@ int main (int argc, char **argv, char **envp)
} }
if (!connected) { if (!connected) {
printf ("not connected."); printf ("not connected.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
i = 0; if (!oh) {
if (token == TOKEN_CREATE) printf ("you must make a new object first!\n");
skip_to_semi (cfile);
break;
}
if (i == TOKEN_CREATE)
i = DHCPCTL_CREATE | DHCPCTL_EXCL; i = DHCPCTL_CREATE | DHCPCTL_EXCL;
else
i = 0;
status = dhcpctl_open_object (oh, connection, i); status = dhcpctl_open_object (oh, connection, i);
if (status == ISC_R_SUCCESS) if (status == ISC_R_SUCCESS)
@ -507,7 +575,7 @@ int main (int argc, char **argv, char **envp)
} }
if (!connected) { if (!connected) {
printf ("not connected."); printf ("not connected.\n");
skip_to_semi (cfile); skip_to_semi (cfile);
break; break;
} }
@ -525,8 +593,36 @@ int main (int argc, char **argv, char **envp)
} }
break; break;
case REMOVE:
token = next_token (&val, (unsigned *)0, cfile);
if (token != END_OF_FILE && token != EOL) {
printf ("usage: %s\n", val);
skip_to_semi (cfile);
break;
} }
} while (token != END_OF_FILE);
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
break;
}
status = dhcpctl_object_remove(connection, oh);
if (status == ISC_R_SUCCESS)
status = dhcpctl_wait_for_completion
(oh, &waitstatus);
if (status == ISC_R_SUCCESS)
status = waitstatus;
if (status != ISC_R_SUCCESS) {
printf ("can't destroy object: %s\n",
isc_result_totext (status));
break;
}
break;
}
} while (1);
exit (0); exit (0);
} }

View File

@ -125,7 +125,7 @@ extern int h_errno;
# define USE_LPF # define USE_LPF
# endif # endif
# if !defined (__sparc__) /* XXX hopefully this will be fixed someday */ # if !defined (__sparc__) /* XXX hopefully this will be fixed someday */
# define SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN # define SIOCGIFCONF_ZERO_PROBE
# endif # endif
# define LINUX_SLASHPROC_DISCOVERY # define LINUX_SLASHPROC_DISCOVERY
# define PROCDEV_DEVICE "/proc/net/dev" # define PROCDEV_DEVICE "/proc/net/dev"

View File

@ -2475,11 +2475,12 @@ void update_partner PROTO ((struct lease *));
int load_balance_mine (struct packet *, dhcp_failover_state_t *); int load_balance_mine (struct packet *, dhcp_failover_state_t *);
binding_state_t normal_binding_state_transition_check (struct lease *, binding_state_t normal_binding_state_transition_check (struct lease *,
dhcp_failover_state_t *, dhcp_failover_state_t *,
binding_state_t); binding_state_t,
u_int32_t);
binding_state_t binding_state_t
conflict_binding_state_transition_check (struct lease *, conflict_binding_state_transition_check (struct lease *,
dhcp_failover_state_t *, dhcp_failover_state_t *,
binding_state_t); binding_state_t, u_int32_t);
int lease_mine_to_reallocate (struct lease *); int lease_mine_to_reallocate (struct lease *);
OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_state, dhcp_failover_state_t, OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_state, dhcp_failover_state_t,

View File

@ -312,7 +312,8 @@ enum dhcp_token {
END_OF_FILE = 607, END_OF_FILE = 607,
RECOVER_WAIT = 608, RECOVER_WAIT = 608,
SERVER = 609, SERVER = 609,
CONNECT = 610 CONNECT = 610,
REMOVE = 611
}; };
#define is_identifier(x) ((x) >= FIRST_TOKEN && \ #define is_identifier(x) ((x) >= FIRST_TOKEN && \

View File

@ -1,3 +1,3 @@
/* Current version of ISC DHCP Distribution. */ /* Current version of ISC DHCP Distribution. */
#define DHCP_VERSION "V3.0rc4" #define DHCP_VERSION "V3.1-unreleased"

View File

@ -293,35 +293,34 @@ void dmalloc_dump_outstanding ()
somewhere. */ somewhere. */
if (dp -> file) { if (dp -> file) {
#if defined (DEBUG_RC_HISTORY) #if defined (DEBUG_RC_HISTORY)
int i, count, inhistory = 0, noted = 0;
/* If we have the info, see if this is actually /* If we have the info, see if this is actually
new garbage. */ new garbage. */
if (rc_history_count < RC_HISTORY_MAX) { if (rc_history_count < RC_HISTORY_MAX) {
int i, printit = 0, inhistory = 0, prefcnt = 0; count = rc_history_count;
i = rc_history_index - rc_history_count; } else
count = RC_HISTORY_MAX;
i = rc_history_index - 1;
if (i < 0) if (i < 0)
i += RC_HISTORY_MAX; i += RC_HISTORY_MAX;
do { do {
if (rc_history [i].addr == dp + 1) { if (rc_history [i].addr == dp + 1) {
if (rc_history [i].refcnt == 1 &&
prefcnt == 0 && !printit) {
printit = 1;
inhistory = 1; inhistory = 1;
log_info (" %s(%d): %d", if (!noted) {
dp -> file,
dp -> line,
dp -> size);
}
prefcnt = rc_history [i].refcnt;
if (printit)
print_rc_hist_entry (i);
}
if (++i == RC_HISTORY_MAX)
i = 0;
} while (i != rc_history_index);
if (!inhistory)
log_info (" %s(%d): %d", dp -> file, log_info (" %s(%d): %d", dp -> file,
dp -> line, dp -> size); dp -> line, dp -> size);
} else noted = 1;
}
print_rc_hist_entry (i);
if (!rc_history [i].refcnt)
break;
}
if (--i < 0)
i = RC_HISTORY_MAX - 1;
} while (count--);
if (!inhistory)
#endif #endif
log_info (" %s(%d): %d", log_info (" %s(%d): %d",
dp -> file, dp -> line, dp -> size); dp -> file, dp -> line, dp -> size);
@ -516,16 +515,20 @@ isc_result_t omapi_object_dereference (omapi_object_t **h,
extra_references = 0; extra_references = 0;
for (p = (*h) -> inner; for (p = (*h) -> inner;
p && !extra_references; p = p -> inner) { p && !extra_references; p = p -> inner) {
extra_references += p -> refcnt - 1; extra_references += p -> refcnt;
if (p -> inner) if (p -> inner && p -> inner -> outer == p)
--extra_references;
if (p -> outer)
--extra_references; --extra_references;
if (p -> handle) if (p -> handle)
--extra_references; --extra_references;
} }
for (p = (*h) -> outer; for (p = (*h) -> outer;
p && !extra_references; p = p -> outer) { p && !extra_references; p = p -> outer) {
extra_references += p -> refcnt - 1; extra_references += p -> refcnt;
if (p -> outer) if (p -> outer && p -> outer -> inner == p)
--extra_references;
if (p -> inner)
--extra_references; --extra_references;
if (p -> handle) if (p -> handle)
--extra_references; --extra_references;
@ -549,6 +552,11 @@ isc_result_t omapi_object_dereference (omapi_object_t **h,
((*h) -> type -> freer (*h, file, line)); ((*h) -> type -> freer (*h, file, line));
else else
dfree (*h, file, line); dfree (*h, file, line);
} else {
(*h) -> refcnt--;
if (!(*h) -> type -> freer)
rc_register (file, line,
h, *h, (*h) -> refcnt);
} }
} else { } else {
(*h) -> refcnt--; (*h) -> refcnt--;

View File

@ -273,6 +273,7 @@ void omapi_connection_register (omapi_connection_object_t *obj,
return; return;
} }
#if defined (TRACING)
if (trace_record ()) { if (trace_record ()) {
/* Connection registration packet: /* Connection registration packet:
@ -305,6 +306,7 @@ void omapi_connection_register (omapi_connection_object_t *obj,
status = trace_write_packet_iov (trace_connect, status = trace_write_packet_iov (trace_connect,
iov_count, iov, file, line); iov_count, iov, file, line);
} }
#endif
} }
static void trace_connect_input (trace_type_t *ttype, static void trace_connect_input (trace_type_t *ttype,

View File

@ -3,7 +3,7 @@
Routines for manipulating hash tables... */ Routines for manipulating hash tables... */
/* /*
* Copyright (c) 1995-2000 Internet Software Consortium. * Copyright (c) 1995-2001 Internet Software Consortium.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: hash.c,v 1.1 2000/08/01 22:55:07 neild Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; "$Id: hash.c,v 1.2 2001/05/17 19:03:57 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include <omapip/omapip_p.h> #include <omapip/omapip_p.h>

View File

@ -54,13 +54,10 @@ isc_result_t omapi_message_new (omapi_object_t **o, const char *file, int line)
omapi_object_t *g; omapi_object_t *g;
isc_result_t status; isc_result_t status;
m = dmalloc (sizeof *m, file, line); m = (omapi_message_object_t *)0;
if (!m) status = omapi_message_allocate (&m, file, line);
return ISC_R_NOMEMORY; if (status != ISC_R_SUCCESS)
memset (m, 0, sizeof *m); return status;
m -> type = omapi_type_message;
rc_register (file, line, &m, m, m -> refcnt);
m -> refcnt = 1;
g = (omapi_object_t *)0; g = (omapi_object_t *)0;
status = omapi_generic_new (&g, file, line); status = omapi_generic_new (&g, file, line);
@ -84,7 +81,7 @@ isc_result_t omapi_message_new (omapi_object_t **o, const char *file, int line)
} }
status = omapi_object_reference (o, (omapi_object_t *)m, file, line); status = omapi_object_reference (o, (omapi_object_t *)m, file, line);
omapi_object_dereference ((omapi_object_t **)&m, file, line); omapi_message_dereference (&m, file, line);
omapi_object_dereference (&g, file, line); omapi_object_dereference (&g, file, line);
if (status != ISC_R_SUCCESS) if (status != ISC_R_SUCCESS)
return status; return status;
@ -369,7 +366,36 @@ static const char *omapi_message_op_name(int op) {
} }
#endif #endif
static isc_result_t
omapi_message_process_internal (omapi_object_t *, omapi_object_t *);
isc_result_t omapi_message_process (omapi_object_t *mo, omapi_object_t *po) isc_result_t omapi_message_process (omapi_object_t *mo, omapi_object_t *po)
{
isc_result_t status;
#if defined (DEBUG_MEMORY_LEAKAGE)
unsigned long previous_outstanding = dmalloc_outstanding;
#endif
status = omapi_message_process_internal (mo, po);
#if defined (DEBUG_MEMORY_LEAKAGE) && 0
log_info ("generation %ld: %ld new, %ld outstanding, %ld long-term",
dmalloc_generation,
dmalloc_outstanding - previous_outstanding,
dmalloc_outstanding, dmalloc_longterm);
#endif
#if (defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)) && 0
dmalloc_dump_outstanding ();
#endif
#if defined (DEBUG_RC_HISTORY_EXHAUSTIVELY) && 0
dump_rc_history ();
#endif
return status;
}
static isc_result_t
omapi_message_process_internal (omapi_object_t *mo, omapi_object_t *po)
{ {
omapi_message_object_t *message, *m; omapi_message_object_t *message, *m;
omapi_object_t *object = (omapi_object_t *)0; omapi_object_t *object = (omapi_object_t *)0;

View File

@ -357,6 +357,10 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
u_int16_t nlen; u_int16_t nlen;
u_int32_t vlen; u_int32_t vlen;
u_int32_t th; u_int32_t th;
#if defined (DEBUG_MEMORY_LEAKAGE)
unsigned long previous_outstanding = 0xBEADCAFE;
unsigned long connect_outstanding = 0xBEADCAFE;
#endif
if (h -> type != omapi_type_protocol) { if (h -> type != omapi_type_protocol) {
/* XXX shouldn't happen. Put an assert here? */ /* XXX shouldn't happen. Put an assert here? */
@ -365,6 +369,9 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
p = (omapi_protocol_object_t *)h; p = (omapi_protocol_object_t *)h;
if (!strcmp (name, "connect")) { if (!strcmp (name, "connect")) {
#if defined (DEBUG_MEMORY_LEAKAGE)
connect_outstanding = dmalloc_outstanding;
#endif
/* Send the introductory message. */ /* Send the introductory message. */
status = omapi_protocol_send_intro status = omapi_protocol_send_intro
(h, OMAPI_PROTOCOL_VERSION, (h, OMAPI_PROTOCOL_VERSION,
@ -389,6 +396,26 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
} }
} }
/* If we get a disconnect, dump memory usage. */
if (!strcmp (name, "disconnect")
#if defined (DEBUG_MEMORY_LEAKAGE)
&& connect_outstanding != 0xBEADCAFE
#endif
) {
#if defined (DEBUG_MEMORY_LEAKAGE)
log_info ("generation %ld: %ld new, %ld outstanding, %ld%s",
dmalloc_generation,
dmalloc_outstanding - previous_outstanding,
dmalloc_outstanding, dmalloc_longterm, " long-term");
#endif
#if (defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL))
dmalloc_dump_outstanding ();
#endif
#if defined (DEBUG_RC_HISTORY_EXHAUSTIVELY)
dump_rc_history ();
#endif
}
/* Not a signal we recognize? */ /* Not a signal we recognize? */
if (strcmp (name, "ready")) { if (strcmp (name, "ready")) {
if (p -> inner && p -> inner -> type -> signal_handler) if (p -> inner && p -> inner -> type -> signal_handler)
@ -449,6 +476,24 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
/* If we already have the data, fall through. */ /* If we already have the data, fall through. */
case omapi_protocol_header_wait: case omapi_protocol_header_wait:
#if defined (DEBUG_MEMORY_LEAKAGE)
if (previous_outstanding != 0xBEADCAFE) {
log_info ("%s %ld: %ld new, %ld outstanding, %ld%s",
"generation", dmalloc_generation,
dmalloc_outstanding - previous_outstanding,
dmalloc_outstanding, dmalloc_longterm,
" long-term");
#endif
#if (defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL))
dmalloc_dump_outstanding ();
#endif
#if defined (DEBUG_RC_HISTORY_EXHAUSTIVELY)
dump_rc_history ();
#endif
#if defined (DEBUG_MEMORY_LEAKAGE)
}
previous_outstanding = dmalloc_outstanding;
#endif
status = omapi_message_new ((omapi_object_t **)&p -> message, status = omapi_message_new ((omapi_object_t **)&p -> message,
MDL); MDL);
if (status != ISC_R_SUCCESS) { if (status != ISC_R_SUCCESS) {
@ -690,7 +735,21 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
} }
omapi_message_dereference (&p -> message, MDL); omapi_message_dereference (&p -> message, MDL);
#if defined (DEBUG_MEMORY_LEAKAGE)
log_info ("generation %ld: %ld new, %ld outstanding, %ld%s",
dmalloc_generation,
dmalloc_outstanding - previous_outstanding,
dmalloc_outstanding, dmalloc_longterm, " long-term");
#endif
#if (defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL))
dmalloc_dump_outstanding ();
#endif
#if defined (DEBUG_RC_HISTORY_EXHAUSTIVELY)
dump_rc_history ();
#endif
#if defined (DEBUG_MEMORY_LEAKAGE)
previous_outstanding = 0xBEADCAFE;
#endif
/* Now wait for the next message. */ /* Now wait for the next message. */
goto to_header_wait; goto to_header_wait;

View File

@ -364,7 +364,9 @@ isc_result_t omapi_set_value_str (omapi_object_t *h,
return status; return status;
memcpy (nds -> value, name, strlen (name)); memcpy (nds -> value, name, strlen (name));
return omapi_set_value (h, id, nds, value); status = omapi_set_value (h, id, nds, value);
omapi_data_string_dereference (&nds, MDL);
return status;
} }
isc_result_t omapi_set_boolean_value (omapi_object_t *h, omapi_object_t *id, isc_result_t omapi_set_boolean_value (omapi_object_t *h, omapi_object_t *id,
@ -504,9 +506,12 @@ isc_result_t omapi_get_value_str (omapi_object_t *h,
for (outer = h; outer -> outer; outer = outer -> outer) for (outer = h; outer -> outer; outer = outer -> outer)
; ;
if (outer -> type -> get_value) if (outer -> type -> get_value)
return (*(outer -> type -> get_value)) (outer, status = (*(outer -> type -> get_value)) (outer,
id, nds, value); id, nds, value);
return ISC_R_NOTFOUND; else
status = ISC_R_NOTFOUND;
omapi_data_string_dereference (&nds, MDL);
return status;
} }
isc_result_t omapi_stuff_values (omapi_object_t *c, isc_result_t omapi_stuff_values (omapi_object_t *c,

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: bootp.c,v 1.69 2001/02/12 20:51:26 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; "$Id: bootp.c,v 1.70 2001/05/17 19:04:03 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -341,7 +341,6 @@ void bootp (packet)
/* We're done with the option state. */ /* We're done with the option state. */
option_state_dereference (&options, MDL); option_state_dereference (&options, MDL);
static_lease_dereference (lease, MDL);
/* Set up the hardware destination address... */ /* Set up the hardware destination address... */
hto.hbuf [0] = packet -> raw -> htype; hto.hbuf [0] = packet -> raw -> htype;
@ -403,10 +402,8 @@ void bootp (packet)
out: out:
if (options) if (options)
option_state_dereference (&options, MDL); option_state_dereference (&options, MDL);
if (lease) { if (lease)
static_lease_dereference (lease, MDL);
lease_dereference (&lease, MDL); lease_dereference (&lease, MDL);
}
if (hp) if (hp)
host_dereference (&hp, MDL); host_dereference (&hp, MDL);
if (host) if (host)

View File

@ -43,11 +43,12 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: db.c,v 1.63 2001/03/15 23:21:25 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; "$Id: db.c,v 1.64 2001/05/17 19:04:04 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
#include <ctype.h> #include <ctype.h>
#include "version.h"
FILE *db_file; FILE *db_file;
@ -741,7 +742,9 @@ void new_lease_file ()
"confusing to you, we sincerely\n"); "confusing to you, we sincerely\n");
fprintf (db_file, "# apologize. Seriously, though - don't ask.\n"); fprintf (db_file, "# apologize. Seriously, though - don't ask.\n");
fprintf (db_file, "# The format of this file is documented in the %s", fprintf (db_file, "# The format of this file is documented in the %s",
"dhcpd.leases(5) manual page.\n\n"); "dhcpd.leases(5) manual page.\n");
fprintf (db_file, "# This lease file was written by isc-dhcp-%s\n\n",
DHCP_VERSION);
/* Write out all the leases that we know of... */ /* Write out all the leases that we know of... */
counting = 0; counting = 0;

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: dhcp.c,v 1.192 2001/05/03 18:22:58 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; "$Id: dhcp.c,v 1.193 2001/05/17 19:04:05 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -476,6 +476,16 @@ void dhcprequest (packet, ms_nulltp, ip_lease)
goto out; goto out;
} }
} }
/* Don't let a client allocate a lease using DHCPREQUEST
if the lease isn't ours to allocate. */
if ((lease -> binding_state == FTS_FREE &&
peer -> i_am == secondary) ||
(lease -> binding_state == FTS_BACKUP &&
peer -> i_am == primary)) {
log_debug ("%s: expired", msgbuf);
goto out;
}
} else } else
peer = (dhcp_failover_state_t *)0; peer = (dhcp_failover_state_t *)0;
#endif #endif
@ -1579,7 +1589,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
d1.data [0]); d1.data [0]);
data_string_forget (&d1, MDL); data_string_forget (&d1, MDL);
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
return; return;
} }
data_string_forget (&d1, MDL); data_string_forget (&d1, MDL);
@ -1639,7 +1648,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
if (!ignorep) if (!ignorep)
log_info ("%s: unknown client", msg); log_info ("%s: unknown client", msg);
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
return; return;
} }
@ -1656,7 +1664,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
if (!ignorep) if (!ignorep)
log_info ("%s: bootp disallowed", msg); log_info ("%s: bootp disallowed", msg);
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
return; return;
} }
@ -1673,7 +1680,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
if (!ignorep) if (!ignorep)
log_info ("%s: booting disallowed", msg); log_info ("%s: booting disallowed", msg);
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
return; return;
} }
@ -1710,7 +1716,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
msg); msg);
free_lease_state (state, MDL); free_lease_state (state, MDL);
/* XXX probably not necessary: */ /* XXX probably not necessary: */
static_lease_dereference (lease, MDL);
return; return;
} }
} }
@ -1743,7 +1748,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
log_info ("%s: can't allocate temporary lease structure: %s", log_info ("%s: can't allocate temporary lease structure: %s",
msg, isc_result_totext (result)); msg, isc_result_totext (result));
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
return; return;
} }
@ -2096,7 +2100,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
offer == DHCPACK, offer == DHCPACK)) { offer == DHCPACK, offer == DHCPACK)) {
log_info ("%s: database update failed", msg); log_info ("%s: database update failed", msg);
free_lease_state (state, MDL); free_lease_state (state, MDL);
static_lease_dereference (lease, MDL);
lease_dereference (&lt, MDL); lease_dereference (&lt, MDL);
return; return;
} }
@ -2475,7 +2478,6 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
++outstanding_pings; ++outstanding_pings;
} else { } else {
lease -> timestamp = cur_time; lease -> timestamp = cur_time;
static_lease_dereference (lease, MDL);
dhcp_reply (lease); dhcp_reply (lease);
} }
} }
@ -3366,38 +3368,6 @@ int mockup_lease (struct lease **lp, struct packet *packet,
return 1; return 1;
} }
/* Dereference all dynamically-allocated information that may be dangling
off of a static lease. Otherwise, once ack_lease returns, the information
dangling from the lease will be lost, so reference counts will be screwed
up and memory leaks will occur. */
void static_lease_dereference (lease, file, line)
struct lease *lease;
const char *file;
int line;
{
if (!(lease -> flags & STATIC_LEASE))
return;
if (lease -> on_release)
executable_statement_dereference (&lease -> on_release,
file, line);
if (lease -> on_expiry)
executable_statement_dereference (&lease -> on_expiry,
file, line);
if (lease -> on_commit)
executable_statement_dereference (&lease -> on_commit,
file, line);
if (lease -> scope)
binding_scope_dereference (&lease -> scope, file, line);
if (lease -> agent_options)
option_chain_head_dereference (&lease -> agent_options,
file, line);
if (lease -> uid != lease -> uid_buf) {
dfree (lease -> uid, file, line);
lease -> uid = (unsigned char *)0;
}
}
/* Look through all the pools in a list starting with the specified pool /* Look through all the pools in a list starting with the specified pool
for a free lease. We try to find a virgin lease if we can. If we for a free lease. We try to find a virgin lease if we can. If we
don't find a virgin lease, we try to find a non-virgin lease that's don't find a virgin lease, we try to find a non-virgin lease that's

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: failover.c,v 1.53 2001/05/03 18:31:28 mellon Exp $ Copyright (c) 1999-2001 The Internet Software Consortium. All rights reserved.\n"; "$Id: failover.c,v 1.54 2001/05/17 19:04:07 mellon Exp $ Copyright (c) 1999-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -1363,6 +1363,7 @@ isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *state,
case resolution_interrupted: case resolution_interrupted:
case partner_down: case partner_down:
case communications_interrupted: case communications_interrupted:
case recover:
/* Already in the right state? */ /* Already in the right state? */
if (state -> me.state == startup) if (state -> me.state == startup)
return (dhcp_failover_set_state return (dhcp_failover_set_state
@ -1373,14 +1374,6 @@ isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *state,
return dhcp_failover_set_state return dhcp_failover_set_state
(state, resolution_interrupted); (state, resolution_interrupted);
case recover:
/* XXX I don't think it makes sense to make a
XXX transition from recover to communications-
XXX interrupted, because then when the connect
XXX occurred, we'd make a transition into
XXX normal, not recover. */
break; /* Kim says stay in recover. */
case normal: case normal:
return dhcp_failover_set_state return dhcp_failover_set_state
(state, communications_interrupted); (state, communications_interrupted);
@ -1533,6 +1526,9 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
{ {
enum failover_state saved_state; enum failover_state saved_state;
TIME saved_stos; TIME saved_stos;
struct pool *p;
struct shared_network *s;
struct lease *l;
/* First make the transition out of the current state. */ /* First make the transition out of the current state. */
switch (state -> me.state) { switch (state -> me.state) {
@ -1658,6 +1654,27 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
dhcp_failover_send_update_request_all (state); dhcp_failover_send_update_request_all (state);
break; break;
case partner_down:
/* For every expired lease, set a timeout for it to become free. */
for (s = shared_networks; s; s = s -> next) {
for (p = s -> pools; p; p = p -> next) {
if (p -> failover_peer == state) {
for (l = p -> expired; l; l = l -> next)
l -> tsfp = state -> me.stos + state -> mclt;
if (p -> next_event_time >
state -> me.stos + state -> mclt) {
p -> next_event_time =
state -> me.stos + state -> mclt;
add_timeout (p -> next_event_time, pool_timer, p,
(tvref_t)pool_reference,
(tvunref_t)pool_dereference);
}
}
}
}
break;
default: default:
break; break;
} }
@ -2307,7 +2324,6 @@ int dhcp_failover_queue_ack (dhcp_failover_state_t *state,
(tvunref_t)dhcp_failover_state_dereference); (tvunref_t)dhcp_failover_state_dereference);
} }
return 1; return 1;
} }
@ -4234,13 +4250,13 @@ isc_result_t dhcp_failover_process_bind_update (dhcp_failover_state_t *state,
if (state -> me.state == normal) { if (state -> me.state == normal) {
new_binding_state = new_binding_state =
(normal_binding_state_transition_check (normal_binding_state_transition_check
(lease, state, (lease, state, msg -> binding_status,
msg -> binding_status)); msg -> potential_expiry));
} else { } else {
new_binding_state = new_binding_state =
(conflict_binding_state_transition_check (conflict_binding_state_transition_check
(lease, state, (lease, state, msg -> binding_status,
msg -> binding_status)); msg -> potential_expiry));
} }
if (new_binding_state != msg -> binding_status) { if (new_binding_state != msg -> binding_status) {
char outbuf [100]; char outbuf [100];
@ -4318,8 +4334,20 @@ isc_result_t dhcp_failover_process_bind_ack (dhcp_failover_state_t *state,
if (msg -> options_present & FTB_POTENTIAL_EXPIRY) { if (msg -> options_present & FTB_POTENTIAL_EXPIRY) {
/* XXX it could be a problem to do this directly if the /* XXX it could be a problem to do this directly if the
XXX lease is sorted by tsfp. */ XXX lease is sorted by tsfp. */
if (lease -> binding_state == FTS_EXPIRED) {
lease -> next_binding_state = FTS_FREE;
supersede_lease (lease, (struct lease *)0, 0, 1, 0);
write_lease (lease);
if (state -> me.state == normal)
commit_leases ();
} else {
lease -> tsfp = msg -> potential_expiry; lease -> tsfp = msg -> potential_expiry;
write_lease (lease); write_lease (lease);
#if 0 /* XXX This might be needed. */
if (state -> me.state == normal)
commit_leases ();
#endif
}
} }
unqueue: unqueue:
@ -4639,7 +4667,8 @@ int load_balance_mine (struct packet *packet, dhcp_failover_state_t *state)
binding_state_t binding_state_t
normal_binding_state_transition_check (struct lease *lease, normal_binding_state_transition_check (struct lease *lease,
dhcp_failover_state_t *state, dhcp_failover_state_t *state,
binding_state_t binding_state) binding_state_t binding_state,
u_int32_t tsfp)
{ {
binding_state_t new_state; binding_state_t new_state;
@ -4688,8 +4717,7 @@ normal_binding_state_transition_check (struct lease *lease,
case FTS_BACKUP: case FTS_BACKUP:
/* Can't set a lease to free or backup until the /* Can't set a lease to free or backup until the
peer agrees that it's expired. */ peer agrees that it's expired. */
/* XXX but have we updated tsfp yet? */ if (tsfp > cur_time) {
if (lease -> tsfp > cur_time) {
new_state = lease -> binding_state; new_state = lease -> binding_state;
goto out; goto out;
} }
@ -4716,8 +4744,7 @@ normal_binding_state_transition_check (struct lease *lease,
case FTS_BACKUP: case FTS_BACKUP:
/* Can't set a lease to free or backup until the /* Can't set a lease to free or backup until the
peer agrees that it's expired. */ peer agrees that it's expired. */
/* XXX but have we updated tsfp yet? */ if (tsfp > cur_time) {
if (lease -> tsfp > cur_time) {
new_state = lease -> binding_state; new_state = lease -> binding_state;
goto out; goto out;
} }
@ -4738,8 +4765,7 @@ normal_binding_state_transition_check (struct lease *lease,
case FTS_BACKUP: case FTS_BACKUP:
/* Can't set a lease to free or backup until the /* Can't set a lease to free or backup until the
peer agrees that it's expired. */ peer agrees that it's expired. */
/* XXX but have we updated tsfp yet? */ if (tsfp > cur_time) {
if (lease -> tsfp > cur_time) {
new_state = lease -> binding_state; new_state = lease -> binding_state;
goto out; goto out;
} }
@ -4758,10 +4784,9 @@ normal_binding_state_transition_check (struct lease *lease,
switch (binding_state) { switch (binding_state) {
case FTS_FREE: case FTS_FREE:
case FTS_BACKUP: case FTS_BACKUP:
/* XXX but have we updated tsfp yet? */
/* Can't set a lease to free or backup until the /* Can't set a lease to free or backup until the
peer agrees that it's expired. */ peer agrees that it's expired. */
if (lease -> tsfp > cur_time) { if (tsfp > cur_time) {
new_state = lease -> binding_state; new_state = lease -> binding_state;
goto out; goto out;
} }
@ -4811,7 +4836,8 @@ normal_binding_state_transition_check (struct lease *lease,
binding_state_t binding_state_t
conflict_binding_state_transition_check (struct lease *lease, conflict_binding_state_transition_check (struct lease *lease,
dhcp_failover_state_t *state, dhcp_failover_state_t *state,
binding_state_t binding_state) binding_state_t binding_state,
u_int32_t tsfp)
{ {
binding_state_t new_state; binding_state_t new_state;

View File

@ -43,7 +43,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: mdb.c,v 1.67 2001/05/02 07:09:36 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n"; "$Id: mdb.c,v 1.68 2001/05/17 19:04:08 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -821,6 +821,7 @@ int supersede_lease (comp, lease, commit, propogate, pimmediate)
requested *after* a DHCP lease has been assigned. */ requested *after* a DHCP lease has been assigned. */
if (lease -> binding_state != FTS_ABANDONED && if (lease -> binding_state != FTS_ABANDONED &&
lease -> next_binding_state != FTS_ABANDONED &&
(comp -> binding_state == FTS_ACTIVE || (comp -> binding_state == FTS_ACTIVE ||
comp -> binding_state == FTS_RESERVED || comp -> binding_state == FTS_RESERVED ||
comp -> binding_state == FTS_BOOTP) && comp -> binding_state == FTS_BOOTP) &&
@ -1066,7 +1067,7 @@ int supersede_lease (comp, lease, commit, propogate, pimmediate)
and the expiry code sets the timer if there's anything left and the expiry code sets the timer if there's anything left
to expire after it's run any outstanding expiry events on to expire after it's run any outstanding expiry events on
the pool. */ the pool. */
if (commit && if ((commit || !pimmediate) &&
comp -> sort_time != MIN_TIME && comp -> sort_time != MIN_TIME &&
comp -> sort_time > cur_time && comp -> sort_time > cur_time &&
(comp -> sort_time < comp -> pool -> next_event_time || (comp -> sort_time < comp -> pool -> next_event_time ||
@ -1215,6 +1216,15 @@ void make_binding_state_transition (struct lease *lease)
case FTS_ABANDONED: case FTS_ABANDONED:
case FTS_RESET: case FTS_RESET:
lease -> next_binding_state = FTS_FREE; lease -> next_binding_state = FTS_FREE;
/* If we are not in partner_down, leases don't go from
EXPIRED to FREE on a timeout - only on an update.
If we're in partner_down, they expire at mclt past
the time we entered partner_down. */
if (lease -> pool -> failover_peer &&
lease -> pool -> failover_peer -> me.state == partner_down)
lease -> tsfp =
(lease -> pool -> failover_peer -> me.stos +
lease -> pool -> failover_peer -> mclt);
break; break;
case FTS_FREE: case FTS_FREE:
@ -1446,6 +1456,21 @@ void pool_timer (vpool)
if (!*(lptr [i])) if (!*(lptr [i]))
continue; continue;
#if defined (FAILOVER_PROTOCOL)
if (pool -> failover_peer &&
pool -> failover_peer -> me.state != partner_down) {
/* The secondary can't remove a lease from the
active state except in partner_down. */
if (i == ACTIVE_LEASES &&
pool -> failover_peer -> i_am == secondary)
continue;
/* Leases in an expired state don't move to
free because of a timeout unless we're in
partner_down. */
if (i == EXPIRED_LEASES)
continue;
}
#endif
lease_reference (&lease, *(lptr [i]), MDL); lease_reference (&lease, *(lptr [i]), MDL);
while (lease) { while (lease) {

View File

@ -3,7 +3,7 @@
OMAPI object interfaces for the DHCP server. */ OMAPI object interfaces for the DHCP server. */
/* /*
* Copyright (c) 1999-2000 Internet Software Consortium. * Copyright (c) 1999-2001 Internet Software Consortium.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -50,7 +50,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: omapi.c,v 1.46 2001/05/02 07:11:38 mellon Exp $ Copyright (c) 1999-2000 The Internet Software Consortium. All rights reserved.\n"; "$Id: omapi.c,v 1.47 2001/05/17 19:04:09 mellon Exp $ Copyright (c) 1999-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -354,35 +354,43 @@ isc_result_t dhcp_lease_destroy (omapi_object_t *h, const char *file, int line)
return ISC_R_INVALIDARG; return ISC_R_INVALIDARG;
lease = (struct lease *)h; lease = (struct lease *)h;
if (lease -> uid)
uid_hash_delete (lease); uid_hash_delete (lease);
hw_hash_delete (lease); hw_hash_delete (lease);
if (lease -> billing_class)
class_dereference if (lease -> on_release)
(&lease -> billing_class, file, line); executable_statement_dereference (&lease -> on_release,
if (lease -> uid && lease -> uid != &lease -> uid_buf [0]) { file, line);
dfree (lease -> uid, MDL);
lease -> uid = &lease -> uid_buf [0];
lease -> uid_len = 0;
}
if (lease -> client_hostname) {
dfree (lease -> client_hostname, MDL);
lease -> client_hostname = (char *)0;
}
if (lease -> host)
host_dereference (&lease -> host, file, line);
if (lease -> subnet)
subnet_dereference (&lease -> subnet, file, line);
if (lease -> pool)
pool_dereference (&lease -> pool, file, line);
if (lease -> on_expiry) if (lease -> on_expiry)
executable_statement_dereference (&lease -> on_expiry, executable_statement_dereference (&lease -> on_expiry,
file, line); file, line);
if (lease -> on_commit) if (lease -> on_commit)
executable_statement_dereference (&lease -> on_commit, executable_statement_dereference (&lease -> on_commit,
file, line); file, line);
if (lease -> on_release) if (lease -> scope)
executable_statement_dereference (&lease -> on_release, binding_scope_dereference (&lease -> scope, file, line);
if (lease -> agent_options)
option_chain_head_dereference (&lease -> agent_options,
file, line); file, line);
if (lease -> uid && lease -> uid != lease -> uid_buf) {
dfree (lease -> uid, MDL);
lease -> uid = &lease -> uid_buf [0];
lease -> uid_len = 0;
}
if (lease -> client_hostname) {
dfree (lease -> client_hostname, MDL);
lease -> client_hostname = (char *)0;
}
if (lease -> host)
host_dereference (&lease -> host, file, line);
if (lease -> subnet)
subnet_dereference (&lease -> subnet, file, line);
if (lease -> pool)
pool_dereference (&lease -> pool, file, line);
if (lease -> state) { if (lease -> state) {
free_lease_state (lease -> state, file, line); free_lease_state (lease -> state, file, line);
lease -> state = (struct lease_state *)0; lease -> state = (struct lease_state *)0;
@ -390,6 +398,11 @@ isc_result_t dhcp_lease_destroy (omapi_object_t *h, const char *file, int line)
cancel_timeout (lease_ping_timeout, lease); cancel_timeout (lease_ping_timeout, lease);
--outstanding_pings; /* XXX */ --outstanding_pings; /* XXX */
} }
if (lease -> billing_class)
class_dereference
(&lease -> billing_class, file, line);
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
} }