ngx_timezone_update()

This commit is contained in:
Igor Sysoev 2008-08-30 19:52:07 +00:00
parent d76eb9a8c8
commit fcb5a705dd
5 changed files with 58 additions and 4 deletions

View File

@ -47,6 +47,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
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_init_cycle(ngx_cycle_t *old_cycle)
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);

View File

@ -50,10 +50,6 @@ ngx_time_init(void)
ngx_cached_time = &cached_time[0];
#if !(NGX_WIN32)
tzset();
#endif
ngx_time_update(0, 0);
}

View File

@ -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)
{

View File

@ -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);

View File

@ -39,6 +39,8 @@ typedef FILETIME ngx_mtime_t;
#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);