diff --git a/client/dhclient.c b/client/dhclient.c index 4e5546a..6085b8e 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -5398,6 +5398,12 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate, case server_awaken: state_reboot (client); break; + + case server_time_changed: + if (client->active){ + state_reboot (client); + } + break; } } } diff --git a/common/dispatch.c b/common/dispatch.c index d7fe200..8a24499 100644 --- a/common/dispatch.c +++ b/common/dispatch.c @@ -118,7 +118,6 @@ dispatch(void) * signal. It will return ISC_R_RELOAD in that * case. That is a normal behavior. */ - if (status == ISC_R_RELOAD) { /* * dhcp_set_control_state() will do the job. @@ -129,6 +128,16 @@ dispatch(void) if (status == ISC_R_SUCCESS) status = ISC_R_RELOAD; } + + + if (status == ISC_R_TIMESHIFTED){ + status = dhcp_set_control_state(server_time_changed, + server_time_changed); + status = ISC_R_RELOAD; + log_info ("System time has been changed. Unable to use existing leases. Restarting"); + // do nothing, restart context + }; + } while (status == ISC_R_RELOAD); log_fatal ("Dispatch routine failed: %s -- exiting", diff --git a/includes/dhcpd.h b/includes/dhcpd.h index 635c510..ec6c227 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -524,7 +524,8 @@ typedef enum { server_running = 1, server_shutdown = 2, server_hibernate = 3, - server_awaken = 4 + server_awaken = 4, + server_time_changed = 5 } control_object_state_t; typedef struct { diff --git a/server/dhcpd.c b/server/dhcpd.c index e06f6b4..778ef8d 100644 --- a/server/dhcpd.c +++ b/server/dhcpd.c @@ -1779,6 +1779,12 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate, { struct timeval tv; + if (newstate == server_time_changed){ + log_error ("System time has been changed. Leases information unreliable!"); + return ISC_R_SUCCESS; + } + + if (newstate != server_shutdown) return DHCP_R_INVALIDARG; /* Re-entry. */ -- 2.14.5