diff options
author | Jim Meyering <jim@meyering.net> | 2002-05-27 16:42:55 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2002-05-27 16:42:55 +0000 |
commit | d2be1268c4d3ed0c8ba6974c7562b777a1564657 (patch) | |
tree | 442132f3c7a47157fbdbafbf6175edd7823d45ea /lib/gettimeofday.c | |
parent | c75c72a9fc4d52edbb929fa4384ae68c95dba0a7 (diff) | |
download | coreutils-d2be1268c4d3ed0c8ba6974c7562b777a1564657.tar.xz |
Fix a problem seen only on nonconforming systems whereby ls.c's
use of localtime, and then of gettimeofday would cause trouble:
the localtime call used to initialize rpl_gettimeofday's save
mechanism would clobber ls's current local time information so
that in any long listing the first file would always be listed
with date 1970-01-01. Analysis by Volker Borchert.
(localtime): Undefine.
(rpl_localtime): New function.
Diffstat (limited to 'lib/gettimeofday.c')
-rw-r--r-- | lib/gettimeofday.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c index 48f286945..0d259be1c 100644 --- a/lib/gettimeofday.c +++ b/lib/gettimeofday.c @@ -1,7 +1,7 @@ /* 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. + Copyright (C) 2001, 2002 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,9 +21,10 @@ #include <config.h> -/* Disable the definition of gettimeofday (from config.h) so we can use - the library version. */ +/* Disable the definitions of gettimeofday and localtime (from config.h) + so we can use the library versions here. */ #undef gettimeofday +#undef localtime #include <sys/types.h> @@ -42,6 +43,23 @@ 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; +} + /* This is a wrapper for gettimeofday. It is used only on systems for which gettimeofday clobbers the static buffer used for localtime's result. |