From fc0de83a1e5cca98557f603670284f247b34f491 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 17 Jan 2007 00:42:21 +0000 Subject: Patch from Martin Lambers , from 2005-10-08 --- lib/gettimeofday.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'lib/gettimeofday.c') 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 +#if HAVE_SYS_TIMEB_H +#include +#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 -- cgit v1.2.1