2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-31 06:15:55 +00:00

Merge changes between 3.0rc7 and 3.0rc8pl2.

This commit is contained in:
Ted Lemon
2001-06-27 00:31:20 +00:00
parent 07b958004f
commit d758ad8cac
99 changed files with 5909 additions and 2698 deletions

View File

@@ -43,7 +43,7 @@
#ifndef lint
static char ocopyright[] =
"$Id: dhcpd.c,v 1.115 2001/05/02 07:08:15 mellon Exp $ Copyright 1995-2001 Internet Software Consortium.";
"$Id: dhcpd.c,v 1.116 2001/06/27 00:31:09 mellon Exp $ Copyright 1995-2001 Internet Software Consortium.";
#endif
static char copyright[] =
@@ -181,6 +181,29 @@ static isc_result_t verify_auth (omapi_object_t *p, omapi_auth_key_t *a) {
return ISC_R_SUCCESS;
}
static void omapi_listener_start (void *foo)
{
omapi_object_t *listener;
isc_result_t result;
listener = (omapi_object_t *)0;
result = omapi_generic_new (&listener, MDL);
if (result != ISC_R_SUCCESS)
log_fatal ("Can't allocate new generic object: %s",
isc_result_totext (result));
result = omapi_protocol_listen (listener,
(unsigned)omapi_port, 1);
if (result == ISC_R_SUCCESS && omapi_key)
result = omapi_protocol_configure_security
(listener, verify_addr, verify_auth);
if (result != ISC_R_SUCCESS) {
log_error ("Can't start OMAPI protocol: %s",
isc_result_totext (result));
add_timeout (cur_time + 5, omapi_listener_start, 0, 0, 0);
}
omapi_object_dereference (&listener, MDL);
}
int main (argc, argv, envp)
int argc;
char **argv, **envp;
@@ -199,7 +222,6 @@ int main (argc, argv, envp)
int quiet = 0;
char *server = (char *)0;
isc_result_t result;
omapi_object_t *listener;
unsigned seed;
struct interface_info *ip;
struct parse *parse;
@@ -461,6 +483,13 @@ int main (argc, argv, envp)
log_fatal (" lease file when playing back a trace. **");
}
trace_file_replay (traceinfile);
#if defined (DEBUG_MEMORY_LEAKAGE) || \
defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
free_everything ();
omapi_print_dmalloc_usage_by_caller ();
#endif
exit (0);
}
#endif
@@ -469,12 +498,12 @@ int main (argc, argv, envp)
if (readconf () != ISC_R_SUCCESS)
log_fatal ("Configuration file errors encountered -- exiting");
postconf_initialization (quiet);
/* test option should cause an early exit */
if (cftest && !lftest)
exit(0);
postconf_initialization (quiet);
group_write_hook = group_writer;
/* Start up the database... */
@@ -503,28 +532,7 @@ int main (argc, argv, envp)
#if defined (TRACING)
trace_seed_stash (trace_srandom, seed + cur_time);
#endif
/* Start up a listener for the object management API protocol. */
if (omapi_port != -1) {
listener = (omapi_object_t *)0;
result = omapi_generic_new (&listener, MDL);
if (result != ISC_R_SUCCESS)
log_fatal ("Can't allocate new generic object: %s",
isc_result_totext (result));
result = omapi_protocol_listen (listener,
(unsigned)omapi_port, 1);
if (result == ISC_R_SUCCESS && omapi_key)
result = omapi_protocol_configure_security
(listener, verify_addr, verify_auth);
if (result != ISC_R_SUCCESS)
log_fatal ("Can't start OMAPI protocol: %s",
isc_result_totext (result));
}
#if defined (FAILOVER_PROTOCOL)
/* Start the failover protocol. */
dhcp_failover_startup ();
#endif
postdb_startup ();
#ifndef DEBUG
if (daemon) {
@@ -588,7 +596,8 @@ int main (argc, argv, envp)
}
#endif /* !DEBUG */
#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \
defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
dmalloc_cutoff_generation = dmalloc_generation;
dmalloc_longterm = dmalloc_outstanding;
dmalloc_outstanding = 0;
@@ -598,6 +607,9 @@ int main (argc, argv, envp)
dump_rc_history ();
#endif
omapi_set_int_value ((omapi_object_t *)dhcp_control_object,
(omapi_object_t *)0, "state", server_running);
/* Receive packets and dispatch them... */
dispatch ();
@@ -687,7 +699,8 @@ void postconf_initialization (int quiet)
result = omapi_auth_key_lookup_name (&omapi_key, s);
dfree (s, MDL);
if (result != ISC_R_SUCCESS)
log_fatal ("Invalid OMAPI key: %s", s);
log_fatal ("OMAPI key %s: %s",
s, isc_result_totext (result));
}
oc = lookup_option (&server_universe, options, SV_LOCAL_PORT);
@@ -852,6 +865,19 @@ void postconf_initialization (int quiet)
#endif
}
void postdb_startup (void)
{
/* Initialize the omapi listener state. */
if (omapi_port != -1) {
omapi_listener_start (0);
}
#if defined (FAILOVER_PROTOCOL)
/* Initialize the failover listener state. */
dhcp_failover_startup ();
#endif
}
/* Print usage message. */
static void usage ()
@@ -938,7 +964,7 @@ void lease_ping_timeout (vlp)
dmalloc_outstanding - previous_outstanding,
dmalloc_outstanding, dmalloc_longterm);
#endif
#if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL)
#if defined (DEBUG_MEMORY_LEAKAGE)
dmalloc_dump_outstanding ();
#endif
}
@@ -970,7 +996,7 @@ int dhcpd_interface_setup_hook (struct interface_info *ip, struct iaddr *ia)
/* If this interface has multiple aliases on the same
subnet, ignore all but the first we encounter. */
if (!subnet -> interface) {
subnet -> interface = ip;
interface_reference (&subnet -> interface, ip, MDL);
subnet -> interface_address = *ia;
} else if (subnet -> interface != ip) {
log_error ("Multiple interfaces match the %s: %s %s",
@@ -995,6 +1021,150 @@ int dhcpd_interface_setup_hook (struct interface_info *ip, struct iaddr *ia)
"same shared network",
share -> interface -> name, ip -> name);
}
subnet_dereference (&subnet, MDL);
}
return 1;
}
static TIME shutdown_time;
static int omapi_connection_count;
enum dhcp_shutdown_state shutdown_state;
isc_result_t dhcp_io_shutdown (omapi_object_t *obj, void *foo)
{
/* Shut down all listeners. */
if (shutdown_state == shutdown_listeners &&
obj -> type == omapi_type_listener &&
obj -> inner &&
obj -> inner -> type == omapi_type_protocol_listener) {
omapi_listener_destroy (obj, MDL);
return ISC_R_SUCCESS;
}
/* Shut down all existing omapi connections. */
if (obj -> type == omapi_type_connection &&
obj -> inner &&
obj -> inner -> type == omapi_type_protocol) {
if (shutdown_state == shutdown_drop_omapi_connections) {
omapi_disconnect (obj, 1);
}
omapi_connection_count++;
if (shutdown_state == shutdown_omapi_connections) {
omapi_disconnect (obj, 0);
return ISC_R_SUCCESS;
}
}
/* Shutdown all DHCP interfaces. */
if (obj -> type == dhcp_type_interface &&
shutdown_state == shutdown_dhcp) {
dhcp_interface_remove (obj, (omapi_object_t *)0);
return ISC_R_SUCCESS;
}
return ISC_R_SUCCESS;
}
static isc_result_t dhcp_io_shutdown_countdown (void *vlp)
{
dhcp_failover_state_t *state;
#if defined (FAILOVER_PROTOCOL)
int failover_connection_count = 0;
#endif
oncemore:
if (shutdown_state == shutdown_listeners ||
shutdown_state == shutdown_omapi_connections ||
shutdown_state == shutdown_drop_omapi_connections ||
shutdown_state == shutdown_dhcp) {
omapi_connection_count = 0;
omapi_io_state_foreach (dhcp_io_shutdown, 0);
}
if ((shutdown_state == shutdown_listeners ||
shutdown_state == shutdown_omapi_connections ||
shutdown_state == shutdown_drop_omapi_connections) &&
omapi_connection_count == 0) {
shutdown_state = shutdown_dhcp;
shutdown_time = cur_time;
goto oncemore;
} else if (shutdown_state == shutdown_listeners &&
cur_time - shutdown_time > 4) {
shutdown_state = shutdown_omapi_connections;
shutdown_time = cur_time;
} else if (shutdown_state == shutdown_omapi_connections &&
cur_time - shutdown_time > 4) {
shutdown_state = shutdown_drop_omapi_connections;
shutdown_time = cur_time;
} else if (shutdown_state == shutdown_drop_omapi_connections &&
cur_time - shutdown_time > 4) {
shutdown_state = shutdown_dhcp;
shutdown_time = cur_time;
goto oncemore;
} else if (shutdown_state == shutdown_dhcp &&
cur_time - shutdown_time > 4) {
shutdown_state = shutdown_done;
shutdown_time = cur_time;
}
#if defined (FAILOVER_PROTOCOL)
/* Set all failover peers into the shutdown state. */
if (shutdown_state == shutdown_dhcp) {
for (state = failover_states; state; state = state -> next) {
if (state -> me.state == normal) {
dhcp_failover_set_state (state, shut_down);
failover_connection_count++;
}
if (state -> me.state == shut_down &&
state -> partner.state != partner_down)
failover_connection_count++;
}
}
if (shutdown_state == shutdown_done) {
for (state = failover_states; state; state = state -> next) {
if (state -> me.state == shut_down) {
if (state -> link_to_peer)
dhcp_failover_link_dereference (&state -> link_to_peer,
MDL);
dhcp_failover_set_state (state, recover);
}
}
#if defined (DEBUG_MEMORY_LEAKAGE) || \
defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
free_everything ();
omapi_print_dmalloc_usage_by_caller ();
#endif
exit (0);
}
#else
if (shutdown_state == shutdown_done) {
#if defined (DEBUG_MEMORY_LEAKAGE) || \
defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
free_everything ();
omapi_print_dmalloc_usage_by_caller ();
#endif
exit (0);
}
#endif
if (shutdown_state == shutdown_dhcp &&
!failover_connection_count) {
shutdown_state = shutdown_done;
shutdown_time = cur_time;
goto oncemore;
}
add_timeout (cur_time + 1,
(void (*)(void *))dhcp_io_shutdown_countdown, 0, 0, 0);
return ISC_R_SUCCESS;
}
isc_result_t dhcp_set_control_state (control_object_state_t oldstate,
control_object_state_t newstate)
{
if (newstate == server_shutdown) {
shutdown_time = cur_time;
shutdown_state = shutdown_listeners;
dhcp_io_shutdown_countdown (0);
return ISC_R_SUCCESS;
}
return ISC_R_INVALIDARG;
}