Author: nbd
Date: 2015-06-19 19:48:11 +0200 (Fri, 19 Jun 2015)
New Revision: 46069

Added:
   trunk/toolchain/musl/patches/110-read_timezone_from_fs.patch
Log:
musl: read the timezone from /etc/TZ

Currently the OpenWRT boot scripts write the timezone configuration to
/tmp/TZ, relying on the behaviour of uClibc that the timezone is read
from /etc/TZ if no TZ env variable is found.

This works because /etc/TZ is a symlink to /tmp/TZ.

Musl libc however only reads the timezone from the TZ env variable and
if it doesn't find it or it's empty, it will look for a zoneinfo
file, that doesn't exist.

So in musl builds no timezone is ever set.

This patch fixes the issue by having musl libc behave like uClibc: if no
TZ env variable is found it will try to load it from /etc/TZ.

Signed-off-by: Gianluca Anzolin <gianluca at sottospazio.it>
Signed-off-by: Felix Fietkau <[email protected]>

Added: trunk/toolchain/musl/patches/110-read_timezone_from_fs.patch
===================================================================
--- trunk/toolchain/musl/patches/110-read_timezone_from_fs.patch                
                (rev 0)
+++ trunk/toolchain/musl/patches/110-read_timezone_from_fs.patch        
2015-06-19 17:48:11 UTC (rev 46069)
@@ -0,0 +1,28 @@
+--- a/src/time/__tz.c
++++ b/src/time/__tz.c
+@@ -23,6 +23,9 @@ static int r0[5], r1[5];
+ static const unsigned char *zi, *trans, *index, *types, *abbrevs, 
*abbrevs_end;
+ static size_t map_size;
+ 
++static const char *tzfile;
++static size_t tzfile_size;
++
+ static char old_tz_buf[32];
+ static char *old_tz = old_tz_buf;
+ static size_t old_tz_size = sizeof old_tz_buf;
+@@ -125,6 +128,15 @@ static void do_tzset()
+               "/usr/share/zoneinfo/\0/share/zoneinfo/\0/etc/zoneinfo/\0";
+ 
+       s = getenv("TZ");
++
++      /* if TZ is empty try to read it from /etc/TZ */
++      if (!s || !*s) {
++              if (tzfile)
++                      __munmap((void*)tzfile, tzfile_size);
++
++              s = tzfile = (void *)__map_file("/etc/TZ", &tzfile_size);
++      }
++
+       if (!s || !*s) s = "/etc/localtime";
+ 
+       if (old_tz && !strcmp(s, old_tz)) return;
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to