From e4faf74a76768438dc32854e5cc19290d71a222d Mon Sep 17 00:00:00 2001 From: Kees Monshouwer Date: Thu, 15 Aug 2013 01:41:21 +0200 Subject: [PATCH] do right timezones right --- pdns/rcpgenerator.cc | 2 +- pdns/unix_utility.cc | 25 +++++++++++++++++++++++++ pdns/utility.hh | 3 ++- 3 files changed, 28 insertions(+), 2 deletions(-) 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); }; -- 2.49.0