Quoting Richard Weinberger (rich...@nod.at):
> 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>

Thanks, this looks great.

Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>

> ---
>  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