Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/mount_puffs Major rework on mount_puffs(8) so that it c...



details:   https://anonhg.NetBSD.org/src/rev/9da20b2ab93c
branches:  trunk
changeset: 349084:9da20b2ab93c
user:      pho <pho%NetBSD.org@localhost>
date:      Wed Nov 23 14:33:29 2016 +0000

description:
Major rework on mount_puffs(8) so that it can actually start file servers

Now you can do
  # mount_puffs -o rdonly rot13fs#/home/foo /mnt/rot13

or in fstab
  rot13fs#/home/foo  /mnt/rot13  puffs  rdonly

to start rot13fs with arguments identical to
  # rot13fs -o rdonly /home/foo /mnt/rot13

diffstat:

 sbin/mount_puffs/mount_puffs.8 |   96 ++++++++++++++++++++++-
 sbin/mount_puffs/mount_puffs.c |  160 +++++++++++++++++++++++++++++-----------
 2 files changed, 204 insertions(+), 52 deletions(-)

diffs (truncated from 326 to 300 lines):

diff -r 8400c6107c15 -r 9da20b2ab93c sbin/mount_puffs/mount_puffs.8
--- a/sbin/mount_puffs/mount_puffs.8    Wed Nov 23 09:50:52 2016 +0000
+++ b/sbin/mount_puffs/mount_puffs.8    Wed Nov 23 14:33:29 2016 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: mount_puffs.8,v 1.1 2010/01/14 21:25:48 pooka Exp $
+.\"    $NetBSD: mount_puffs.8,v 1.2 2016/11/23 14:33:29 pho Exp $
 .\"
 .\" Copyright (c) 2010 Antti Kantee.  All rights reserved.
 .\"
@@ -23,25 +23,107 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd January 14, 2010
+.Dd November 23, 2016
 .Dt MOUNT_PUFFS 8
 .Os
 .Sh NAME
 .Nm mount_puffs
-.Nd print arguments to puffs mounts
+.Nd helper utility for mounting puffs/refuse file systems
 .Sh SYNOPSIS
 .Nm
-.Fl o Ar getargs
-.Ar puffs
+.Op Fl o Ar options
+.Ar program Ns Op # Ns Ar source
 .Ar mount_point
 .Sh DESCRIPTION
 The
 .Nm
-program prints the kernel arguments for a puffs mount.
-It is typically executed by
+utility simply executes the given
+.Ar program ,
+allowing to mount
+.Xr puffs 4
+and
+.Xr refuse 3
+based file systems via
+.Ic mount -a
+or the
+.Xr fstab 5
+file.
+.Pp
+This command is usually only executed by
+.Xr mount 8 ,
+as users can directly execute file servers to mount them. The
+.Ar program
+parameter is either the path to the file server or the file name of
+it. In the latter case the
+.Ar program
+is searched in the
+.Ev PATH
+variable. The
+.Ar source
+parameter, when specified, will be passed to the
+.Ar program
+as its first non-option argument, with
+.Ar mount_point
+being the second one.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl o
+Options are specified with a
+.Fl o
+flag followed by a comma separated string of options. They are passed to the
+.Ar program
+without any modifications except for
+.Cm getargs ,
+which is typically used by
 .Ic mount -vv .
+When there is
+.Cm getargs
+in the list,
+.Nm
+discards all the other options and prints the kernel arguments for a
+.Xr puffs 4
+file system already mounted at
+.Ar mount_point .
+.El
+.Sh EXAMPLES
+Mount
+.Ic dmesgfs
+at
+.Pa /dmesg :
+.Dl # mount_puffs dmesgfs /dmesg
+.Pp
+Or in
+.Xr fstab 5 :
+.Bd -literal -offset indent -compact
+dmegfs  /dmesg  puffs  rw
+.Ed
+.Pp
+These are equivalent to:
+.Dl # dmesgfs /dmesg
+.Pp
+Mount
+.Pa /usr/bin/rot13fs
+for
+.Pa /home/foo
+at
+.Pa /mnt/rot13
+with option
+.Fl o Cm rdonly :
+.Dl # mount_puffs -o rdonly /usr/bin/rot13fs#/home/foo /mnt/rot13
+.Pp
+Or in
+.Xr fstab 5 :
+.Bd -literal -offset indent -compact
+/usr/bin/rot13fs#/home/foo  /mnt/rot13  puffs  rdonly
+.Ed
+.Pp
+These are equivalent to:
+.Dl # /usr/bin/rot13fs -o rdonly /home/foo /mnt/rot13
 .Sh SEE ALSO
 .Xr puffs 4 ,
+.Xr refuse 3 ,
+.Xr fusermount 8 ,
 .Xr mount 8
 .Sh HISTORY
 The
diff -r 8400c6107c15 -r 9da20b2ab93c sbin/mount_puffs/mount_puffs.c
--- a/sbin/mount_puffs/mount_puffs.c    Wed Nov 23 09:50:52 2016 +0000
+++ b/sbin/mount_puffs/mount_puffs.c    Wed Nov 23 14:33:29 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mount_puffs.c,v 1.4 2011/08/29 14:35:02 joerg Exp $    */
+/*     $NetBSD: mount_puffs.c,v 1.5 2016/11/23 14:33:29 pho Exp $      */
 
 /*
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -26,13 +26,14 @@
  */
 
 /*
- * This is to support -o getargs without having to replicate
- * it in every file server.
+ * This is to support -o getargs without having to replicate it in
+ * every file server. It also allows puffs filesystems to be mounted
+ * via "mount -a".
  */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mount_puffs.c,v 1.4 2011/08/29 14:35:02 joerg Exp $");
+__RCSID("$NetBSD: mount_puffs.c,v 1.5 2016/11/23 14:33:29 pho Exp $");
 #endif /* !lint */
 
 #include <sys/param.h>
@@ -41,61 +42,29 @@
 #include <fs/puffs/puffs_msgif.h>
 
 #include <err.h>
-#include <mntopts.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <sys/cdefs.h>
 #include <unistd.h>
+#include <util.h>
 
-const struct mntopt getargmopt[] = {
-       MOPT_GETARGS,
-       MOPT_NULL,
-};
-
-__dead static void
+static int
 usage(void)
 {
 
-       fprintf(stderr, "usage: %s -o getargs spec dir\n", getprogname());
-       exit(1);
+       fprintf(stderr, "usage: %s [-o options] program[#source] mountpoint\n", getprogname());
+       return 1;
 }
 
-int
-main(int argc, char *argv[])
+static int show_puffs_mount_args(const char *mountpoint)
 {
        const char *vtypes[] = { VNODE_TYPES };
        struct puffs_kargs kargs;
-       mntoptparse_t mp;
-       int mntflags, f;
-       int ch;
-
-       if (argc < 3)
-               usage();
 
-       mntflags = 0;
-       while ((ch = getopt(argc, argv, "o:")) != -1) {
-               switch (ch) {
-               case 'o':
-                       mp = getmntopts(optarg, getargmopt, &mntflags, &f);
-                       if (mp == NULL)
-                               err(1, "getmntopts");
-                       freemntopts(mp);
-                       break;
-               default:
-                       usage();
-               }
-       }
-       argc -= optind;
-       argv += optind;
+       if (mount(MOUNT_PUFFS, mountpoint, MNT_GETARGS, &kargs, sizeof(kargs)) == -1)
+               err(1, "mount");
 
-       if (argc != 2)
-               usage();
-
-       if (mntflags != MNT_GETARGS)
-               usage();
-
-       if (mount(MOUNT_PUFFS, argv[1], mntflags, &kargs, sizeof(kargs)) == -1)
-               err(1, "mount");
-       
        printf("version=%d, ", kargs.pa_vers);
        printf("flags=0x%x, ", kargs.pa_flags);
 
@@ -111,3 +80,104 @@
 
        return 0;
 }
+
+static int
+mount_puffs_filesystem(const char *program, const char *opts,
+                                       const char *source, const char *mountpoint)
+{
+       int argc = 0;
+       const char **argv;
+       int rv = 0;
+
+       /* Construct an argument vector:
+        * program [-o opts] [source] mountpoint */
+       argv = ecalloc(1 + 2 + 1 + 1, sizeof(*argv));
+       argv[argc++] = program;
+       if (opts != NULL) {
+               argv[argc++] = "-o";
+               argv[argc++] = opts;
+       }
+       if (source != NULL) {
+               argv[argc++] = source;
+       }
+       argv[argc++] = mountpoint;
+       argv[argc] = NULL;
+
+       /* We intentionally use execvp(3) here because the program can
+        * actually be a basename. */
+       if (execvp(program, __UNCONST(argv)) == -1) {
+               warn("Cannot execute %s", program);
+               rv = 1;
+       }
+
+       free(argv);
+       return rv;
+}
+
+static void add_opt(char **opts, const char *opt)
+{
+       const size_t orig_len = *opts == NULL ? 0 : strlen(*opts);
+
+       *opts = erealloc(*opts, orig_len + 1 + strlen(opt) + 1);
+
+       if (orig_len == 0) {
+               strcpy(*opts, opt);
+       }
+       else {
+               strcat(*opts, ",");
+               strcat(*opts, opt);
+       }
+}
+
+int
+main(int argc, char *argv[])
+{
+       int mntflags = 0;
+       int ch;
+       char *opts = NULL;
+       int rv = 0;
+
+       while ((ch = getopt(argc, argv, "o:")) != -1) {
+               switch (ch) {
+               case 'o':
+                       for (char *opt = optarg; (opt = strtok(opt, ",")) != NULL; opt = NULL) {
+                               if (strcmp(opt, "getargs") == 0) {
+                                       mntflags |= MNT_GETARGS;
+                                       break; /* No need to parse it any further. */
+                               }
+                               else {
+                                       add_opt(&opts, opt);
+                               }
+                       }
+                       break;
+               default:
+                       rv = usage();
+                       goto free_opts;
+               }
+       }



Home | Main Index | Thread Index | Old Index