diff --git a/bin/dig/dig.c b/bin/dig/dig.c index 5b09c7522b..e400edf8c4 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -337,11 +337,7 @@ received(unsigned int bytes, isc_sockaddr_t *from, dig_query_t *query) { } printf(";; SERVER: %s(%s)\n", fromtext, query->servname); time(&tnow); -#if !defined(WIN32) (void)localtime_r(&tnow, &tmnow); -#else /* if !defined(WIN32) */ - tmnow = *localtime(&tnow); -#endif /* if !defined(WIN32) */ #ifdef WIN32 /* diff --git a/bin/dnssec/dnssec-settime.c b/bin/dnssec/dnssec-settime.c index 041d1ca302..01d37186e1 100644 --- a/bin/dnssec/dnssec-settime.c +++ b/bin/dnssec/dnssec-settime.c @@ -127,15 +127,16 @@ printtime(dst_key_t *key, int type, const char *tag, bool epoch, FILE *stream) { } else if (epoch) { fprintf(stream, "%d\n", (int)when); } else { - time_t now = (time_t)when; -#ifdef _MSC_VER - struct tm *tm = localtime(&now); /* Thread specific. */ -#else + time_t now = when; struct tm t, *tm = localtime_r(&now, &t); -#endif unsigned int flen; char timebuf[80]; + if (tm == NULL) { + fprintf(stream, "INVALID\n"); + return; + } + flen = strftime(timebuf, sizeof(timebuf), "%a %b %e %H:%M:%S %Y", tm); INSIST(flen > 0U && flen < sizeof(timebuf)); diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c index 325af98c1e..4c5d28221d 100644 --- a/bin/dnssec/dnssec-signzone.c +++ b/bin/dnssec/dnssec-signzone.c @@ -3106,15 +3106,11 @@ writeset(const char *prefix, dns_rdatatype_t type) { static void print_time(FILE *fp) { time_t currenttime = time(NULL); -#ifdef _MSC_VER - struct tm *tm = localtime(¤ttime); /* Thread specific. */ -#else struct tm t, *tm = localtime_r(¤ttime, &t); -#endif unsigned int flen; char timebuf[80]; - if (outputformat != dns_masterformat_text) { + if (tm == NULL || outputformat != dns_masterformat_text) { return; } diff --git a/lib/dns/gen-win32.h b/lib/dns/gen-win32.h index 6d3cdf2e3e..31188558a8 100644 --- a/lib/dns/gen-win32.h +++ b/lib/dns/gen-win32.h @@ -62,6 +62,7 @@ #include #include #include +#include #include #include @@ -277,6 +278,16 @@ end_directory(isc_dir_t *dir) { } } +inline struct tm * +gmtime_r(const time_t *clock, struct tm *result) { + errno_t ret = gmtime_s(result, clock); + if (ret != 0) { + errno = ret; + return (NULL); + } + return (result); +} + ISC_LANG_ENDDECLS #endif /* DNS_GEN_WIN32_H */ diff --git a/lib/dns/gen.c b/lib/dns/gen.c index 2e31c61177..b922e0df9c 100644 --- a/lib/dns/gen.c +++ b/lib/dns/gen.c @@ -700,11 +700,7 @@ main(int argc, char **argv) { } if (now != -1) { -#ifdef _MSC_VER - struct tm *tm = gmtime(&now); /* Thread specific. */ -#else struct tm t, *tm = gmtime_r(&now, &t); -#endif if (tm != NULL && tm->tm_year > 104) { n = snprintf(year, sizeof(year), "-%d", diff --git a/lib/dns/update.c b/lib/dns/update.c index 6ba2fbd53a..e2a062e0c3 100644 --- a/lib/dns/update.c +++ b/lib/dns/update.c @@ -2191,14 +2191,10 @@ failure: static isc_stdtime_t epoch_to_yyyymmdd(time_t when) { - struct tm *tm; - -#if !defined(WIN32) - struct tm tm0; - tm = localtime_r(&when, &tm0); -#else /* if !defined(WIN32) */ - tm = localtime(&when); -#endif /* if !defined(WIN32) */ + struct tm t, *tm = localtime_r(&when, &t); + if (tm == NULL) { + return (0); + } return (((tm->tm_year + 1900) * 10000) + ((tm->tm_mon + 1) * 100) + tm->tm_mday); } diff --git a/lib/isc/win32/include/isc/time.h b/lib/isc/win32/include/isc/time.h index 7745e54874..f49c3a774c 100644 --- a/lib/isc/win32/include/isc/time.h +++ b/lib/isc/win32/include/isc/time.h @@ -12,6 +12,7 @@ #ifndef ISC_TIME_H #define ISC_TIME_H 1 +#include #include #include #include @@ -19,6 +20,30 @@ #include #include +/*** + *** POSIX Shims + ***/ + +inline struct tm * +gmtime_r(const time_t *clock, struct tm *result) { + errno_t ret = gmtime_s(result, clock); + if (ret != 0) { + errno = ret; + return (NULL); + } + return (result); +} + +inline struct tm * +localtime_r(const time_t *clock, struct tm *result) { + errno_t ret = localtime_s(result, clock); + if (ret != 0) { + errno = ret; + return (NULL); + } + return (result); +} + /*** *** Intervals ***/