[PATCH] Only write leasefile if anything changed

Phil Sutter phil.sutter at viprinet.com
Tue May 8 14:09:34 UTC 2012


Also, move the check for changed leases to before the select(), so
changes will occur immediately instead only after select() returns the
next time.

Signed-off-by: Phil Sutter <phil.sutter at viprinet.com>
Signed-off-by: Nico Erfurth <nico.erfurth at viprinet.com>
---
 networking/udhcp/dhcpd.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index dd55e70..356c81f 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -298,6 +298,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 {
 	int server_socket = -1, retval, max_sock;
 	uint8_t *state;
+	uint8_t leases_changed = 0;
 	unsigned timeout_end;
 	unsigned num_ips;
 	unsigned opt;
@@ -389,6 +390,11 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 		uint32_t static_lease_nip;
 		struct dyn_lease *lease, fake_lease;
 
+		if (leases_changed) {
+			write_leases();
+			leases_changed = 0;
+		}
+
 		if (server_socket < 0) {
 			server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT,
 					server_config.interface);
@@ -405,7 +411,6 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 					server_config.auto_time ? &tv : NULL);
 		}
 		if (retval == 0) {
-			write_leases();
 			timeout_end = monotonic_sec() + server_config.auto_time;
 			continue;
 		}
@@ -591,6 +596,7 @@ o DHCPREQUEST generated during REBINDING state:
 				/* client requested or configured IP matches the lease.
 				 * ACK it, and bump lease expiration time. */
 				send_ACK(&packet, lease->lease_nip);
+				leases_changed = 1;
 				break;
 			}
 			/* No lease for this MAC, or lease IP != requested IP */
@@ -626,6 +632,7 @@ o DHCPREQUEST generated during REBINDING state:
 			) {
 				memset(lease->lease_mac, 0, sizeof(lease->lease_mac));
 				lease->expires = time(NULL) + server_config.decline_time;
+				leases_changed = 1;
 			}
 			break;
 
@@ -644,6 +651,7 @@ o DHCPREQUEST generated during REBINDING state:
 			 && packet.ciaddr == lease->lease_nip
 			) {
 				lease->expires = time(NULL);
+				leases_changed = 1;
 			}
 			break;
 
-- 
1.7.3.4



More information about the busybox mailing list