| /** | |
| * This file has no copyright assigned and is placed in the Public Domain. | |
| * This file is part of the mingw-w64 runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. | |
| */ | |
| #include <windows.h> | |
| #include <time.h> | |
| #include "__tm_to_secs.h" | |
| static __time64_t __cdecl emu__mktime64(struct tm *tmptr) | |
| { | |
| __time64_t time64; | |
| struct tm *tmptr2; | |
| int tm_isdst; | |
| long local_dstbias; | |
| long local_timezone; | |
| /* _tzset() initialize _daylight, _dstbias and _timezone variables, | |
| * so it needs to be called before accessing those variables. | |
| * If those variables are already initialized then _tzset() does | |
| * not need to be called again. As _tzset() is an expensive call, | |
| * guard repeated calls by static variable. As the _tzset() is a | |
| * thread-safe call, the race condition is not a problem. | |
| */ | |
| { | |
| static long tzset_called = 0; | |
| if (!tzset_called) { | |
| _tzset(); | |
| (void)InterlockedExchange(&tzset_called, 1); | |
| } | |
| } | |
| local_dstbias = *__dstbias(); | |
| local_timezone = *__timezone(); | |
| tm_isdst = tmptr->tm_isdst; | |
| time64 = __tm_to_secs(tmptr); | |
| time64 += local_timezone; | |
| tmptr2 = _localtime64(&time64); | |
| if (!tmptr2) | |
| return -1; | |
| if (tm_isdst > 0 || (tm_isdst < 0 && tmptr2->tm_isdst > 0)) { | |
| time64 += local_dstbias; | |
| tmptr2 = _localtime64(&time64); | |
| if (!tmptr2) | |
| return -1; | |
| } | |
| *tmptr = *tmptr2; | |
| return time64; | |
| } | |
| #define RETT __time64_t | |
| #define FUNC _mktime64 | |
| #define ARGS struct tm *tmptr | |
| #define CALL tmptr | |
| #include "msvcrt_or_emu_glue.h" |