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;
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;
conf->console[0] = '\0';
lxc_list_init(&conf->cgroup);
lxc_list_init(&conf->network);
+ lxc_list_init(&conf->mount_list);
return 0;
}
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;
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);
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) {