Fix a problem seen only on nonconforming systems whereby ls.c's
authorJim Meyering <jim@meyering.net>
Mon, 27 May 2002 16:42:55 +0000 (16:42 +0000)
committerJim Meyering <jim@meyering.net>
Mon, 27 May 2002 16:42:55 +0000 (16:42 +0000)
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.

lib/gettimeofday.c

index 48f2869..0d259be 100644 (file)
@@ -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
 
 #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>
 
 
 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.