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