diff options
Diffstat (limited to 'common/compat.c')
-rw-r--r-- | common/compat.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/common/compat.c b/common/compat.c index 76847e0..0eb35f8 100644 --- a/common/compat.c +++ b/common/compat.c @@ -552,6 +552,61 @@ vasprintf (char **strp, #endif /* HAVE_VASPRINTF */ +#ifndef HAVE_GMTIME_R + +struct tm * +gmtime_r (const time_t *timep, + struct tm *result) +{ +#ifdef OS_WIN32 + /* + * On win32 gmtime() returns thread local storage, so we can + * just copy it out into the buffer without worrying about races. + */ + struct tm *tg; + tg = gmtime (timep); + if (!tg) + return NULL; + memcpy (result, tg, sizeof (struct tm)); + return result; +#else + #error Need either gmtime_r() function on Unix +#endif +} + +#endif /* HAVE_GMTIME_R */ + +#ifndef HAVE_TIMEGM + +time_t +timegm (struct tm *tm) +{ + time_t tl, tb; + struct tm tg; + + tl = mktime (tm); + if (tl == -1) { + tm->tm_hour--; + tl = mktime (tm); + if (tl == -1) + return -1; + tl += 3600; + } + gmtime_r (&tl, &tg); + tg.tm_isdst = 0; + tb = mktime (&tg); + if (tb == -1) { + tg.tm_hour--; + tb = mktime (&tg); + if (tb == -1) + return -1; + tb += 3600; + } + return (tl - (tb - tl)); +} + +#endif /* HAVE_TIMEGM */ + #if !defined(HAVE_MKDTEMP) || !defined(HAVE_MKSTEMP) #include <sys/stat.h> #include <fcntl.h> |