X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgettimeofday.c;h=f2fad8cf41f83c96c39f1236940e08fd2a1c5fea;hb=6384ddb72cfa0d13c1126fc5b3aea3b10b921f9c;hp=59c565c78bf0ecc4123886bd495af00420dda226;hpb=bf133a41bf9dfb387f5ae52876f0d1380d53928b;p=gnulib.git diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c index 59c565c78..f2fad8cf4 100644 --- a/lib/gettimeofday.c +++ b/lib/gettimeofday.c @@ -1,7 +1,9 @@ /* 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 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, 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 @@ -15,15 +17,18 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* written by Jim Meyering */ #include -/* Disable the definition of gettimeofday (from config.h) so we can use - the library version. */ +/* 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 @@ -39,15 +44,36 @@ #endif #include -#include "gtod.h" static struct tm *localtime_buffer_addr; -void -GTOD_init (void) +/* This is a wrapper for localtime. It is used only on systems for which + gettimeofday clobbers the static buffer used for localtime's result. + + On the first call, record the address of the static buffer that + localtime uses for its result. */ + +struct tm * +rpl_localtime (const time_t *timep) { - time_t t = 0; - localtime_buffer_addr = localtime (&t); + struct tm *tm = localtime (timep); + + if (! localtime_buffer_addr) + localtime_buffer_addr = tm; + + 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 @@ -60,8 +86,13 @@ int rpl_gettimeofday (struct timeval *tv, struct timezone *tz) { struct tm save; + int result; + if (! localtime_buffer_addr) - abort (); + { + time_t t = 0; + localtime_buffer_addr = localtime (&t); + } save = *localtime_buffer_addr; result = gettimeofday (tv, tz); @@ -69,3 +100,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; +}