summaryrefslogtreecommitdiffstats
path: root/sbin/mount
diff options
context:
space:
mode:
authorrodrigc <rodrigc@FreeBSD.org>2009-03-05 08:57:35 +0000
committerrodrigc <rodrigc@FreeBSD.org>2009-03-05 08:57:35 +0000
commitbfed6ac3d611dd6cc89954d48f661a05dba0a26b (patch)
tree360ef18032777ded3ef8ce338014a6d1061ab0fa /sbin/mount
parent359ccc0fed13dda0049f5c5df4f7d4b21e6d1c62 (diff)
downloadFreeBSD-src-bfed6ac3d611dd6cc89954d48f661a05dba0a26b.zip
FreeBSD-src-bfed6ac3d611dd6cc89954d48f661a05dba0a26b.tar.gz
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
Diffstat (limited to 'sbin/mount')
-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