summaryrefslogtreecommitdiff
path: root/lib/gettimeofday.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2007-01-17 00:42:21 +0000
committerBruno Haible <bruno@clisp.org>2007-01-17 00:42:21 +0000
commitfc0de83a1e5cca98557f603670284f247b34f491 (patch)
tree33c177edd4de53be631d5e859fd49a0ee60ff476 /lib/gettimeofday.c
parentf2be8d9f7eb2d1d274914cdd65e8ee1fc669cfbe (diff)
downloadgnulib-fc0de83a1e5cca98557f603670284f247b34f491.tar.gz
Patch from Martin Lambers <marlam@marlam.de>, from 2005-10-08
<http://lists.gnu.org/archive/html/bug-gnulib/2005-10/msg00093.html>
Diffstat (limited to 'lib/gettimeofday.c')
-rw-r--r--lib/gettimeofday.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c
index f2fad8cf41..99f49b04f9 100644
--- a/lib/gettimeofday.c
+++ b/lib/gettimeofday.c
@@ -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
@@ -45,7 +46,13 @@
#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