From cfc6923c2015a377240fe14cc4ec983227c42912 Mon Sep 17 00:00:00 2001 From: Hleb Valoshka <375gnu@gmail.com> Date: Sat, 22 Sep 2018 17:34:26 +0300 Subject: [PATCH] Use localtime_r on all platforms to set TZ offset and name (Closes: #92) --- src/celestia/glutmain.cpp | 22 ++++++++-------------- src/celestia/qt/qtappwin.cpp | 16 +++++++--------- src/celutil/localtime.h | 24 ++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 23 deletions(-) create mode 100644 src/celutil/localtime.h diff --git a/src/celestia/glutmain.cpp b/src/celestia/glutmain.cpp index e5371bc02..97e96591e 100644 --- a/src/celestia/glutmain.cpp +++ b/src/celestia/glutmain.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include "celestiacore.h" @@ -517,21 +518,14 @@ int main(int argc, char* argv[]) appCore->initRenderer(); // Set the simulation starting time to the current system time - time_t curtime=time(nullptr); + time_t curtime = time(nullptr); appCore->start((double) curtime / 86400.0 + (double) astro::Date(1970, 1, 1)); - #ifdef MACOSX - /* localtime in Darwin is is reentrant only - equiv to Linux localtime_r() - should probably port !MACOSX code to use this too, available since - libc 5.2.5 according to manpage */ - struct tm *temptime=localtime(&curtime); - appCore->setTimeZoneBias(temptime->tm_gmtoff); - appCore->setTimeZoneName(temptime->tm_zone); - #else - localtime(&curtime); // Only doing this to set timezone as a side effect - appCore->setTimeZoneBias(-timezone); - appCore->setTimeZoneName(tzname[daylight?0:1]); - #endif + struct tm result; + if (localtime_r(&curtime, &result)) + { + appCore->setTimeZoneBias(result.tm_gmtoff); + appCore->setTimeZoneName(result.tm_zone); + } if (startfile == 1) { if (argv[argc - 1][0] == '-') { diff --git a/src/celestia/qt/qtappwin.cpp b/src/celestia/qt/qtappwin.cpp index bb0511472..fdfc9bab5 100644 --- a/src/celestia/qt/qtappwin.cpp +++ b/src/celestia/qt/qtappwin.cpp @@ -57,11 +57,11 @@ //#include "qtvideocapturedialog.h" #include "celestia/scriptmenu.h" #include "celestia/url.h" +#include "celutil/localtime.h" #include "qtbookmark.h" #if defined(_WIN32) #include "celestia/avicapture.h" - // TODO: Add Mac support #elif !defined(TARGET_OS_MAC) #ifdef THEORA @@ -1334,15 +1334,13 @@ void CelestiaAppWindow::createMenus() // Set up the default time zone name and offset from UTC time_t curtime = time(nullptr); m_appCore->start(astro::UTCtoTDB((double) curtime / 86400.0 + (double) astro::Date(1970, 1, 1))); - localtime(&curtime); // Only doing this to set timezone as a side effect -#ifdef TARGET_OS_MAC - CFTimeZoneRef tz = CFTimeZoneCopyDefault(); - m_appCore->setTimeZoneBias(-CFTimeZoneGetSecondsFromGMT(tz, CFAbsoluteTimeGetCurrent())+3600*daylight); - CFRelease(tz); -#else - m_appCore->setTimeZoneBias(-timezone + 3600 * daylight); -#endif + struct tm result; + if (localtime_r(&curtime, &result)) + { + m_appCore->setTimeZoneBias(result.tm_gmtoff); + m_appCore->setTimeZoneName(result.tm_zone); + } // If LocalTime is set to false, set the time zone bias to zero. if (settings.contains("LocalTime")) diff --git a/src/celutil/localtime.h b/src/celutil/localtime.h new file mode 100644 index 000000000..e0ccd4bca --- /dev/null +++ b/src/celutil/localtime.h @@ -0,0 +1,24 @@ +#ifndef LOCALTIME_H +#define LOCALTIME_H + +#ifdef _WIN32 +/* + Very dump implementation of localtime_r for Windows platform. +*/ +extern "C" { + struct tm *localtime_r(time_t *clock, struct tm *result) + { + struct tm *p = localtime(clock); + + if (p) + { + *result = *p; + return result; + } + + return NULL; + } +} +#endif + +#endif