diff --git a/src/lxc/conf.c b/src/lxc/conf.c index b27a11d14..d6dd2e20a 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -51,10 +51,10 @@ #include "error.h" #include "parse.h" #include "config.h" - -#include -#include -#include /* for lxc_cgroup_set() */ +#include "utils.h" +#include "conf.h" +#include "log.h" +#include "lxc.h" /* for lxc_cgroup_set() */ lxc_log_define(lxc_conf, lxc); @@ -488,12 +488,21 @@ static int setup_rootfs_pivot_root(const char *rootfs, const char *pivotdir) } pivotdir_is_temp = 1; - } - else { - snprintf(path, sizeof(path), ".%s", pivotdir); + } else { + + snprintf(path, sizeof(path), "%s/%s", rootfs, pivotdir); + + if (access(path, F_OK)) { + if (mkdir_p(path, 0755)) { + SYSERROR("failed to create pivotdir '%s'", path); + return -1; + } + + DEBUG("created '%s' directory", path); + } } - DEBUG("temporary mountpoint for old rootfs is '%s'", path); + DEBUG("mountpoint for old rootfs is '%s'", path); /* pivot_root into our new root fs */ diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 5f3745c78..6279d77b5 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "log.h" @@ -163,3 +164,30 @@ extern int get_u16(ushort *val, const char *arg, int base) return 0; } +extern int mkdir_p(char *dir, mode_t mode) +{ + int ret; + char *d; + + if (!strcmp(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; + } + + return 0; +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 9fd5815b5..114b6688b 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -53,3 +53,4 @@ extern int lxc_copy_file(const char *src, const char *dst); extern int lxc_setup_fs(void); extern int get_u16(ushort *val, const char *arg, int base); +extern int mkdir_p(const char *dir, mode_t mode);