]> git.eshelyaron.com Git - emacs.git/commitdiff
(gettimeofday, init_gettimeofday, daylight, gmtoffset): Undo previous change.
authorPaul Eggert <eggert@twinsun.com>
Wed, 20 Sep 1995 03:26:43 +0000 (03:26 +0000)
committerPaul Eggert <eggert@twinsun.com>
Wed, 20 Sep 1995 03:26:43 +0000 (03:26 +0000)
(init_environment): No need to call tzset and init_gettimeofday,
since `main' now does that for us.
(gettimeofday): Ignore tzp; it's obsolescent.
(init_gettimeofday): Invoke tzset first.

src/msdos.c

index dc48834c0e3da9f306d09473e8aaef0e71ecb6a6..a72e59a315aec95cd29fb52dfd841db7a35de757 100644 (file)
@@ -1415,7 +1415,10 @@ internal_terminal_init ()
 \f
 /* When time zones are set from Ms-Dos too may C-libraries are playing
    tricks with time values.  We solve this by defining our own version
-   of `gettimeofday' bypassing GO32.  */
+   of `gettimeofday' bypassing GO32.  Our version needs to be initialized
+   once and after each call to `tzset' with TZ changed.  */
+
+static int daylight, gmtoffset;
 
 int
 gettimeofday (struct timeval *tp, struct timezone *tzp)
@@ -1423,16 +1426,44 @@ gettimeofday (struct timeval *tp, struct timezone *tzp)
   if (tp)
     {
       struct time t;
+      struct date d;
+      struct tm tmrec;
 
       gettime (&t);
-      tp->tv_sec = time (NULL);
-      /* If tp->tv_sec%60 != t.ti_sec, the seconds counter turned over
-        between the call to `gettime' and the call to `time'.  */
-      tp->tv_usec = tp->tv_sec%60 != t.ti_sec ? 0 : t.ti_hund * (1000000/100);
+      /* If midnight occurs here, the results can be incorrect.  */
+      getdate (&d);
+      tmrec.tm_year = d.da_year - 1900;
+      tmrec.tm_mon = d.da_mon - 1;
+      tmrec.tm_mday = d.da_day;
+      tmrec.tm_hour = t.ti_hour;
+      tmrec.tm_min = t.ti_min;
+      tmrec.tm_sec = t.ti_sec;
+      tmrec.tm_gmtoff = gmtoffset;
+      tmrec.tm_isdst = daylight;
+      tp->tv_sec = mktime (&tmrec);
+      tp->tv_usec = t.ti_hund * (1000000 / 100);
     }
   /* Ignore tzp; it's obsolescent.  */
   return 0;
 }
+
+void
+init_gettimeofday ()
+{
+  time_t ltm, gtm;
+  struct tm *lstm;
+#undef tzset
+  extern void tzset (void);
+
+  tzset ();
+  daylight = 0;
+  gmtoffset = 0;
+  ltm = gtm = time (NULL);
+  ltm = mktime (lstm = localtime (&ltm));
+  gtm = mktime (gmtime (&gtm));
+  daylight = lstm->tm_isdst;
+  gmtoffset = (int)(gtm - ltm) / 60;
+}
 \f
 /* These must be global.  */
 static _go32_dpmi_seginfo ctrl_break_vector;