]> git.proxmox.com Git - mirror_lxc.git/commitdiff
utils: reimplement/fix mkdir_p() (v2)
authorRichard Weinberger <richard@nod.at>
Wed, 17 Apr 2013 21:54:09 +0000 (23:54 +0200)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 18 Apr 2013 08:57:19 +0000 (10:57 +0200)
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@nod.at>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/utils.c

index e07ca7b13a88a2f84b3c2813d9318e55b34aa4b6..6a154f916316dc2691ad3ea563e55fe8175eb906 100644 (file)
@@ -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;
 }