blob: cc760b2eb01e247a87eda1600359cf7b0c82d680 [file] [log] [blame]
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#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)
{
#if (NGX_HAVE_LOCALTIME_R)
(void) localtime_r(&s, tm);
#else
ngx_tm_t *t;
t = localtime(&s);
*tm = *t;
#endif
tm->ngx_tm_mon++;
tm->ngx_tm_year += 1900;
}
void
ngx_libc_localtime(time_t s, struct tm *tm)
{
#if (NGX_HAVE_LOCALTIME_R)
(void) localtime_r(&s, tm);
#else
struct tm *t;
t = localtime(&s);
*tm = *t;
#endif
}
void
ngx_libc_gmtime(time_t s, struct tm *tm)
{
#if (NGX_HAVE_LOCALTIME_R)
(void) gmtime_r(&s, tm);
#else
struct tm *t;
t = gmtime(&s);
*tm = *t;
#endif
}