| /* | |
| * 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 | |
| } |