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