aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Normand <michel.mno@free.fr>2009-11-13 11:48:29 +0100
committerDaniel Lezcano <dlezcano@fr.ibm.com>2009-11-13 11:48:29 +0100
commite7938e9ee33e598a113e8534f26ef3fe9844e14f (patch)
treeabc7ce309e3555e00fd6b93fcccf6cf2731b2152
parentstop config reading if cgroup setting failed (diff)
downloadlxc-e7938e9ee33e598a113e8534f26ef3fe9844e14f.tar.gz
lxc-e7938e9ee33e598a113e8534f26ef3fe9844e14f.tar.bz2
lxc-e7938e9ee33e598a113e8534f26ef3fe9844e14f.zip
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 <michel_mno@laposte.net> Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
-rw-r--r--src/lxc/conf.c63
-rw-r--r--src/lxc/conf.h1
-rw-r--r--src/lxc/confile.c36
3 files changed, 88 insertions, 12 deletions
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 6930f76..ab324ab 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 aeb799c..8a3ebf0 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..5e0081c 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) {