X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgettimeofday.c;h=1ebe4d0ffddd150158a63af70b38834ef2cfe3f0;hb=709c1f1fb17a388b106f6305a952da3ba802218e;hp=0d259be1cfa54da27fe631a600ade936e25d2cd7;hpb=eef8f2f400ab16634ead7c2d233686fcb58e16c2;p=gnulib.git diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c index 0d259be1c..1ebe4d0ff 100644 --- a/lib/gettimeofday.c +++ b/lib/gettimeofday.c @@ -1,7 +1,8 @@ /* 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. - Copyright (C) 2001, 2002 Free Software Foundation, Inc. + The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and 2.6. + Copyright (C) 2001, 2002, 2003 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 @@ -21,10 +22,12 @@ #include -/* Disable the definitions of gettimeofday and localtime (from 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 #include @@ -60,6 +63,18 @@ rpl_localtime (const time_t *timep) return tm; } +/* Same as above, since gmtime and localtime use the same buffer. */ +struct tm * +rpl_gmtime (const time_t *timep) +{ + struct tm *tm = gmtime (timep); + + if (! localtime_buffer_addr) + localtime_buffer_addr = tm; + + return tm; +} + /* This is a wrapper for gettimeofday. It is used only on systems for which gettimeofday clobbers the static buffer used for localtime's result. @@ -84,3 +99,23 @@ rpl_gettimeofday (struct timeval *tv, struct timezone *tz) return result; } + +/* 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 +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; +}