Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libutil mktime(3) works in local time, and trying to tri...



details:   https://anonhg.NetBSD.org/src/rev/a34f070a0296
branches:  trunk
changeset: 784128:a34f070a0296
user:      apb <apb%NetBSD.org@localhost>
date:      Sat Jan 19 09:27:32 2013 +0000

description:
mktime(3) works in local time, and trying to trick it by
setting tm_gmtoff doesn't work.  Instead, call mktime_z(3)
with a null timezone (so it works in UTC) and adjust the
result afterwards.  Now "date -d @0" correctly
prints the local equivalent of 1970-01-01 00:00:00 UTC.

diffstat:

 lib/libutil/parsedate.y |  9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diffs (27 lines):

diff -r 040d657751c7 -r a34f070a0296 lib/libutil/parsedate.y
--- a/lib/libutil/parsedate.y   Sat Jan 19 07:41:51 2013 +0000
+++ b/lib/libutil/parsedate.y   Sat Jan 19 09:27:32 2013 +0000
@@ -590,7 +590,8 @@
     DSTMODE    DSTmode         /* DST on/off/maybe */
 )
 {
-    struct tm tm;
+    struct tm tm = {.tm_sec = 0};
+    time_t result;
 
     /* XXX Y2K */
     if (Year < 0)
@@ -611,9 +612,11 @@
     case DSToff: tm.tm_isdst = 0; break;
     default:     tm.tm_isdst = -1; break;
     }
-    tm.tm_gmtoff = -Timezone;
 
-    return mktime(&tm);
+    /* We rely on mktime_z(NULL, ...) working in UTC, not in local time. */
+    result = mktime_z(NULL, &tm);
+    result -= Timezone;
+    return result;
 }
 
 



Home | Main Index | Thread Index | Old Index