aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-08-30 19:52:07 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-08-30 19:52:07 +0000
commitfcb5a705dd24e1e0143802a92a70df7096f8d039 (patch)
tree195bcbb7f73d104e995b6750a249ffd64e859bf0
parentd76eb9a8c8f9353a1fa7d311797ecaaf78748945 (diff)
downloadnginx-fcb5a705dd24e1e0143802a92a70df7096f8d039.tar.gz
nginx-fcb5a705dd24e1e0143802a92a70df7096f8d039.zip
ngx_timezone_update()
-rw-r--r--src/core/ngx_cycle.c11
-rw-r--r--src/core/ngx_times.c4
-rw-r--r--src/os/unix/ngx_time.c44
-rw-r--r--src/os/unix/ngx_time.h1
-rw-r--r--src/os/win32/ngx_time.h2
5 files changed, 58 insertions, 4 deletions
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index 725f54b49..39d1e4c81 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -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);
diff --git a/src/core/ngx_times.c b/src/core/ngx_times.c
index 99b25813b..3105beb47 100644
--- a/src/core/ngx_times.c
+++ b/src/core/ngx_times.c
@@ -50,10 +50,6 @@ ngx_time_init(void)
ngx_cached_time = &cached_time[0];
-#if !(NGX_WIN32)
- tzset();
-#endif
-
ngx_time_update(0, 0);
}
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);
diff --git a/src/os/win32/ngx_time.h b/src/os/win32/ngx_time.h
index 225c38cf0..4f9384139 100644
--- a/src/os/win32/ngx_time.h
+++ b/src/os/win32/ngx_time.h
@@ -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);