upstream nginx-0.7.31
[nginx.git] / nginx / src / os / unix / ngx_time.c
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9
10
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
55 void
56 ngx_localtime(time_t s, ngx_tm_t *tm)
57 {
58 #if (NGX_HAVE_LOCALTIME_R)
59     (void) localtime_r(&s, tm);
60
61 #else
62     ngx_tm_t  *t;
63
64     t = localtime(&s);
65     *tm = *t;
66
67 #endif
68
69     tm->ngx_tm_mon++;
70     tm->ngx_tm_year += 1900;
71 }
72
73
74 void
75 ngx_libc_localtime(time_t s, struct tm *tm)
76 {
77 #if (NGX_HAVE_LOCALTIME_R)
78     (void) localtime_r(&s, tm);
79
80 #else
81     struct tm  *t;
82
83     t = localtime(&s);
84     *tm = *t;
85
86 #endif
87 }
88
89
90 void
91 ngx_libc_gmtime(time_t s, struct tm *tm)
92 {
93 #if (NGX_HAVE_LOCALTIME_R)
94     (void) gmtime_r(&s, tm);
95
96 #else
97     struct tm  *t;
98
99     t = gmtime(&s);
100     *tm = *t;
101
102 #endif
103 }