[tz] [PATCH 3/3] * zic.c: Output version-2 format files if possible.

Paul Eggert eggert at cs.ucla.edu
Mon Sep 16 04:32:45 UTC 2013


We don't know of any clients where this makes a difference, but it
is a more-conservative change, as in theory older clients could
reject version-3 format files merely because of the version number.
(ZIC_VERSION_PRE_2013): New macro.
(writezone): New arg 'version'.  All callers changed.
(outzone): Output version-2 format files unless the capabilities
of version 3 are used.
---
 zic.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/zic.c b/zic.c
index 9939195..7e231b5 100644
--- a/zic.c
+++ b/zic.c
@@ -10,6 +10,7 @@
 
 #include <stdarg.h>
 
+#define    ZIC_VERSION_PRE_2013 '2'
 #define    ZIC_VERSION    '3'
 
 typedef int_fast64_t    zic_t;
@@ -1386,7 +1387,7 @@ is32(const zic_t x)
 }
 
 static void
-writezone(const char *const name, const char *const string)
+writezone(const char *const name, const char *const string, char version)
 {
     register FILE *            fp;
     register int            i, j;
@@ -1639,7 +1640,7 @@ writezone(const char *const name, const char
*const string)
 #define DO(field)    ((void) fwrite(tzh.field, sizeof tzh.field, 1, fp))
         tzh = tzh0;
         (void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
-        tzh.tzh_version[0] = ZIC_VERSION;
+        tzh.tzh_version[0] = version;
         convert(thistypecnt, tzh.tzh_ttisgmtcnt);
         convert(thistypecnt, tzh.tzh_ttisstdcnt);
         convert(thisleapcnt, tzh.tzh_leapcnt);
@@ -2009,6 +2010,7 @@ outzone(const struct zone * const zpfirst, const
int zonecount)
     register int            prodstic; /* all rules are min to max */
     register int            compat;
     register int            do_extend;
+    register char            version;
 
     max_abbr_len = 2 + max_format_len + max_abbrvar_len;
     max_envvar_len = 2 * max_abbr_len + 5 * 9;
@@ -2058,6 +2060,7 @@ outzone(const struct zone * const zpfirst, const
int zonecount)
     ** Generate lots of data if a rule can't cover all future times.
     */
     compat = stringzone(envvar, zpfirst, zonecount);
+    version = compat < 2013 ? ZIC_VERSION_PRE_2013 : ZIC_VERSION;
     do_extend = compat < 0 || compat == YEAR_BY_YEAR_ZONE;
     if (noise && compat != 0 && compat != YEAR_BY_YEAR_ZONE) {
         if (compat < 0)
@@ -2307,7 +2310,7 @@ error(_("can't determine time zone abbreviation to
use just after until time"));
             addtt(rpytime(&xr, max_year + 1), typecnt-1);
         }
     }
-    writezone(zpfirst->z_name, envvar);
+    writezone(zpfirst->z_name, envvar, version);
     free(startbuf);
     free(ab);
     free(envvar);
-- 
1.8.3.1





More information about the tz mailing list