فهرست منبع

zic has new ‘-l -’ and ‘-p -’ options

* NEWS, zic.8: Mention this.
* zic.c (dolink): If fromfield is "-", simply remove tofield.
Paul Eggert 6 سال پیش
والد
کامیت
180f76a2d4
3فایلهای تغییر یافته به همراه19 افزوده شده و 1 حذف شده
  1. 3 0
      NEWS
  2. 12 0
      zic.8
  3. 4 1
      zic.c

+ 3 - 0
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.
 

+ 12 - 0
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

+ 4 - 1
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);