diff options
author | Igor Sysoev <igor@sysoev.ru> | 2008-08-30 19:52:07 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2008-08-30 19:52:07 +0000 |
commit | fcb5a705dd24e1e0143802a92a70df7096f8d039 (patch) | |
tree | 195bcbb7f73d104e995b6750a249ffd64e859bf0 /src/os/unix | |
parent | d76eb9a8c8f9353a1fa7d311797ecaaf78748945 (diff) | |
download | nginx-fcb5a705dd24e1e0143802a92a70df7096f8d039.tar.gz nginx-fcb5a705dd24e1e0143802a92a70df7096f8d039.zip |
ngx_timezone_update()
Diffstat (limited to 'src/os/unix')
-rw-r--r-- | src/os/unix/ngx_time.c | 44 | ||||
-rw-r--r-- | src/os/unix/ngx_time.h | 1 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/os/unix/ngx_time.c b/src/os/unix/ngx_time.c index 927132da6..4ca8be672 100644 --- a/src/os/unix/ngx_time.c +++ b/src/os/unix/ngx_time.c @@ -8,6 +8,50 @@ #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) { diff --git a/src/os/unix/ngx_time.h b/src/os/unix/ngx_time.h index b31bd4753..5d9406cde 100644 --- a/src/os/unix/ngx_time.h +++ b/src/os/unix/ngx_time.h @@ -52,6 +52,7 @@ typedef struct tm ngx_tm_t; #endif +void ngx_timezone_update(void); void ngx_localtime(time_t s, ngx_tm_t *tm); void ngx_libc_localtime(time_t s, struct tm *tm); void ngx_libc_gmtime(time_t s, struct tm *tm); |