Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 1 | |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 2 | /* |
Igor Sysoev | ff8da91 | 2004-09-29 16:00:49 +0000 | [diff] [blame] | 3 | * Copyright (C) Igor Sysoev |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 7 | #include <ngx_config.h> |
Igor Sysoev | d59a047 | 2003-11-10 21:09:22 +0000 | [diff] [blame] | 8 | #include <ngx_core.h> |
| 9 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 10 | |
Igor Sysoev | fcb5a70 | 2008-08-30 19:52:07 +0000 | [diff] [blame] | 11 | /* |
| 12 | * FreeBSD does not test /etc/localtime change, however, we can workaround it |
| 13 | * by calling tzset() with TZ and then without TZ to update timezone. |
| 14 | * The trick should work since FreeBSD 2.1.0. |
| 15 | * |
| 16 | * Linux does not test /etc/localtime change in localtime(), |
| 17 | * but may stat("/etc/localtime") several times in every strftime(), |
| 18 | * therefore we use it to update timezone. |
| 19 | * |
| 20 | * Solaris does not test /etc/TIMEZONE change too and no workaround available. |
| 21 | */ |
| 22 | |
| 23 | void |
| 24 | ngx_timezone_update(void) |
| 25 | { |
| 26 | #if (NGX_FREEBSD) |
| 27 | |
| 28 | if (getenv("TZ")) { |
| 29 | return; |
| 30 | } |
| 31 | |
| 32 | putenv("TZ=UTC"); |
| 33 | |
| 34 | tzset(); |
| 35 | |
| 36 | unsetenv("TZ"); |
| 37 | |
| 38 | tzset(); |
| 39 | |
| 40 | #elif (NGX_LINUX) |
| 41 | time_t s; |
| 42 | struct tm *t; |
| 43 | char buf[4]; |
| 44 | |
| 45 | s = time(0); |
| 46 | |
| 47 | t = localtime(&s); |
| 48 | |
| 49 | strftime(buf, 4, "%H", t); |
| 50 | |
| 51 | #endif |
| 52 | } |
| 53 | |
| 54 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 55 | void |
| 56 | ngx_localtime(time_t s, ngx_tm_t *tm) |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 57 | { |
Igor Sysoev | f690604 | 2004-11-25 16:17:31 +0000 | [diff] [blame] | 58 | #if (NGX_HAVE_LOCALTIME_R) |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 59 | (void) localtime_r(&s, tm); |
Igor Sysoev | d59a047 | 2003-11-10 21:09:22 +0000 | [diff] [blame] | 60 | |
Igor Sysoev | 27c30f9 | 2003-11-11 18:13:43 +0000 | [diff] [blame] | 61 | #else |
| 62 | ngx_tm_t *t; |
| 63 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 64 | t = localtime(&s); |
Igor Sysoev | 27c30f9 | 2003-11-11 18:13:43 +0000 | [diff] [blame] | 65 | *tm = *t; |
| 66 | |
| 67 | #endif |
| 68 | |
Igor Sysoev | 5eef618 | 2002-12-15 21:08:04 +0000 | [diff] [blame] | 69 | tm->ngx_tm_mon++; |
| 70 | tm->ngx_tm_year += 1900; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 71 | } |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 72 | |
| 73 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 74 | void |
| 75 | ngx_libc_localtime(time_t s, struct tm *tm) |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 76 | { |
| 77 | #if (NGX_HAVE_LOCALTIME_R) |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 78 | (void) localtime_r(&s, tm); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 79 | |
| 80 | #else |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 81 | struct tm *t; |
| 82 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 83 | t = localtime(&s); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 84 | *tm = *t; |
| 85 | |
| 86 | #endif |
| 87 | } |
| 88 | |
| 89 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 90 | void |
| 91 | ngx_libc_gmtime(time_t s, struct tm *tm) |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 92 | { |
| 93 | #if (NGX_HAVE_LOCALTIME_R) |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 94 | (void) gmtime_r(&s, tm); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 95 | |
| 96 | #else |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 97 | struct tm *t; |
| 98 | |
Igor Sysoev | c2068d0 | 2005-10-19 12:33:58 +0000 | [diff] [blame] | 99 | t = gmtime(&s); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 100 | *tm = *t; |
| 101 | |
| 102 | #endif |
| 103 | } |