]> git.kaiwu.me - nginx.git/commitdiff
ngx_timezone_update()
authorIgor Sysoev <igor@sysoev.ru>
Sat, 30 Aug 2008 19:52:07 +0000 (19:52 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Sat, 30 Aug 2008 19:52:07 +0000 (19:52 +0000)
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

index 725f54b49b404ab2f3aedd6be677dbb441998d3e..39d1e4c811c07b2bd0effffb2f667bb5bb547cd6 100644 (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);
index 99b25813b24040d872360aa72583dacc98787d84..3105beb47f4b8cf8241adb7e67c6129b04c1d752 100644 (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);
 }
 
index 927132da6961bb4b77a4f981b495294a02cdc4a6..4ca8be672494c204b2c91bf1d76169a46173d7c1 100644 (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)
 {
index b31bd475301ab8ad30128a533d0124c84def6e58..5d9406cdebc55ade2f82aa1c22bb839c370b27af 100644 (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);
index 225c38cf0c51a8a4161f86be055a7165b21a25b9..4f93841395991bb32e549b32b9a6d3cdbeac8613 100644 (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);