Date: Tue, 24 Mar 2009 01:31:42 +0000 (UTC) From: "David E. O'Brien" <obrien@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r190355 - stable/7/sbin/mount Message-ID: <200903240131.n2O1Vgts027851@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903240131.n2O1Vgts027851>