Issue #28148: Stop using localtime() and gmtime() in the time module.

Introduced platform independent _PyTime_localtime API that is similar
to POSIX localtime_r, but available on all platforms.  Patch by Ed
Schouten.
This commit is contained in:
Alexander Belopolsky 2016-09-28 17:31:35 -04:00
parent e5ccf3d699
commit 3e7a3cb903
5 changed files with 91 additions and 92 deletions

View file

@ -766,3 +766,55 @@ _PyTime_Init(void)
return 0;
}
int
_PyTime_localtime(time_t t, struct tm *tm)
{
#ifdef MS_WINDOWS
int error;
error = localtime_s(tm, &t);
if (error != 0) {
errno = error;
PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
return 0;
#else /* !MS_WINDOWS */
if (localtime_r(&t, tm) == NULL) {
#ifdef EINVAL
if (errno == 0)
errno = EINVAL;
#endif
PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
return 0;
#endif /* MS_WINDOWS */
}
int
_PyTime_gmtime(time_t t, struct tm *tm)
{
#ifdef MS_WINDOWS
int error;
error = gmtime_s(tm, &t);
if (error != 0) {
errno = error;
PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
return 0;
#else /* !MS_WINDOWS */
if (gmtime_r(&t, tm) == NULL) {
#ifdef EINVAL
if (errno == 0)
errno = EINVAL;
#endif
PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
return 0;
#endif /* MS_WINDOWS */
}