]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxc: add a new lxc.mount.entry keyword
authorMichel Normand <michel.mno@free.fr>
Fri, 13 Nov 2009 10:48:29 +0000 (11:48 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Fri, 13 Nov 2009 10:48:29 +0000 (11:48 +0100)
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 <michel_mno@laposte.net>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/conf.c
src/lxc/conf.h
src/lxc/confile.c

index 6930f76b93e6fde3483b82e6048e10d472b8f3b4..ab324ab5cdf900419b4782750a29d22654ec0835 100644 (file)
@@ -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;
index aeb799c72a811b04bcff832da001d7149b34004f..8a3ebf092149296a0552cc1fd87ddc1994c41c46 100644 (file)
@@ -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];
 };
index 900ecc3e398029e168ca823185453f8832fd42af..5e0081cb82214b51dffdbb58708ea9a3f17f155f 100644 (file)
@@ -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) {