summaryrefslogtreecommitdiff
path: root/lib/gettimeofday.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2002-05-27 16:42:55 +0000
committerJim Meyering <jim@meyering.net>2002-05-27 16:42:55 +0000
commitd2be1268c4d3ed0c8ba6974c7562b777a1564657 (patch)
tree442132f3c7a47157fbdbafbf6175edd7823d45ea /lib/gettimeofday.c
parentc75c72a9fc4d52edbb929fa4384ae68c95dba0a7 (diff)
downloadcoreutils-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.c24
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.