[lxc-devel] [PATCH] utils: reimplement/fix mkdir_p()

Richard Weinberger richard at nod.at
Wed Apr 17 21:54:09 UTC 2013


Reimplement mkdir_p() such that it:
 ...handles relativ paths correctly. (currently it crashes)
 ...does not rely on dirname().
 ...is not recursive.
 ...is shorter. ;-)

Signed-off-by: Richard Weinberger <richard at nod.at>
---
 src/lxc/utils.c | 46 +++++++++++++++-------------------------------
 1 file changed, 15 insertions(+), 31 deletions(-)

diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index e07ca7b..6a154f9 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -95,39 +95,23 @@ extern int get_u16(unsigned short *val, const char *arg, int base)
 	return 0;
 }
 
-static int is_all_slashes(char *path)
-{
-	while (*path && *path == '/')
-		path++;
-	if (*path)
-		return 0;
-	return 1;
-}
-
 extern int mkdir_p(char *dir, mode_t mode)
 {
-	int ret;
-	char *d;
-
-	if (is_all_slashes(dir))
-		return 0;
-
-	d = strdup(dir);
-	if (!d)
-		return -1;
-
-	ret = mkdir_p(dirname(d), mode);
-	free(d);
-	if (ret)
-		return -1;
-
-	if (!access(dir, F_OK))
-		return 0;
-
-	if (mkdir(dir, mode)) {
-		SYSERROR("failed to create directory '%s'\n", dir);
-		return -1;
-	}
+	char *tmp = dir;
+	char *orig = dir;
+	char *makeme;
+
+	do {
+		dir = tmp + strspn(tmp, "/");
+		tmp = dir + strcspn(dir, "/");
+		makeme = strndupa(orig, dir - orig);
+		if (*makeme) {
+			if (mkdir(makeme, mode) && errno != EEXIST) {
+				SYSERROR("failed to create directory '%s'\n", makeme);
+				return -1;
+			}
+		}
+	} while(tmp != dir);
 
 	return 0;
 }
-- 
1.8.1.4





More information about the lxc-devel mailing list