(gettimeofday): New function substituting the library
authorRichard M. Stallman <rms@gnu.org>
Tue, 17 May 1994 07:24:12 +0000 (07:24 +0000)
committerRichard M. Stallman <rms@gnu.org>
Tue, 17 May 1994 07:24:12 +0000 (07:24 +0000)
function of the same name.
(init_gettimeofday): New function.
(init_environment): Call init_gettimeofday after possibly
setting TZ environment variable.

src/msdos.c

index eb95a80..f1f1c38 100644 (file)
@@ -739,6 +739,7 @@ init_environment (argc, argv, skip_args)
       break;
     }
   tzset ();
+  init_gettimeofday ();
 }
 
 /* Flash the screen as a substitute for BEEPs.  */
@@ -889,7 +890,59 @@ internal_terminal_init ()
   internal_terminal
     = (!noninteractive) && term && !strcmp (term, "internal");
 }
+\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.  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)
+{
+  if (tp)
+    {
+      struct time t;
+      struct date d;
+      struct tm tmrec;
+
+      gettime (&t);
+      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);
+    }
+  if (tzp)
+    {
+      tzp->tz_minuteswest = gmtoffset;
+      tzp->tz_dsttime = daylight;
+    }
+  return 0;
+}
+
+void
+init_gettimeofday ()
+{
+  time_t ltm, gtm;
+  struct tm *lstm;
+
+  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;
 static _go32_dpmi_registers ctrl_break_regs;