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 | 48 +++++++++++++++++------------------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/src/lxc/utils.c b/src/lxc/utils.c index e07ca7b..9794553 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -95,39 +95,25 @@ 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 (!access(makeme, F_OK)) + return 0; + if (mkdir(makeme, mode)) { + 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