This is for FreeBSD libc, which still defines a hidden tzsetwall
to support old binaries that use that old (and ineffective) function.
FreeBSD can do so in a wrapper file that includes localtime.c.
This patch does not affect behavior of existing functions.
* localtime.c (tzset_unlocked): New arg WALL.
All uses changed.
---
 localtime.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/localtime.c b/localtime.c
index f2d35813..626e083d 100644
--- a/localtime.c
+++ b/localtime.c
@@ -1917,9 +1917,11 @@ zoneinit(struct state *sp, char const *name, char 
tzloadflags)
 /* Like tzset(), but in a critical section.
    If THREADED && THREAD_RWLOCK the caller has a read lock,
    and this function might upgrade it to a write lock.
+   If WALL, act as if TZ is unset; although always false in this file,
+   a wrapper .c file's obsolete and ineffective tzsetwall function can use it.
    If tz_change_interval is positive the time is NOW; otherwise ignore NOW.  */
 static void
-tzset_unlocked(bool threaded, monotime_t now)
+tzset_unlocked(bool threaded, bool wall, monotime_t now)
 {
   char const *name;
   struct state *sp;
@@ -1928,7 +1930,7 @@ tzset_unlocked(bool threaded, monotime_t now)
   bool writing = false;
 
   for (;;) {
-    name = getenv("TZ");
+    name = wall ? NULL : getenv("TZ");
     sp = lclptr;
     tzloadflags = TZLOAD_FROMENV | TZLOAD_TZSTRING;
     namelen = sizeof lcl_TZname + 1; /* placeholder for no name */
@@ -2016,7 +2018,7 @@ tzset(void)
     errno = err;
     return;
   }
-  tzset_unlocked(!err, now);
+  tzset_unlocked(!err, false, now);
   unlock(!err);
 }
 #endif
@@ -2207,7 +2209,7 @@ localtime_tzset(time_t const *timep, struct tm *tmp, bool 
setname)
     return NULL;
   }
   if (0 <= tz_change_interval || setname || !lcl_is_set)
-    tzset_unlocked(!err, now);
+    tzset_unlocked(!err, false, now);
   tmp = localsub(lclptr, timep, setname, tmp);
   unlock(!err);
   return tmp;
@@ -2874,7 +2876,7 @@ mktime(struct tm *tmp)
     errno = err;
     return -1;
   }
-  tzset_unlocked(!err, now);
+  tzset_unlocked(!err, false, now);
   t = mktime_tzname(lclptr, tmp, true);
   unlock(!err);
   return t;
@@ -2992,7 +2994,7 @@ time2posix(time_t t)
     return -1;
   }
   if (0 <= tz_change_interval || !lcl_is_set)
-    tzset_unlocked(!err, now);
+    tzset_unlocked(!err, false, now);
   if (lclptr)
     t = time2posix_z(lclptr, t);
   unlock(!err);
@@ -3038,7 +3040,7 @@ posix2time(time_t t)
     return -1;
   }
   if (0 <= tz_change_interval || !lcl_is_set)
-    tzset_unlocked(!err, now);
+    tzset_unlocked(!err, false, now);
   if (lclptr)
     t = posix2time_z(lclptr, t);
   unlock(!err);
-- 
2.51.0

Reply via email to