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 <rich...@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


------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to