[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