properly fill in tzname[] for old (pre-64-bit-format) zoneinfo files
authorRich Felker <dalias@aerifal.cx>
Sat, 24 Aug 2013 17:11:18 +0000 (13:11 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 24 Aug 2013 17:11:18 +0000 (13:11 -0400)
in this case, the first standard-time and first daylight-time rules
should be taken as the "default" ones to expose.

src/time/__tz.c

index 8a1836e7178615d1ebb48d947709a48499e0bb51..81676d3b6d800e60b98c74feb0f895ed1a2c0712 100644 (file)
@@ -190,7 +190,28 @@ static void do_tzset()
                        for (s = (const char *)zi+map_size-2; *s!='\n'; s--);
                        s++;
                } else {
-                       s = 0;
+                       const unsigned char *p;
+                       __tzname[0] = __tzname[1] = 0;
+                       __daylight = __timezone = dst_off = 0;
+                       for (i=0; i<5; i++) r0[i] = r1[i] = 0;
+                       for (p=types; p<abbrevs; p+=6) {
+                               if (!p[4] && !__tzname[0]) {
+                                       __tzname[0] = (char *)abbrevs + p[5];
+                                       __timezone = -zi_read32(p);
+                               }
+                               if (p[4] && !__tzname[1]) {
+                                       __tzname[1] = (char *)abbrevs + p[5];
+                                       dst_off = -zi_read32(p);
+                                       __daylight = 1;
+                               }
+                       }
+                       if (!__tzname[0]) __tzname[0] = __tzname[1];
+                       if (!__tzname[0]) __tzname[0] = (char *)__gmt;
+                       if (!__daylight) {
+                               __tzname[1] = __tzname[0];
+                               dst_off = __timezone;
+                       }
+                       return;
                }
        }