Add a -o mountprog parameter to mount which explicitly allows

an alternative program to be used for mounting a file system.
Ideally, all file systems
should be converted to pass string arguments to nmount(), so that
/sbin/mount can handle them.  However, certain file systems such as FUSE have
not done this, and want to have their own userland mount programs.

For example, to mount an NTFS file system with the FUSE NTFS driver:

mount -t ntfs -o mountprog=/usr/local/bin/ntfs-3g /dev/acd0 /mnt

or via an fstab entry:

/dev/acd0  /mnt  ntfs    ro,noauto,mountprog=/usr/local/bin/ntfs-3g       0       0

PR:	120784
Requested by: Dominic Fandrey
This commit is contained in:
rodrigc 2009-03-05 08:57:35 +00:00
parent 359ccc0fed
commit bfed6ac3d6
2 changed files with 39 additions and 4 deletions

View File

@ -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.

View File

@ -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,