[tz] [PROPOSED 1/2] zic has new ‘-l -’ and ‘-p -’ options

Paul Eggert eggert at cs.ucla.edu
Sat Jun 13 07:36:07 UTC 2020


* NEWS, zic.8: Mention this.
* zic.c (dolink): If fromfield is "-", simply remove tofield.
---
 NEWS  |  3 +++
 zic.8 | 12 ++++++++++++
 zic.c |  5 ++++-
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 3bcddd0..cdcdbc1 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,9 @@ Unreleased, experimental changes
 
   Changes to code
 
+    zic's new '-l -' and '-p -' options uninstall any existing
+    localtime and posixrules files, respectively.
+
     The undocumented and ineffective tzsetwall function has been
     removed.
 
diff --git a/zic.8 b/zic.8
index b1bf437..a431311 100644
--- a/zic.8
+++ b/zic.8
@@ -85,6 +85,12 @@ will act as if the input contained a link line of the form
 .ti +.5i
 .ta \w'Link\0\0'u  +\w'\fItimezone\fP\0\0'u
 Link	\fItimezone\fP		localtime
+.sp
+If
+.I timezone
+is
+.BR \*- ,
+any already-existing link is removed.
 .TP
 .BI "\*-L " leapsecondfilename
 Read leap second information from the file with the given name.
@@ -109,6 +115,12 @@ and it should not be combined with
 if
 .IR timezone 's
 transitions are at standard time or Universal Time (UT) instead of local time.
+.sp
+If
+.I timezone
+is
+.BR \*- ,
+any already-existing link is removed.
 .TP
 .BR "\*-r " "[\fB@\fP\fIlo\fP][\fB/@\fP\fIhi\fP]"
 Reduce the size of output files by limiting their applicability
diff --git a/zic.c b/zic.c
index 2875b55..c874b04 100644
--- a/zic.c
+++ b/zic.c
@@ -981,6 +981,7 @@ hardlinkerr(char const *from, char const *to)
 static void
 dolink(char const *fromfield, char const *tofield, bool staysymlink)
 {
+	bool remove_only = strcmp(fromfield, "-") == 0;
 	bool todirs_made = false;
 	int link_errno;
 
@@ -988,7 +989,7 @@ dolink(char const *fromfield, char const *tofield, bool staysymlink)
 	** We get to be careful here since
 	** there's a fair chance of root running us.
 	*/
-	if (itsdir(fromfield)) {
+	if (!remove_only && itsdir(fromfield)) {
 		fprintf(stderr, _("%s: link from %s/%s failed: %s\n"),
 			progname, directory, fromfield, strerror(EPERM));
 		exit(EXIT_FAILURE);
@@ -1003,6 +1004,8 @@ dolink(char const *fromfield, char const *tofield, bool staysymlink)
 		  progname, directory, tofield, e);
 	  exit(EXIT_FAILURE);
 	}
+	if (remove_only)
+	  return;
 	link_errno = staysymlink ? ENOTSUP : hardlinkerr(fromfield, tofield);
 	if (link_errno == ENOENT && !todirs_made) {
 	  mkdirs(tofield, true);
-- 
2.17.1



More information about the tz mailing list