summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sbin/mount/mount.89
-rw-r--r--sbin/mount/mount.c34
2 files changed, 39 insertions, 4 deletions
diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8
index 4c55df8..7635d74 100644
--- a/sbin/mount/mount.8
+++ b/sbin/mount/mount.8
@@ -163,6 +163,15 @@ is run with the
flag but without the
.Fl l
flag.
+.It Cm mountprog Ns = Ns Aq Ar program
+Force
+.Nm
+to use the specified program to mount the file system, instead of calling
+.Xr nmount 2
+directly. For example:
+.Bd -literal
+mount -t foofs -o mountprog=/mydir/fooprog /dev/acd0 /mnt
+.Ed
.It Cm multilabel
Enable multi-label Mandatory Access Control, or MAC, on the specified file
system.
diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c
index 66b9c13..e11c1c2 100644
--- a/sbin/mount/mount.c
+++ b/sbin/mount/mount.c
@@ -129,6 +129,8 @@ remountable_fs_names[] = {
static const char userquotaeq[] = "userquota=";
static const char groupquotaeq[] = "groupquota=";
+static char *mountprog = NULL;
+
static int
use_mountprog(const char *vfstype)
{
@@ -143,6 +145,9 @@ use_mountprog(const char *vfstype)
NULL
};
+ if (mountprog != NULL)
+ return (1);
+
for (i = 0; fs[i] != NULL; ++i) {
if (strcmp(vfstype, fs[i]) == 0)
return (1);
@@ -165,8 +170,10 @@ exec_mountprog(const char *name, const char *execname, char *const argv[])
/* Go find an executable. */
execvP(execname, _PATH_SYSPATH, argv);
if (errno == ENOENT) {
- warn("exec %s not found in %s", execname,
- _PATH_SYSPATH);
+ warn("exec %s not found", execname);
+ if (execname[0] != '/') {
+ warnx("in path: %s", _PATH_SYSPATH);
+ }
}
exit(1);
default: /* Parent. */
@@ -558,13 +565,16 @@ mountfs(const char *vfstype, const char *spec, const char *name, int flags,
mnt_argv.c = -1;
append_arg(&mnt_argv, execname);
mangle(optbuf, &mnt_argv);
+ if (mountprog != NULL)
+ strcpy(execname, mountprog);
+
append_arg(&mnt_argv, strdup(spec));
append_arg(&mnt_argv, strdup(name));
append_arg(&mnt_argv, NULL);
if (debug) {
if (use_mountprog(vfstype))
- printf("exec: mount_%s", vfstype);
+ printf("exec: %s", execname);
else
printf("mount -t %s", vfstype);
for (i = 1; i < mnt_argv.c; i++)
@@ -681,7 +691,7 @@ catopt(char *s0, const char *s1)
void
mangle(char *options, struct cpa *a)
{
- char *p, *s;
+ char *p, *s, *val;
for (s = options; (p = strsep(&s, ",")) != NULL;)
if (*p != '\0') {
@@ -703,6 +713,22 @@ mangle(char *options, struct cpa *a)
* before mountd starts.
*/
continue;
+ } else if (strncmp(p, "mountprog", 9) == 0) {
+ /*
+ * "mountprog" is used to force the use of
+ * userland mount programs.
+ */
+ val = strchr(p, '=');
+ if (val != NULL) {
+ ++val;
+ if (*val != '\0')
+ mountprog = strdup(val);
+ }
+
+ if (mountprog == NULL) {
+ errx(1, "Need value for -o mountprog");
+ }
+ continue;
} else if (strcmp(p, "userquota") == 0) {
continue;
} else if (strncmp(p, userquotaeq,
OpenPOWER on IntegriCloud