mirror of
https://github.com/nginx/nginx.git
synced 2025-01-10 12:08:29 +08:00
104 lines
1.4 KiB
C
104 lines
1.4 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
*/
|
|
|
|
|
|
#include <ngx_config.h>
|
|
#include <ngx_core.h>
|
|
|
|
|
|
/*
|
|
* FreeBSD does not test /etc/localtime change, however, we can workaround it
|
|
* by calling tzset() with TZ and then without TZ to update timezone.
|
|
* The trick should work since FreeBSD 2.1.0.
|
|
*
|
|
* Linux does not test /etc/localtime change in localtime(),
|
|
* but may stat("/etc/localtime") several times in every strftime(),
|
|
* therefore we use it to update timezone.
|
|
*
|
|
* Solaris does not test /etc/TIMEZONE change too and no workaround available.
|
|
*/
|
|
|
|
void
|
|
ngx_timezone_update(void)
|
|
{
|
|
#if (NGX_FREEBSD)
|
|
|
|
if (getenv("TZ")) {
|
|
return;
|
|
}
|
|
|
|
putenv("TZ=UTC");
|
|
|
|
tzset();
|
|
|
|
unsetenv("TZ");
|
|
|
|
tzset();
|
|
|
|
#elif (NGX_LINUX)
|
|
time_t s;
|
|
struct tm *t;
|
|
char buf[4];
|
|
|
|
s = time(0);
|
|
|
|
t = localtime(&s);
|
|
|
|
strftime(buf, 4, "%H", t);
|
|
|
|
#endif
|
|
}
|
|
|
|
|
|
void
|
|
ngx_localtime(time_t s, ngx_tm_t *tm)
|
|
{
|
|
#if (NGX_HAVE_LOCALTIME_R)
|
|
(void) localtime_r(&s, tm);
|
|
|
|
#else
|
|
ngx_tm_t *t;
|
|
|
|
t = localtime(&s);
|
|
*tm = *t;
|
|
|
|
#endif
|
|
|
|
tm->ngx_tm_mon++;
|
|
tm->ngx_tm_year += 1900;
|
|
}
|
|
|
|
|
|
void
|
|
ngx_libc_localtime(time_t s, struct tm *tm)
|
|
{
|
|
#if (NGX_HAVE_LOCALTIME_R)
|
|
(void) localtime_r(&s, tm);
|
|
|
|
#else
|
|
struct tm *t;
|
|
|
|
t = localtime(&s);
|
|
*tm = *t;
|
|
|
|
#endif
|
|
}
|
|
|
|
|
|
void
|
|
ngx_libc_gmtime(time_t s, struct tm *tm)
|
|
{
|
|
#if (NGX_HAVE_LOCALTIME_R)
|
|
(void) gmtime_r(&s, tm);
|
|
|
|
#else
|
|
struct tm *t;
|
|
|
|
t = gmtime(&s);
|
|
*tm = *t;
|
|
|
|
#endif
|
|
}
|