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;
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;
*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;
}
}
}