svn commit: r190355 - stable/7/sbin/mount
David E. O'Brien
obrien at FreeBSD.org
Mon Mar 23 18:31:43 PDT 2009
Author: obrien
Date: Tue Mar 24 01:31:42 2009
New Revision: 190355
URL: http://svn.freebsd.org/changeset/base/190355
Log:
MFC:
r189397: Add a -o mountprog parameter to mount which explicitly allows an
alternative program to be used for mounting a file system.
r187035/r187093/r187130: Don't overflow buffers when processing -o options.
Modified:
stable/7/sbin/mount/ (props changed)
stable/7/sbin/mount/mount.8
stable/7/sbin/mount/mount.c
Modified: stable/7/sbin/mount/mount.8
==============================================================================
--- stable/7/sbin/mount/mount.8 Tue Mar 24 01:22:12 2009 (r190354)
+++ stable/7/sbin/mount/mount.8 Tue Mar 24 01:31:42 2009 (r190355)
@@ -28,7 +28,7 @@
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
.\" $FreeBSD$
.\"
-.Dd July 12, 2006
+.Dd March 11, 2008
.Dt MOUNT 8
.Os
.Sh NAME
@@ -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.
@@ -335,14 +344,14 @@ For example, the
.Nm
command:
.Bd -literal -offset indent
-mount -t unionfs -o -b /sys $HOME/sys
+mount -t cd9660 -o -e /dev/cd0 /cdrom
.Ed
.Pp
causes
.Nm
to execute the equivalent of:
.Bd -literal -offset indent
-/sbin/mount_unionfs -b /sys $HOME/sys
+/sbin/mount_cd9660 -e /dev/cd0 /cdrom
.Ed
.Pp
Additional options specific to file system types
@@ -510,7 +519,6 @@ support for a particular file system mig
.Xr mount_nwfs 8 ,
.Xr mount_portalfs 8 ,
.Xr mount_smbfs 8 ,
-.Xr mount_std 8 ,
.Xr mount_udf 8 ,
.Xr mount_unionfs 8 ,
.Xr umount 8
Modified: stable/7/sbin/mount/mount.c
==============================================================================
--- stable/7/sbin/mount/mount.c Tue Mar 24 01:22:12 2009 (r190354)
+++ stable/7/sbin/mount/mount.c Tue Mar 24 01:31:42 2009 (r190355)
@@ -31,16 +31,14 @@
static const char copyright[] =
"@(#) Copyright (c) 1980, 1989, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
#if 0
static char sccsid[] = "@(#)mount.c 8.25 (Berkeley) 5/8/95";
#endif
-static const char rcsid[] =
- "$FreeBSD$";
#endif /* not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/stat.h>
@@ -70,12 +68,18 @@ static const char rcsid[] =
int debug, fstab_style, verbose;
+struct cpa {
+ char **a;
+ ssize_t sz;
+ int c;
+};
+
char *catopt(char *, const char *);
struct statfs *getmntpt(const char *);
int hasopt(const char *, const char *);
int ismounted(struct fstab *, struct statfs *, int);
int isremountable(const char *);
-void mangle(char *, int *, char *[]);
+void mangle(char *, struct cpa *);
char *update_options(char *, char *, int);
int mountfs(const char *, const char *, const char *,
int, const char *, const char *);
@@ -125,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)
{
@@ -139,11 +145,14 @@ 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);
}
-
+
return (0);
}
@@ -161,8 +170,10 @@ exec_mountprog(const char *name, const c
/* 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. */
@@ -208,7 +219,7 @@ static void
restart_mountd(void)
{
struct pidfh *pfh;
- pid_t mountdpid;
+ pid_t mountdpid;
pfh = pidfile_open(_PATH_MOUNTDPID, 0600, &mountdpid);
if (pfh != NULL) {
@@ -300,7 +311,7 @@ main(int argc, char *argv[])
if ((init_flags & MNT_UPDATE) && (ro == 0))
options = catopt(options, "noro");
-
+
rval = 0;
switch (argc) {
case 0:
@@ -497,14 +508,26 @@ hasopt(const char *mntopts, const char *
return (found);
}
+static void
+append_arg(struct cpa *sa, char *arg)
+{
+ if (sa->c + 1 == sa->sz) {
+ sa->sz = sa->sz == 0 ? 8 : sa->sz * 2;
+ sa->a = realloc(sa->a, sizeof(sa->a) * sa->sz);
+ if (sa->a == NULL)
+ errx(1, "realloc failed");
+ }
+ sa->a[++sa->c] = arg;
+}
+
int
mountfs(const char *vfstype, const char *spec, const char *name, int flags,
const char *options, const char *mntopts)
{
- char *argv[100];
struct statfs sf;
- int argc, i, ret;
+ int i, ret;
char *optbuf, execname[PATH_MAX], mntpath[PATH_MAX];
+ static struct cpa mnt_argv;
/* resolve the mountpoint with realpath(3) */
(void)checkpath(name, mntpath);
@@ -539,28 +562,31 @@ mountfs(const char *vfstype, const char
/* Construct the name of the appropriate mount command */
(void)snprintf(execname, sizeof(execname), "mount_%s", vfstype);
- argc = 0;
- argv[argc++] = execname;
- mangle(optbuf, &argc, argv);
- argv[argc++] = strdup(spec);
- argv[argc++] = strdup(name);
- argv[argc] = NULL;
+ 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 < argc; i++)
- (void)printf(" %s", argv[i]);
+ for (i = 1; i < mnt_argv.c; i++)
+ (void)printf(" %s", mnt_argv.a[i]);
(void)printf("\n");
return (0);
}
if (use_mountprog(vfstype)) {
- ret = exec_mountprog(name, execname, argv);
+ ret = exec_mountprog(name, execname, mnt_argv.a);
} else {
- ret = mount_fs(vfstype, argc, argv);
+ ret = mount_fs(vfstype, mnt_argv.c, mnt_argv.a);
}
free(optbuf);
@@ -663,12 +689,10 @@ catopt(char *s0, const char *s1)
}
void
-mangle(char *options, int *argcp, char *argv[])
+mangle(char *options, struct cpa *a)
{
- char *p, *s;
- int argc;
+ char *p, *s, *val;
- argc = *argcp;
for (s = options; (p = strsep(&s, ",")) != NULL;)
if (*p != '\0') {
if (strcmp(p, "noauto") == 0) {
@@ -689,6 +713,22 @@ mangle(char *options, int *argcp, char *
* 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,
@@ -700,19 +740,17 @@ mangle(char *options, int *argcp, char *
sizeof(groupquotaeq) - 1) == 0) {
continue;
} else if (*p == '-') {
- argv[argc++] = p;
+ append_arg(a, p);
p = strchr(p, '=');
if (p != NULL) {
*p = '\0';
- argv[argc++] = p+1;
+ append_arg(a, p + 1);
}
} else {
- argv[argc++] = strdup("-o");
- argv[argc++] = p;
+ append_arg(a, strdup("-o"));
+ append_arg(a, p);
}
}
-
- *argcp = argc;
}
More information about the svn-src-all
mailing list