[tz] [PROPOSED PATCH 1/5] zic now omits some mkdir and stat system calls

Paul Eggert eggert at cs.ucla.edu
Tue Sep 6 04:40:33 UTC 2016


* NEWS: Document this.
* zic.c (mkdirs): Do not mkdir a root directory.
Avoid unnecessary stat call.
---
 NEWS  |  2 ++
 zic.c | 24 +++++++++++++-----------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/NEWS b/NEWS
index f5a0b13..192deb7 100644
--- a/NEWS
+++ b/NEWS
@@ -55,6 +55,8 @@ Unreleased, experimental changes
     stamps on the reference platform.  (Thanks to Alexander Belopolsky
     for reporting the bug and suggesting a way forward.)
 
+    zic now avoids some unnecessary mkdir and stat system calls.
+
     zdump has a new -i option to generate transitions in a
     more-compact but still human-readable format.  This option is
     experimental, and the output format may change in future versions.
diff --git a/zic.c b/zic.c
index b8bd0a6..5ff78b4 100644
--- a/zic.c
+++ b/zic.c
@@ -3027,25 +3027,27 @@ mkdirs(char *argname)
 	if (argname == NULL || *argname == '\0')
 		return true;
 	cp = name = ecpyalloc(argname);
-	while ((cp = strchr(cp + 1, '/')) != 0) {
-		*cp = '\0';
+
+	/* Do not mkdir a root directory, as it must exist.  */
 #ifdef HAVE_DOS_FILE_NAMES
-		/*
-		** DOS drive specifier?
-		*/
-		if (is_alpha(name[0]) && name[1] == ':' && name[2] == '\0') {
-				*cp = '/';
-				continue;
-		}
+	if (is_alpha(name[0]) && name[1] == ':')
+	  cp += 2;
 #endif
+	while (*cp == '/')
+	  cp++;
+
+	for (; (cp = strchr(cp, '/')) != 0; cp++) {
+		*cp = '\0';
 		/*
 		** Try to create it.  It's OK if creation fails because
 		** the directory already exists, perhaps because some
-		** other process just created it.
+		** other process just created it.  For simplicity do
+		** not check first whether it already exists, as that
+		** is checked anyway if the mkdir fails.
 		*/
 		if (mkdir(name, MKDIR_UMASK) != 0) {
 			int err = errno;
-			if (itsdir(name) <= 0) {
+			if (err != EEXIST && itsdir(name) <= 0) {
 				char const *e = strerror(err);
 				warning(_("%s: Can't create directory"
 					  " %s: %s"),
-- 
2.7.4



More information about the tz mailing list