Quoting Stéphane Graber (stgra...@ubuntu.com): > Just like we already had "optional", this adds two new LXC-specific > mount flags: > - create=dir (will do a mkdir_p on the path) > - create=file (will do a mkdir_p on the dirname + a fopen on the path) > > This was motivated by some of the needed bind-mounts for the > unprivileged containers. > > Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
Hopefully someone finds time to commonize the code :) Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> > --- > src/lxc/conf.c | 70 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 69 insertions(+), 1 deletion(-) > > diff --git a/src/lxc/conf.c b/src/lxc/conf.c > index 6542ce1..0beb12b 100644 > --- a/src/lxc/conf.c > +++ b/src/lxc/conf.c > @@ -1906,18 +1906,41 @@ static inline int mount_entry_on_systemfs(struct > mntent *mntent) > unsigned long mntflags; > char *mntdata; > int ret; > + FILE *pathfile = NULL; > + char* pathdirname = NULL; > > if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) { > ERROR("failed to parse mount option '%s'", mntent->mnt_opts); > return -1; > } > > + if (hasmntopt(mntent, "create=dir")) { > + if (!mkdir_p(mntent->mnt_dir, 0755)) { > + WARN("Failed to create mount target '%s'", > mntent->mnt_dir); > + ret = -1; > + } > + } > + > + if (hasmntopt(mntent, "create=file") && access(mntent->mnt_dir, F_OK)) { > + pathdirname = strdup(mntent->mnt_dir); > + pathdirname = dirname(pathdirname); > + mkdir_p(pathdirname, 0755); > + pathfile = fopen(mntent->mnt_dir, "wb"); > + if (!pathfile) { > + WARN("Failed to create mount target '%s'", > mntent->mnt_dir); > + ret = -1; > + } > + else > + fclose(pathfile); > + } > + > ret = mount_entry(mntent->mnt_fsname, mntent->mnt_dir, > mntent->mnt_type, mntflags, mntdata); > > if (hasmntopt(mntent, "optional") != NULL) > ret = 0; > > + free(pathdirname); > free(mntdata); > > return ret; > @@ -1933,6 +1956,8 @@ static int mount_entry_on_absolute_rootfs(struct mntent > *mntent, > char *mntdata; > int r, ret = 0, offset; > const char *lxcpath; > + FILE *pathfile = NULL; > + char *pathdirname = NULL; > > if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) { > ERROR("failed to parse mount option '%s'", mntent->mnt_opts); > @@ -1975,6 +2000,25 @@ skipabs: > goto out; > } > > + if (hasmntopt(mntent, "create=dir")) { > + if (!mkdir_p(path, 0755)) { > + WARN("Failed to create mount target '%s'", path); > + ret = -1; > + } > + } > + > + if (hasmntopt(mntent, "create=file") && access(path, F_OK)) { > + pathdirname = strdup(path); > + pathdirname = dirname(pathdirname); > + mkdir_p(pathdirname, 0755); > + pathfile = fopen(path, "wb"); > + if (!pathfile) { > + WARN("Failed to create mount target '%s'", path); > + ret = -1; > + } > + else > + fclose(pathfile); > + } > > ret = mount_entry(mntent->mnt_fsname, path, mntent->mnt_type, > mntflags, mntdata); > @@ -1983,6 +2027,7 @@ skipabs: > ret = 0; > > out: > + free(pathdirname); > free(mntdata); > return ret; > } > @@ -1994,25 +2039,48 @@ static int mount_entry_on_relative_rootfs(struct > mntent *mntent, > unsigned long mntflags; > char *mntdata; > int ret; > + FILE *pathfile = NULL; > + char *pathdirname = NULL; > > if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) { > ERROR("failed to parse mount option '%s'", mntent->mnt_opts); > return -1; > } > > - /* relative to root mount point */ > + /* relative to root mount point */ > ret = snprintf(path, sizeof(path), "%s/%s", rootfs, mntent->mnt_dir); > if (ret >= sizeof(path)) { > ERROR("path name too long"); > return -1; > } > > + if (hasmntopt(mntent, "create=dir")) { > + if (!mkdir_p(path, 0755)) { > + WARN("Failed to create mount target '%s'", path); > + ret = -1; > + } > + } > + > + if (hasmntopt(mntent, "create=file") && access(path, F_OK)) { > + pathdirname = strdup(path); > + pathdirname = dirname(pathdirname); > + mkdir_p(pathdirname, 0755); > + pathfile = fopen(path, "wb"); > + if (!pathfile) { > + WARN("Failed to create mount target '%s'", path); > + ret = -1; > + } > + else > + fclose(pathfile); > + } > + > ret = mount_entry(mntent->mnt_fsname, path, mntent->mnt_type, > mntflags, mntdata); > > if (hasmntopt(mntent, "optional") != NULL) > ret = 0; > > + free(pathdirname); > free(mntdata); > > return ret; > -- > 1.8.5.1 > > > ------------------------------------------------------------------------------ > Sponsored by Intel(R) XDK > Develop, test and display web and hybrid apps with a single code base. > Download it for free now! > http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk > _______________________________________________ > lxc-devel mailing list > lxc-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/lxc-devel ------------------------------------------------------------------------------ Sponsored by Intel(R) XDK Develop, test and display web and hybrid apps with a single code base. Download it for free now! http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk _______________________________________________ lxc-devel mailing list lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel