base: Revert 9277177eccff and use getenv/setenv for UTC time
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 12 Nov 2014 14:05:20 +0000 (09:05 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 12 Nov 2014 14:05:20 +0000 (09:05 -0500)
This patch reverts changeset 9277177eccff which does not do what it
was intended to do. In essence, we go back to implementing mkutctime
much like the non-standard timegm extension.

src/base/time.cc
src/dev/sparc/dtod.cc

index c265c1c47ff3a07039d7fce31e8a0f76948a6881..a0ae9bb8252795da2454b2104de2e115715925d1 100644 (file)
@@ -150,7 +150,32 @@ sleep(const Time &time)
 time_t
 mkutctime(struct tm *time)
 {
-    time_t local = mktime(time);
-    return mktime(gmtime(&local));
+    // get the current timezone
+    char *tz = getenv("TZ");
+
+    // copy the string as the pointer gets invalidated when updating
+    // the environment
+    if (tz) {
+        tz = strdup(tz);
+        if (!tz) {
+            fatal("Failed to reserve memory for UTC time conversion\n");
+        }
+    }
+
+    // change to UTC and get the time
+    setenv("TZ", "", 1);
+    tzset();
+    time_t ret = mktime(time);
+
+    // restore the timezone again
+    if (tz) {
+        setenv("TZ", tz, 1);
+        free(tz);
+    } else {
+        unsetenv("TZ");
+    }
+    tzset();
+
+    return ret;
 }
 
index 0d57b1f83ce8f53e1e08a678d0608033b5e18d9f..94a32bed461d7ce4ec03190e415f3bb0739299c0 100644 (file)
@@ -53,8 +53,7 @@ DumbTOD::DumbTOD(const Params *p)
     : BasicPioDevice(p, 0x08)
 {
     struct tm tm = p->time;
-    time_t local = mktime(&tm);
-    todTime = mktime(gmtime(&local));
+    todTime = mkutctime(&tm);
 
     DPRINTFN("Real-time clock set to %s\n", asctime(&tm));
     DPRINTFN("Real-time clock set to %d\n", todTime);