From 3da4cc02e3a32b2b7567ebba2bad2b685b77c052 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 7 May 2014 12:16:57 +0200 Subject: [PATCH] dnsmasq: Update ISC dhcpd reader patch. --- ...-support-to-read-ISC-DHCP-lease-file.patch | 99 +++++++++---------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/src/patches/dnsmasq-2.70-Add-support-to-read-ISC-DHCP-lease-file.patch b/src/patches/dnsmasq-2.70-Add-support-to-read-ISC-DHCP-lease-file.patch index 88eb6a217e..3194e1f229 100644 --- a/src/patches/dnsmasq-2.70-Add-support-to-read-ISC-DHCP-lease-file.patch +++ b/src/patches/dnsmasq-2.70-Add-support-to-read-ISC-DHCP-lease-file.patch @@ -1,18 +1,3 @@ -From b3c0d11d8bcf810b8f50f695ea36c8183fa4791a Mon Sep 17 00:00:00 2001 -From: Michael Tremer -Date: Mon, 28 Apr 2014 00:51:13 +0200 -Subject: [PATCH] Add support to read ISC DHCP lease file. - ---- - Makefile | 2 +- - src/cache.c | 13 +++- - src/dnsmasq.c | 5 ++ - src/dnsmasq.h | 5 ++ - src/isc.c | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - src/option.c | 2 +- - 6 files changed, 256 insertions(+), 5 deletions(-) - create mode 100644 src/isc.c - diff --git a/Makefile b/Makefile index 292c8bd..5e0cdbe 100644 --- a/Makefile @@ -110,10 +95,10 @@ index 3032546..a40b2a9 100644 +#endif diff --git a/src/isc.c b/src/isc.c new file mode 100644 -index 0000000..565e4e2 +index 0000000..5106442 --- /dev/null +++ b/src/isc.c -@@ -0,0 +1,234 @@ +@@ -0,0 +1,251 @@ +/* dnsmasq is Copyright (c) 2014 John Volpe, Simon Kelley and + Michael Tremer + @@ -148,11 +133,14 @@ index 0000000..565e4e2 + 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; @@ -193,34 +181,42 @@ index 0000000..565e4e2 + return count ? 1 : 0; +} + ++static long get_utc_offset() { ++ time_t t = time(NULL); ++ struct tm* time_struct = localtime(&t); ++ ++ return time_struct->tm_gmtoff; ++} ++ +static time_t parse_lease_time(const char* token_date, const char* token_time) { + time_t time = (time_t)(-1); + struct tm lease_time; + -+ static const int months[11] = {31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; -+ + if (sscanf(token_date, "%d/%d/%d", &lease_time.tm_year, &lease_time.tm_mon, &lease_time.tm_mday) == 3) { ++ lease_time.tm_year -= 1900; ++ lease_time.tm_mon -= 1; ++ + if (sscanf(token_time, "%d:%d:%d", &lease_time.tm_hour, &lease_time.tm_min, &lease_time.tm_sec) == 3) { -+ /* There doesn't seem to be a universally available library function -+ which converts broken-down _GMT_ time to seconds-in-epoch. -+ The following was borrowed from ISC dhcpd sources, where -+ it is noted that it might not be entirely accurate for odd seconds. -+ Since we're trying to get the same answer as dhcpd, that's just -+ fine here. */ -+ time = ((((((365 * (lease_time.tm_year - 1970) + -+ (lease_time.tm_year - 1969) / 4 + -+ (lease_time.tm_mon > 1 ? months[lease_time.tm_mon - 2] : 0) + -+ (lease_time.tm_mon > 2 && !((lease_time.tm_year - 1972) & 3 )) + -+ (lease_time.tm_mday - 1)) * 24) + -+ lease_time.tm_hour) * 60) + -+ lease_time.tm_mon) * 60) + -+ lease_time.tm_sec; ++ time = mktime(&lease_time) + get_utc_offset(); + } + } + + 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; + @@ -306,20 +302,26 @@ index 0000000..565e4e2 + *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; -+ else -+ leases->next = lease; ++ } ++ ++ // Only update more recent leases. ++ if (lease->expires > time_ends) ++ continue; ++ ++ lease->addr = host_address; ++ lease->expires = time_ends; + } + } + } @@ -361,6 +363,3 @@ index daa728f..d16c982 100644 case 'l': /* --dhcp-leasefile */ daemon->lease_file = opt_string_alloc(arg); break; --- -1.9.0 - -- 2.39.5