]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
ISC DHCP reader: Simplify parsing dates.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 29 Apr 2014 10:09:08 +0000 (12:09 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 4 Feb 2016 23:37:54 +0000 (23:37 +0000)
src/isc.c

index 565e4e21f8222f1bd1548d960713a2e84dfc7fb2..c1de786e04a75844d469cc0240763094904a737a 100644 (file)
--- a/src/isc.c
+++ b/src/isc.c
@@ -77,28 +77,23 @@ static int next_token(char* token, int buffsize, FILE* fp) {
        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();
                }
        }
 
@@ -200,10 +195,10 @@ void load_dhcp(time_t now) {
                                                asprintf(&lease->fqdn, "%s.%s", hostname, daemon->domain_suffix);
                                        }
 
-                                       if (!leases)
-                                               leases = lease;
-                                       else
-                                               leases->next = lease;
+                                       if (leases)
+                                               lease->next = leases;
+
+                                       leases = lease;
                                }
                        }
                }