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;
 }
 
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to