[lxc-devel] [PATCH 1/2] Revert "utils: reimplement/fix mkdir_p()"

Stéphane Graber stgraber at ubuntu.com
Thu Apr 18 08:32:28 UTC 2013


This reverts commit 8de4140644f01180f2fdab55b0ab0f13d1c761c6.

This commit was preventing container startup on my machine, making them
all fail with various "No such file or directory" errors.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 src/lxc/utils.c | 48 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index 9794553..e07ca7b 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -95,25 +95,39 @@ 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)
 {
-	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 (!access(makeme, F_OK))
-				return 0;
-			if (mkdir(makeme, mode)) {
-				SYSERROR("failed to create directory '%s'\n", makeme);
-				return -1;
-			}
-		}
-	} while(tmp != dir);
+	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;
+	}
 
 	return 0;
 }
-- 
1.8.1.2





More information about the lxc-devel mailing list