From: Kees Monshouwer Date: Wed, 14 Aug 2013 23:41:21 +0000 (+0200) Subject: do right timezones right X-Git-Tag: auth-3.3.1~17 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e4faf74a76768438dc32854e5cc19290d71a222d;p=pdns do right timezones right --- diff --git a/pdns/rcpgenerator.cc b/pdns/rcpgenerator.cc index 55295dc64..bf377010c 100644 --- a/pdns/rcpgenerator.cc +++ b/pdns/rcpgenerator.cc @@ -451,7 +451,7 @@ void RecordTextWriter::xfrTime(const uint32_t& val) struct tm tm; time_t time=val; // Y2038 bug! #ifndef WIN32 - gmtime_r(&time, &tm); + Utility::gmtime_r(&time, &tm); #else struct tm* tmptr; tmptr=gmtime(&time); diff --git a/pdns/unix_utility.cc b/pdns/unix_utility.cc index 862e0587d..679132f41 100644 --- a/pdns/unix_utility.cc +++ b/pdns/unix_utility.cc @@ -277,3 +277,28 @@ time_t Utility::timegm(struct tm *const t) return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec; } +void Utility::gmtime_r(const time_t *timer, struct tm *tmbuf) { + + int monthdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + int days = *timer / 86400; + int leapdays = (days + 671) / 1461; + int leapydays = (days + 365) / 1461; + + tmbuf->tm_hour = *timer / 3600 % 24; + tmbuf->tm_min = *timer / 60 % 60; + tmbuf->tm_sec = *timer % 60; + + tmbuf->tm_year = (days - leapdays) / 365 + 70; + tmbuf->tm_yday = days - leapydays - (tmbuf->tm_year - 70) * 365 + 1; + + tmbuf->tm_mon = 0; + tmbuf->tm_mday = tmbuf->tm_yday; + monthdays[1] += isleap(tmbuf->tm_year + 1900); + while (monthdays[tmbuf->tm_mon] < tmbuf->tm_mday) { + tmbuf->tm_mday -= monthdays[tmbuf->tm_mon]; + tmbuf->tm_mon++; + } + + tmbuf->tm_wday = (days + 4) % 7; // Day 0 is magic thursday ;) + tmbuf->tm_isdst = 0; +} diff --git a/pdns/utility.hh b/pdns/utility.hh index a517bf473..eaa1846e7 100644 --- a/pdns/utility.hh +++ b/pdns/utility.hh @@ -208,7 +208,8 @@ public: static void usleep( unsigned long usec ); static time_t timegm(struct tm *tm); - + + static void gmtime_r(const time_t *timer, struct tm *tmbuf); };