Split figureout_rootfs() off from cleate_run_template() to allow common use of the function.
Signed-off-by: TAMUKI Shoichi <tam...@linet.gr.jp> --- src/lxc/lxccontainer.c | 104 +++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 4f90f35..b2ecfb3 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -876,6 +876,8 @@ static char *lxcbasename(char *path) return p; } +static char *figureout_rootfs(struct lxc_conf *conf); + static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet, char *const argv[]) { @@ -891,8 +893,7 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet } if (pid == 0) { // child - char *patharg, *namearg, *rootfsarg, *src; - struct bdev *bdev = NULL; + char *patharg, *namearg, *rootfsarg, *rootfs; int i; int ret, len, nargs = 0; char **newargv; @@ -907,49 +908,7 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet open("/dev/null", O_RDWR); } - src = c->lxc_conf->rootfs.path; - /* - * for an overlay create, what the user wants is the template to fill - * in what will become the readonly lower layer. So don't mount for - * the template - */ - if (strncmp(src, "overlayfs:", 10) == 0) - src = overlay_getlower(src+10); - if (strncmp(src, "aufs:", 5) == 0) - src = overlay_getlower(src+5); - - bdev = bdev_init(c->lxc_conf, src, c->lxc_conf->rootfs.mount, NULL); - if (!bdev) { - ERROR("Error opening rootfs"); - exit(1); - } - - if (geteuid() == 0) { - if (unshare(CLONE_NEWNS) < 0) { - ERROR("error unsharing mounts"); - exit(1); - } - if (detect_shared_rootfs()) { - if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL)) { - SYSERROR("Failed to make / rslave to run template"); - ERROR("Continuing..."); - } - } - } - if (strcmp(bdev->type, "dir") && strcmp(bdev->type, "btrfs")) { - if (geteuid() != 0) { - ERROR("non-root users can only create btrfs and directory-backed containers"); - exit(1); - } - if (bdev->ops->mount(bdev) < 0) { - ERROR("Error mounting rootfs"); - exit(1); - } - } else { // TODO come up with a better way here! - if (bdev->dest) - free(bdev->dest); - bdev->dest = strdup(bdev->src); - } + rootfs=figureout_rootfs(conf); /* * create our new array, pre-pend the template name and @@ -981,11 +940,11 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet exit(1); newargv[2] = namearg; - len = strlen("--rootfs=") + 1 + strlen(bdev->dest); + len = strlen("--rootfs=") + 1 + strlen(rootfs); rootfsarg = malloc(len); if (!rootfsarg) exit(1); - ret = snprintf(rootfsarg, len, "--rootfs=%s", bdev->dest); + ret = snprintf(rootfsarg, len, "--rootfs=%s", rootfs); if (ret < 0 || ret >= len) exit(1); newargv[3] = rootfsarg; @@ -1125,6 +1084,57 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet return true; } +static char *figureout_rootfs(struct lxc_conf *conf) +{ + char *src; + struct bdev *bdev = NULL; + + src = conf->rootfs.path; + /* + * for an overlay create, what the user wants is the template to fill + * in what will become the readonly lower layer. So don't mount for + * the template + */ + if (strncmp(src, "overlayfs:", 10) == 0) + src = overlay_getlower(src+10); + if (strncmp(src, "aufs:", 5) == 0) + src = overlay_getlower(src+5); + + bdev = bdev_init(conf, src, conf->rootfs.mount, NULL); + if (!bdev) { + ERROR("Error opening rootfs"); + exit(1); + } + + if (geteuid() == 0) { + if (unshare(CLONE_NEWNS) < 0) { + ERROR("error unsharing mounts"); + exit(1); + } + if (detect_shared_rootfs()) { + if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL)) { + SYSERROR("Failed to make / rslave to run template"); + ERROR("Continuing..."); + } + } + } + if (strcmp(bdev->type, "dir") && strcmp(bdev->type, "btrfs")) { + if (geteuid() != 0) { + ERROR("non-root users can only create btrfs and directory-backed containers"); + exit(1); + } + if (bdev->ops->mount(bdev) < 0) { + ERROR("Error mounting rootfs"); + exit(1); + } + } else { // TODO come up with a better way here! + if (bdev->dest) + free(bdev->dest); + bdev->dest = strdup(bdev->src); + } + return bdev->dest; +} + static bool prepend_lxc_header(char *path, const char *t, char *const argv[]) { long flen; -- 1.9.0 _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel