Patch from Martin Lambers <marlam@marlam.de>, from 2005-10-08
[gnulib.git] / lib / gettimeofday.c
index f2fad8c..99f49b0 100644 (file)
@@ -1,9 +1,10 @@
-/* Work around the bug in some systems whereby gettimeofday clobbers the
+/* Provide gettimeofday for systems that don't have it, or,
+   work around the bug in some systems whereby gettimeofday clobbers the
    static buffer that localtime uses for it's return value.  The gettimeofday
    function from Mac OS X 10.0.4, i.e. Darwin 1.3.7 has this problem.
    The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and 2.6.
 
-   Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include <stdlib.h>
 
+#if HAVE_SYS_TIMEB_H
+#include <sys/timeb.h>
+#endif
+
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME
 static struct tm *localtime_buffer_addr;
+#endif
 
 /* This is a wrapper for localtime.  It is used only on systems for which
    gettimeofday clobbers the static buffer used for localtime's result.
@@ -53,6 +60,7 @@ static struct tm *localtime_buffer_addr;
    On the first call, record the address of the static buffer that
    localtime uses for its result.  */
 
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME
 struct tm *
 rpl_localtime (const time_t *timep)
 {
@@ -63,8 +71,10 @@ rpl_localtime (const time_t *timep)
 
   return tm;
 }
+#endif
 
 /* Same as above, since gmtime and localtime use the same buffer.  */
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME
 struct tm *
 rpl_gmtime (const time_t *timep)
 {
@@ -75,16 +85,20 @@ rpl_gmtime (const time_t *timep)
 
   return tm;
 }
+#endif
 
-/* This is a wrapper for gettimeofday.  It is used only on systems for which
-   gettimeofday clobbers the static buffer used for localtime's result.
-
-   Save and restore the contents of the buffer used for localtime's result
-   around the call to gettimeofday.  */
+/* This is a wrapper for gettimeofday.  
+   It is used only on systems that lack this function, or for whose 
+   implementation of this function causes problems. */
 
 int
-rpl_gettimeofday (struct timeval *tv, struct timezone *tz)
+rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
 {
+#if HAVE_GETTIMEOFDAY
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+
+  /* Save and restore the contents of the buffer used for localtime's result
+     around the call to gettimeofday. */
   struct tm save;
   int result;
 
@@ -99,12 +113,39 @@ rpl_gettimeofday (struct timeval *tv, struct timezone *tz)
   *localtime_buffer_addr = save;
 
   return result;
+
+# endif
+#else
+# if HAVE__FTIME
+
+  struct _timeb timebuf;
+  
+  _ftime (&timebuf);
+  tv->tv_sec = timebuf.time;
+  tv->tv_usec = timebuf.millitm * 1000;
+
+  return 0;
+
+# else
+
+  time_t t = time (NULL);
+  
+  if (t == (time_t) -1)
+    return -1;
+  tv->tv_sec = t;
+  tv->tv_usec = 0;
+
+  return 0;
+
+# endif
+#endif
 }
 
 /* This is a wrapper for tzset. It is used only on systems for which
    tzset may clobber the static buffer used for localtime's result.
    Save and restore the contents of the buffer used for localtime's
    result around the call to tzset.  */
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME
 void
 rpl_tzset (void)
 {
@@ -120,3 +161,4 @@ rpl_tzset (void)
   tzset ();
   *localtime_buffer_addr = save;
 }
+#endif