[Toybox] [PATCH 3/3] Add support for -o x-mount.mkdir[=0755]
Isaac Dunham
ibid.ag at gmail.com
Sat Mar 28 14:11:54 PDT 2015
On Sat, Mar 28, 2015 at 08:38:14PM +0000, Isaac Dunham wrote:
> Add support for -o x-mount.mkdir[=0755]
>
> This is a feature of recent versions of util-linux, which allows
> creating a missing directory on mount.
> Probably it should actually be integrated into mount_filesystem()
> and made to check the existence/type of the source and mountpoint.
>
> Creating a chmod 0000 directory and using it as a mountpoint actually
> works, so we need something other than 0 for a magic "don't create a
> directory" value.
> So we use S_IFLNK as a magic flag, since we don't want to create a link.
Consider this patch an initial version.
I'm not sure what the ideal approach is, but this illustrates the concept.
> ---
> toys/lsb/mount.c | 27 ++++++++++++++++++++++-----
> 1 file changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/toys/lsb/mount.c b/toys/lsb/mount.c
> index 913a434..1711123 100644
> --- a/toys/lsb/mount.c
> +++ b/toys/lsb/mount.c
> @@ -77,7 +77,7 @@ GLOBALS(
> // TODO mount image.img sub (auto-loopback) then umount image.img
>
> // Strip flags out of comma separated list of options, return flags,.
> -static long flag_opts(char *new, long flags, char **more)
> +static long flag_opts(char *new, long flags, char **more, mode_t *mode)
> {
> struct {
> char *name;
> @@ -126,7 +126,11 @@ static long flag_opts(char *new, long flags, char **more)
> *more = xrealloc(*more, i + strlen(new) + 2);
> if (i) (*more)[i++] = ',';
> strcpy(i+*more, new);
> - } //TODO: handle x-mount.mkdir[=mode] option
> + } else if (!strncmp(new, "x-mount.mkdir", 13)) {
> + // handle x-mount.mkdir[=mode] option
> + if (new[13] == '=') *mode = (mode_t)strtol(new + 14, NULL, 8);
> + else *mode = 0755;
> + }
> }
>
> if (!comma) break;
> @@ -251,6 +255,7 @@ void mount_main(void)
> {
> char *opts = 0, *dev = 0, *dir = 0, **ss;
> long flags = MS_SILENT;
> + mode_t dirmode = S_IFLNK;
> struct arg_list *o;
> struct mtab_list *mtl, *mtl2 = 0, *mm, *remount;
>
> @@ -332,9 +337,15 @@ void mount_main(void)
>
> // user only counts from fstab, not opts.
> if (!mmm) {
> + dirmode = S_IFLNK;
> TT.okuser = comma_scan(mm->opts, "user", 1);
> - aflags = flag_opts(mm->opts, flags, &aopts);
> - aflags = flag_opts(opts, aflags, &aopts);
> + aflags = flag_opts(mm->opts, flags, &aopts, &dirmode);
> + aflags = flag_opts(opts, aflags, &aopts, &dirmode);
> +
> + if (!getuid() && !(dirmode & S_IFLNK)) {
> + mkpathat(AT_FDCWD, mm->dir, dirmode, 2);
> + mkdir(dir, dirmode);
> + }
>
> mount_filesystem(mm->device, mm->dir, mm->type, aflags, aopts);
> } // TODO else if (getuid()) error_msg("already there") ?
> @@ -365,8 +376,14 @@ void mount_main(void)
> // two arguments
> } else {
> char *more = 0;
> + long aflags = flag_opts(opts, flags, &more, &dirmode);
> +
> + if (!getuid() && !(dirmode & S_IFLNK)) {
> + mkpathat(AT_FDCWD, dir, dirmode, 2);
> + mkdir(dir, dirmode);
> + }
>
> - mount_filesystem(dev, dir, TT.type, flag_opts(opts, flags, &more), more);
> + mount_filesystem(dev, dir, TT.type, aflags, more);
> if (CFG_TOYBOX_FREE) free(more);
> }
> }
> --
> 2.1.4
>
1427577114.0
More information about the Toybox
mailing list