return 0;
}
-static void append_option(struct libmnt_context *cxt, const char *opt)
+static void append_option(struct libmnt_context *cxt, const char *opt, const char *arg)
{
+ char *o = NULL;
+
if (opt && (*opt == '=' || *opt == '\'' || *opt == '\"' || isblank(*opt)))
errx(MNT_EX_USAGE, _("unsupported option format: %s"), opt);
- if (mnt_context_append_options(cxt, opt))
- err(MNT_EX_SYSERR, _("failed to append option '%s'"), opt);
+
+ if (arg && *arg)
+ xasprintf(&o, "%s=\"%s\"", opt, arg);
+
+ if (mnt_context_append_options(cxt, o ? : opt))
+ err(MNT_EX_SYSERR, _("failed to append option '%s'"), o ? : opt);
+
+ free(o);
}
static int has_remount_flag(struct libmnt_context *cxt)
fprintf(out, _(
" -l, --show-labels show also filesystem labels\n"));
fprintf(out, _(
+ " -m, --mkdir[=<mode>] alias to '-o X-mount.mkdir[=<mode>]'\n"));
+ fprintf(out, _(
" -n, --no-mtab don't write to /etc/mtab\n"));
fprintf(out, _(
" --options-mode <mode>\n"
{ "make-rslave", no_argument, NULL, MOUNT_OPT_RSLAVE },
{ "make-rprivate", no_argument, NULL, MOUNT_OPT_RPRIVATE },
{ "make-runbindable", no_argument, NULL, MOUNT_OPT_RUNBINDABLE },
+ { "mkdir", optional_argument, NULL, 'm' },
{ "no-canonicalize", no_argument, NULL, 'c' },
{ "internal-only", no_argument, NULL, 'i' },
{ "show-labels", no_argument, NULL, 'l' },
mnt_context_set_tables_errcb(cxt, table_parser_errcb);
- while ((c = getopt_long(argc, argv, "aBcfFhilL:Mno:O:rRsU:vVwt:T:N:",
+ while ((c = getopt_long(argc, argv, "aBcfFhilL:m::Mno:O:rRsU:vVwt:T:N:",
longopts, NULL)) != -1) {
/* only few options are allowed for non-root users */
mnt_context_disable_mtab(cxt, TRUE);
break;
case 'r':
- append_option(cxt, "ro");
+ append_option(cxt, "ro", NULL);
mnt_context_enable_rwonly_mount(cxt, FALSE);
break;
case 'v':
mnt_context_enable_verbose(cxt, TRUE);
break;
case 'w':
- append_option(cxt, "rw");
+ append_option(cxt, "rw", NULL);
mnt_context_enable_rwonly_mount(cxt, TRUE);
break;
case 'o':
mnt_optstr_remove_option(&o, "move");
if (o && *o)
- append_option(cxt, o);
+ append_option(cxt, o, NULL);
oper = is_move = 1;
free(o);
} else
- append_option(cxt, optarg);
+ append_option(cxt, optarg, NULL);
break;
case 'O':
if (mnt_context_set_options_pattern(cxt, optarg))
break;
case 'B':
oper = 1;
- append_option(cxt, "bind");
+ append_option(cxt, "bind", NULL);
break;
case 'M':
oper = 1;
is_move = 1;
break;
+ case 'm':
+ if (optarg && *optarg == '=')
+ optarg++;
+ append_option(cxt, "X-mount.mkdir", optarg);
+ break;
case 'R':
oper = 1;
- append_option(cxt, "rbind");
+ append_option(cxt, "rbind", NULL);
break;
case 'N':
{
break;
}
case MOUNT_OPT_SHARED:
- append_option(cxt, "shared");
+ append_option(cxt, "shared", NULL);
propa = 1;
break;
case MOUNT_OPT_SLAVE:
- append_option(cxt, "slave");
+ append_option(cxt, "slave", NULL);
propa = 1;
break;
case MOUNT_OPT_PRIVATE:
- append_option(cxt, "private");
+ append_option(cxt, "private", NULL);
propa = 1;
break;
case MOUNT_OPT_UNBINDABLE:
- append_option(cxt, "unbindable");
+ append_option(cxt, "unbindable", NULL);
propa = 1;
break;
case MOUNT_OPT_RSHARED:
- append_option(cxt, "rshared");
+ append_option(cxt, "rshared", NULL);
propa = 1;
break;
case MOUNT_OPT_RSLAVE:
- append_option(cxt, "rslave");
+ append_option(cxt, "rslave", NULL);
propa = 1;
break;
case MOUNT_OPT_RPRIVATE:
- append_option(cxt, "rprivate");
+ append_option(cxt, "rprivate", NULL);
propa = 1;
break;
case MOUNT_OPT_RUNBINDABLE:
- append_option(cxt, "runbindable");
+ append_option(cxt, "runbindable", NULL);
propa = 1;
break;
case MOUNT_OPT_TARGET: