diff options
author | delphij <delphij@FreeBSD.org> | 2007-06-15 07:06:13 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2007-06-15 07:06:13 +0000 |
commit | 40ec4fdc9a74bfdb83f13672acdb88af5c91ab46 (patch) | |
tree | fa574500c8a91fba34c02a5fbe177ac9ef1890ea /contrib/diff/lib/gettimeofday.c | |
parent | f75ef5d3d4da5cc670cb41c22a97279e60c6cb0c (diff) | |
download | FreeBSD-src-40ec4fdc9a74bfdb83f13672acdb88af5c91ab46.zip FreeBSD-src-40ec4fdc9a74bfdb83f13672acdb88af5c91ab46.tar.gz |
Virgin import of diffutils 2.8.7.
Diffstat (limited to 'contrib/diff/lib/gettimeofday.c')
-rw-r--r-- | contrib/diff/lib/gettimeofday.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/contrib/diff/lib/gettimeofday.c b/contrib/diff/lib/gettimeofday.c new file mode 100644 index 0000000..1ebe4d0 --- /dev/null +++ b/contrib/diff/lib/gettimeofday.c @@ -0,0 +1,121 @@ +/* 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 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 + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + 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. */ + +/* written by Jim Meyering */ + +#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 + +#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> + +static struct tm *localtime_buffer_addr; + +/* 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) +{ + 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 + 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. */ + +int +rpl_gettimeofday (struct timeval *tv, struct timezone *tz) +{ + struct tm save; + int result; + + if (! localtime_buffer_addr) + { + time_t t = 0; + localtime_buffer_addr = localtime (&t); + } + + save = *localtime_buffer_addr; + result = gettimeofday (tv, tz); + *localtime_buffer_addr = save; + + 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; +} |