diff options
author | Jim Meyering <jim@meyering.net> | 2001-08-12 08:33:09 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2001-08-12 08:33:09 +0000 |
commit | 1d3ea9cba89acddf503a8e1b10ac5de42086ffe7 (patch) | |
tree | 7e5ce96a3c1ebfe9e7ac37ba2b333bf847f0bcac /lib | |
parent | c04d364e496f1ca52d89ebd1f4b3ea70d3ec6ecb (diff) | |
download | coreutils-1d3ea9cba89acddf503a8e1b10ac5de42086ffe7.tar.xz |
*** empty log message ***
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gettimeofday.c | 71 | ||||
-rw-r--r-- | lib/gtod.h | 21 |
2 files changed, 92 insertions, 0 deletions
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c new file mode 100644 index 000000000..59c565c78 --- /dev/null +++ b/lib/gettimeofday.c @@ -0,0 +1,71 @@ +/* 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. + + 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 definition of gettimeofday (from config.h) so we can use + the library version. */ +#undef gettimeofday + +#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> +#include "gtod.h" + +static struct tm *localtime_buffer_addr; + +void +GTOD_init (void) +{ + time_t t = 0; + localtime_buffer_addr = localtime (&t); +} + +/* 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; + if (! localtime_buffer_addr) + abort (); + + save = *localtime_buffer_addr; + result = gettimeofday (tv, tz); + *localtime_buffer_addr = save; + + return result; +} diff --git a/lib/gtod.h b/lib/gtod.h new file mode 100644 index 000000000..3372416f7 --- /dev/null +++ b/lib/gtod.h @@ -0,0 +1,21 @@ +#ifndef GTOD_H +# define GTOD_H 1 + +# ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +# endif + +void GTOD_init PARAMS ((void)); + +/* This is a no-op on compliant systems. */ +# if GETTIMEOFDAY_CLOBBERS_LOCALTIME_BUFFER +# define GETTIMEOFDAY_INIT() GTOD_init () +# else +# define GETTIMEOFDAY_INIT() /* empty */ +# endif + +#endif |