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