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>
---
 src/lxc/conf.c    |   63 +++++++++++++++++++++++++++++++++++++++++++---------
 src/lxc/conf.h    |    1 +
 src/lxc/confile.c |   36 +++++++++++++++++++++++++++++-
 3 files changed, 88 insertions(+), 12 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index f31687f..31fb3cb 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -677,23 +677,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;
@@ -721,10 +711,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;
@@ -928,6 +963,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;
 }
 
@@ -1207,6 +1243,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 c6e0496..b1e595a 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 900ecc3..e80a96c 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) {
-- 
1.6.3.3

-- 


