diff options
-rw-r--r-- | sbin/mount/mount.8 | 9 | ||||
-rw-r--r-- | sbin/mount/mount.c | 34 |
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, |