aboutsummaryrefslogtreecommitdiffstats
path: root/app/nginx/src/os/unix/ngx_time.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/nginx/src/os/unix/ngx_time.c')
-rw-r--r--app/nginx/src/os/unix/ngx_time.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/app/nginx/src/os/unix/ngx_time.c b/app/nginx/src/os/unix/ngx_time.c
new file mode 100644
index 0000000..cc760b2
--- /dev/null
+++ b/app/nginx/src/os/unix/ngx_time.c
@@ -0,0 +1,104 @@
+
+/*
+ * 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
+}