Mercurial > hg > nginx
changeset 2220:bf38420c9e25
ngx_timezone_update()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sat, 30 Aug 2008 19:52:07 +0000 |
parents | fb84e3e95841 |
children | 78415b0469bc |
files | src/core/ngx_cycle.c src/core/ngx_times.c src/os/unix/ngx_time.c src/os/unix/ngx_time.h src/os/win32/ngx_time.h |
diffstat | 5 files changed, 58 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/core/ngx_cycle.c Fri Aug 29 13:43:38 2008 +0000 +++ b/src/core/ngx_cycle.c Sat Aug 30 19:52:07 2008 +0000 @@ -47,6 +47,7 @@ u_char *lock_file; ngx_uint_t i, n; ngx_log_t *log; + ngx_time_t *tp; ngx_conf_t conf; ngx_pool_t *pool; ngx_cycle_t *cycle, **old; @@ -59,6 +60,16 @@ ngx_core_module_t *module; char hostname[NGX_MAXHOSTNAMELEN]; + ngx_timezone_update(); + + /* force localtime update with a new timezone */ + + tp = ngx_timeofday(); + tp->sec = 0; + + ngx_time_update(0, 0); + + log = old_cycle->log; pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
--- a/src/core/ngx_times.c Fri Aug 29 13:43:38 2008 +0000 +++ b/src/core/ngx_times.c Sat Aug 30 19:52:07 2008 +0000 @@ -50,10 +50,6 @@ ngx_cached_time = &cached_time[0]; -#if !(NGX_WIN32) - tzset(); -#endif - ngx_time_update(0, 0); }
--- a/src/os/unix/ngx_time.c Fri Aug 29 13:43:38 2008 +0000 +++ b/src/os/unix/ngx_time.c Sat Aug 30 19:52:07 2008 +0000 @@ -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) {
--- a/src/os/unix/ngx_time.h Fri Aug 29 13:43:38 2008 +0000 +++ b/src/os/unix/ngx_time.h Sat Aug 30 19:52:07 2008 +0000 @@ -52,6 +52,7 @@ #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);
--- a/src/os/win32/ngx_time.h Fri Aug 29 13:43:38 2008 +0000 +++ b/src/os/win32/ngx_time.h Sat Aug 30 19:52:07 2008 +0000 @@ -39,6 +39,8 @@ #define NGX_HAVE_GETTIMEZONE 1 +#define ngx_timezone_update() + ngx_int_t ngx_gettimezone(void); void ngx_libc_localtime(time_t s, struct tm *tm); void ngx_libc_gmtime(time_t s, struct tm *tm);