Various fixes to Martin Lambers' gettimeofday patch.
[gnulib.git] / lib / gettimeofday.c
index 99f49b0..e0afa49 100644 (file)
@@ -1,10 +1,12 @@
-/* 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.
+/* Provide gettimeofday
+   1. for systems that don't have it,
+   2. for some systems where 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, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007 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 <config.h>
 
-/* Disable the definitions of these functions (from config.h)
-   so we can use the library versions here.  */
-#undef gettimeofday
-#undef gmtime
-#undef localtime
-#undef tzset
+/* Specification.  */
+#include "gettimeofday.h"
 
 #include <sys/types.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
 #include <stdlib.h>
 
 #if HAVE_SYS_TIMEB_H
-#include <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.
@@ -60,10 +46,11 @@ 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)
+localtime (const time_t *timep)
+#undef localtime
 {
+  extern struct tm *localtime (const time_t *);
   struct tm *tm = localtime (timep);
 
   if (! localtime_buffer_addr)
@@ -71,13 +58,13 @@ 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)
+gmtime (const time_t *timep)
+#undef gmtime
 {
+  extern struct tm *gmtime (const time_t *);
   struct tm *tm = gmtime (timep);
 
   if (! localtime_buffer_addr)
@@ -85,6 +72,30 @@ rpl_gmtime (const time_t *timep)
 
   return tm;
 }
+
+/* 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.  */
+void
+tzset (void)
+#undef tzset
+{
+  extern struct tm *localtime (const time_t *);
+  extern void tzset (void);
+  struct tm save;
+
+  if (! localtime_buffer_addr)
+    {
+      time_t t = 0;
+      localtime_buffer_addr = localtime (&t);
+    }
+
+  save = *localtime_buffer_addr;
+  tzset ();
+  *localtime_buffer_addr = save;
+}
+
 #endif
 
 /* This is a wrapper for gettimeofday.  
@@ -92,10 +103,13 @@ rpl_gmtime (const time_t *timep)
    implementation of this function causes problems. */
 
 int
-rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
+gettimeofday (struct timeval *restrict tv, void *restrict tz)
+#undef gettimeofday
 {
 #if HAVE_GETTIMEOFDAY
 # if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+  extern struct tm *localtime (const time_t *);
+  extern int gettimeofday (/* unspecified arguments */);
 
   /* Save and restore the contents of the buffer used for localtime's result
      around the call to gettimeofday. */
@@ -140,25 +154,3 @@ rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
 # 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)
-{
-  struct tm save;
-
-  if (! localtime_buffer_addr)
-    {
-      time_t t = 0;
-      localtime_buffer_addr = localtime (&t);
-    }
-
-  save = *localtime_buffer_addr;
-  tzset ();
-  *localtime_buffer_addr = save;
-}
-#endif