From: Michel Normand Date: Fri, 13 Nov 2009 10:48:29 +0000 (+0100) Subject: lxc: add a new lxc.mount.entry keyword X-Git-Tag: lxc-2.1.1~3125 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=e7938e9ee33e598a113e8534f26ef3fe9844e14f;p=mirror_lxc.git lxc: add a new lxc.mount.entry keyword The purpose of this new keyword is to save in main config file all the lines of a provided fstab file. This will ultimately replace the the lxc.mount keyword when lxc scripts will use the new keyword. Warning: I did not validated this patch in all conditions of provided malformed input string. Signed-off-by: Michel Normand Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 6930f76b9..ab324ab5c 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -536,23 +536,13 @@ static int parse_mntopts(struct mntent *mntent, unsigned long *mntflags, return 0; } -static int setup_mount(const char *fstab) +static int mount_file_entries(FILE *file) { struct mntent *mntent; - FILE *file; int ret = -1; unsigned long mntflags; char *mntdata; - if (!fstab) - return 0; - - file = setmntent(fstab, "r"); - if (!file) { - SYSERROR("failed to use '%s'", fstab); - return -1; - } - while ((mntent = getmntent(file))) { mntflags = 0; @@ -580,10 +570,55 @@ static int setup_mount(const char *fstab) INFO("mount points have been setup"); out: + return ret; +} + +static int setup_mount(const char *fstab) +{ + FILE *file; + int ret; + + if (!fstab) + return 0; + + file = setmntent(fstab, "r"); + if (!file) { + SYSERROR("failed to use '%s'", fstab); + return -1; + } + + ret = mount_file_entries(file); + endmntent(file); return ret; } +static int setup_mount_entries(struct lxc_list *mount) +{ + FILE *file; + struct lxc_list *iterator; + char *mount_entry; + int ret; + + file = tmpfile(); + if (!file) { + ERROR("tmpfile error: %m"); + return -1; + } + + lxc_list_for_each(iterator, mount) { + mount_entry = iterator->elem; + fprintf(file, "%s", mount_entry); + } + + rewind(file); + + ret = mount_file_entries(file); + + fclose(file); + return ret; +} + static int setup_hw_addr(char *hwaddr, const char *ifname) { struct sockaddr sockaddr; @@ -787,6 +822,7 @@ int lxc_conf_init(struct lxc_conf *conf) conf->console[0] = '\0'; lxc_list_init(&conf->cgroup); lxc_list_init(&conf->network); + lxc_list_init(&conf->mount_list); return 0; } @@ -1040,6 +1076,11 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf) return -1; } + if (setup_mount_entries(&lxc_conf->mount_list)) { + ERROR("failed to setup the mount entries for '%s'", name); + return -1; + } + if (setup_console(lxc_conf->rootfs, lxc_conf->console)) { ERROR("failed to setup the console for '%s'", name); return -1; diff --git a/src/lxc/conf.h b/src/lxc/conf.h index aeb799c72..8a3ebf092 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -136,6 +136,7 @@ struct lxc_conf { struct utsname *utsname; struct lxc_list cgroup; struct lxc_list network; + struct lxc_list mount_list; struct lxc_tty_info tty_info; char console[MAXPATHLEN]; }; diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 900ecc3e3..5e0081cb8 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -441,7 +441,7 @@ static int config_cgroup(const char *key, char *value, struct lxc_conf *lxc_conf return 0; } -static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_fstab(const char *key, char *value, struct lxc_conf *lxc_conf) { if (strlen(value) >= MAXPATHLEN) { ERROR("%s path is too long", value); @@ -457,6 +457,40 @@ static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf) return 0; } +static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf) +{ + char *fstab_token = "lxc.mount"; + char *token = "lxc.mount.entry"; + char *subkey; + char *mntelem; + struct lxc_list *mntlist; + + subkey = strstr(key, token); + + if (!subkey) { + subkey = strstr(key, fstab_token); + + if (!subkey) + return -1; + + return config_fstab(key, value, lxc_conf); + } + + if (!strlen(subkey)) + return -1; + + mntlist = malloc(sizeof(*mntlist)); + if (!mntlist) + return -1; + + mntelem = strdup(value); + mntlist->elem = mntelem; + + lxc_list_add_tail(&lxc_conf->mount_list, mntlist); + + return 0; +} + static int config_rootfs(const char *key, char *value, struct lxc_conf *lxc_conf) { if (strlen(value) >= MAXPATHLEN) {