]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
ISC dhcpd reader: Don't add duplicate entries.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 May 2014 18:42:21 +0000 (20:42 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 4 Feb 2016 23:37:54 +0000 (23:37 +0000)
src/isc.c

index c1de786e04a75844d469cc0240763094904a737a..51064426f17fd3b6153e6e71b3d3726825e0785e 100644 (file)
--- 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;
                                }
                        }
                }