81 lines
2.3 KiB
Diff
81 lines
2.3 KiB
Diff
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
|
|
|