Arthur David Olson wrote:
That way folks who look for the POSIX string at the very end of the file will find it, and folks who look for it after the 64-bit data will too.
Thanks! Here's a patch to implement that; I've pushed this to the experimental repository.
From d74d5b95008e7a00da6fc66afc618ea8296fd43e Mon Sep 17 00:00:00 2001 From: Paul Eggert <eggert@cs.ucla.edu> Date: Mon, 9 Sep 2013 22:32:56 -0700 Subject: [PATCH] * tzfile.5: Repeat the TZ string after the name-value pairs.
Suggested by Arthur David Olson in <http://mm.icann.org/pipermail/tz/2013-September/020100.html>. * zic.c (writezone): Implement this. --- tzfile.5 | 21 ++++++++++++--------- zic.c | 22 ++++++++++++---------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/tzfile.5 b/tzfile.5 index d609277..d9477eb 100644 --- a/tzfile.5 +++ b/tzfile.5 @@ -158,15 +158,18 @@ between daylight saving and standard time. Also, for version-3-format time zone files, the version-2 header and data are optionally followed by a section containing auxiliary meta-information that is not needed to process time stamps. This -section, if present, consists of the four magic bytes "=TZ\en" -followed by zero or more newline-terminated byte strings, each -containing a name-value pair separated by "=". Names consist of ASCII -letters, digits and underscores, and start with a letter; duplicate -names are not allowed. Two common names are "name", the Zone name for -the data, and "version", the version number. Values consist of any -bytes except NUL, newline, and backslash; however, newline and -backslash can represented via the two-byte strings "\en" and "\e\e" -respectively. +section, if present, consists of the four magic bytes "=TZ\en", +followed by zero or more newline-terminated byte strings, followed by +another copy of the newline-enclosed POSIX-TZ-style string (this last +is for the benefit of any older clients that look for the TZ string at +the very end of the file). Each newline-terminated byte string +consists of a name-value pair separated by "=" and terminated by +newline. Names consist of ASCII letters, digits and underscores, and +start with a letter; duplicate names are not allowed. Two common +names are "name", the Zone name for the data, and "version", the +version number. Values consist of any bytes except NUL, newline, and +backslash; however, newline and backslash can represented via the +two-byte strings "\en" and "\e\e" respectively. .SH SEE ALSO newctime(3), newtzset(3) .\" This file is in the public domain, so clarified as of diff --git a/zic.c b/zic.c index eefa1fb..17b9e0e 100644 --- a/zic.c +++ b/zic.c @@ -1765,17 +1765,19 @@ writezone(const char *const name, const char *const string) (void) putc(ttisgmts[i], fp); } (void) fprintf(fp, "\n%s\n", string); - if (genname || genoptions) + if (genname || genoptions) { fprintf(fp, "=TZ\n"); - if (genname) { - fprintf(fp, "name"); - writevalue(fp, name); - } - for (i = 0; i < genoptions; i++) { - register char const *v = genoption[i]; - register int namelen = strchr(v, '=') - v; - fprintf(fp, "%.*s", namelen, v); - writevalue(fp, v + namelen + 1); + if (genname) { + fprintf(fp, "name"); + writevalue(fp, name); + } + for (i = 0; i < genoptions; i++) { + register char const *v = genoption[i]; + register int namelen = strchr(v, '=') - v; + fprintf(fp, "%.*s", namelen, v); + writevalue(fp, v + namelen + 1); + } + fprintf(fp, "\n%s\n", string); } if (ferror(fp) || fclose(fp)) { (void) fprintf(stderr, _("%s: Error writing %s\n"), -- 1.8.3.1