From ed3747d52ae5cdea8ed0af42046c03a50065d8c2 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 6 May 2014 20:42:21 +0200 Subject: [PATCH] ISC dhcpd reader: Don't add duplicate entries. --- src/isc.c | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/isc.c b/src/isc.c index c1de786..5106442 100644 --- a/src/isc.c +++ b/src/isc.c @@ -32,11 +32,14 @@ struct isc_dhcp_lease { struct isc_dhcp_lease* next; }; -static struct isc_dhcp_lease* dhcp_lease_new() { +static struct isc_dhcp_lease* dhcp_lease_new(const char* hostname) { struct isc_dhcp_lease* lease = whine_malloc(sizeof(*lease)); - lease->name = NULL; - lease->fqdn = NULL; + lease->name = strdup(hostname); + if (daemon->domain_suffix) { + asprintf(&lease->fqdn, "%s.%s", hostname, daemon->domain_suffix); + } + lease->expires = 0; lease->next = NULL; return lease; @@ -100,6 +103,19 @@ static time_t parse_lease_time(const char* token_date, const char* token_time) { return time; } +static struct isc_dhcp_lease* find_lease(const char* hostname, struct isc_dhcp_lease* leases) { + struct isc_dhcp_lease* lease = leases; + + while (lease) { + if (strcmp(hostname, lease->name) == 0) { + return lease; + } + lease = lease->next; + } + + return NULL; +} + static off_t lease_file_size = (off_t)0; static ino_t lease_file_inode = (ino_t)0; @@ -185,20 +201,26 @@ void load_dhcp(time_t now) { *dot = 0; } - struct isc_dhcp_lease* lease = dhcp_lease_new(); - lease->name = strdup(hostname); - lease->addr = host_address; - lease->expires = time_ends; - lease->next = NULL; + // Search for an existing lease in the list + // with the given host name and update the data + // if needed. + struct isc_dhcp_lease* lease = find_lease(hostname, leases); - if (daemon->domain_suffix) { - asprintf(&lease->fqdn, "%s.%s", hostname, daemon->domain_suffix); - } + // If no lease already exists, we create a new one + // and append it to the list. + if (!lease) { + lease = dhcp_lease_new(hostname); - if (leases) lease->next = leases; + leases = lease; + } - leases = lease; + // Only update more recent leases. + if (lease->expires > time_ends) + continue; + + lease->addr = host_address; + lease->expires = time_ends; } } } -- 2.39.2