]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
date: simplify -u by not calling putenv
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 3 Apr 2026 01:53:34 +0000 (18:53 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 3 Apr 2026 01:54:35 +0000 (18:54 -0700)
* src/date.c (TZSET): Remove; no longer needed.
(main): Simplify -u’s implementation by passing "UTC0" to tzalloc,
rather than by setting TZ in the environment and then calling getenv.
The old way of doing things dates back to before we had tzalloc.
* configure.ac (LOCALTIME_CACHE): Remove; no longer needed.

configure.ac
src/date.c

index 2741dc81b25e0e73ed32e2c50851a135e85fc47f..d7b7915a969697a4e776efe2361dfe5c7c98b4d1 100644 (file)
@@ -291,54 +291,6 @@ AC_CHECK_FUNCS([sigsuspend],
 
 gl_WINSIZE_IN_PTEM
 
-AC_MSG_CHECKING([whether localtime caches TZ])
-AC_CACHE_VAL([utils_cv_localtime_cache],
-[if test x$ac_cv_func_tzset = xyes; then
-AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <time.h>
-#if STDC_HEADERS
-# include <stdlib.h>
-#endif
-extern char **environ;
-void unset_TZ (void)
-{
-  char **from, **to;
-  for (to = from = environ; (*to = *from); from++)
-    if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
-      to++;
-}
-int
-main ()
-{
-  time_t now = time ((time_t *) 0);
-  int hour_GMT0, hour_unset;
-  if (putenv ("TZ=GMT0") != 0)
-    return 1;
-  hour_GMT0 = localtime (&now)->tm_hour;
-  unset_TZ ();
-  hour_unset = localtime (&now)->tm_hour;
-  if (putenv ("TZ=PST8") != 0)
-    return 1;
-  if (localtime (&now)->tm_hour == hour_GMT0)
-    return 1;
-  unset_TZ ();
-  if (localtime (&now)->tm_hour != hour_unset)
-    return 1;
-  return 0;
-}]])],
-[utils_cv_localtime_cache=no],
-[utils_cv_localtime_cache=yes],
-[# If we have tzset, assume the worst when cross-compiling.
-utils_cv_localtime_cache=yes])
-else
-        # If we lack tzset, report that localtime does not cache TZ,
-        # since we can't invalidate the cache if we don't have tzset.
-        utils_cv_localtime_cache=no
-fi])dnl
-AC_MSG_RESULT([$utils_cv_localtime_cache])
-if test $utils_cv_localtime_cache = yes; then
-  AC_DEFINE([LOCALTIME_CACHE], [1], [FIXME])
-fi
-
 # Find the library for dynamic loading of shared libraries.
 AC_SEARCH_LIBS([dlopen], [dl])
 AS_CASE([$ac_cv_search_dlopen],
index d37fb5712358c1a986bc91b4a9ae580a0124d0da..14d9204a8c1e722b78a267edc6d1b4937cff3cbc 100644 (file)
@@ -107,12 +107,6 @@ static struct option const long_options[] =
 /* flags for parse_datetime2 */
 static unsigned int parse_datetime_flags;
 
-#if LOCALTIME_CACHE
-# define TZSET tzset ()
-#else
-# define TZSET /* empty */
-#endif
-
 #ifdef _DATE_FMT
 # define DATE_FMT_LANGINFO() nl_langinfo (_DATE_FMT)
 #else
@@ -483,7 +477,7 @@ main (int argc, char **argv)
   char *reference = NULL;
   bool discarded_datestr = false;
   bool discarded_set_datestr = false;
-  bool utc = false;
+  char const *tzstring = NULL;
 
   initialize_main (&argc, &argv);
   set_program_name (argv[0]);
@@ -560,7 +554,7 @@ main (int argc, char **argv)
           set_date = true;
           break;
         case 'u':
-          utc = true;
+          tzstring = "UTC0";
           break;
         case_GETOPT_HELP_CHAR;
         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
@@ -569,16 +563,6 @@ main (int argc, char **argv)
         }
     }
 
-  if (utc)
-    {
-      /* POSIX says that 'date -u' is equivalent to setting the TZ
-         environment variable, so this option should do nothing other
-         than setting TZ.  */
-      if (putenv (bad_cast ("TZ=UTC0")) != 0)
-        xalloc_die ();
-      TZSET;
-    }
-
   int option_specified_date = (!!datestr + !!batch_file + !!reference
                                + get_resolution);
 
@@ -649,7 +633,8 @@ main (int argc, char **argv)
 
   char *format_copy = adjust_resolution (format);
   char const *format_res = format_copy ? format_copy : format;
-  char const *tzstring = getenv ("TZ");
+  if (!tzstring)
+    tzstring = getenv ("TZ");
   timezone_t tz = tzalloc (tzstring);
 
   bool ok = true;