summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/vnconfig/Makefile6
-rw-r--r--usr.sbin/vnconfig/vnconfig.8165
-rw-r--r--usr.sbin/vnconfig/vnconfig.c368
3 files changed, 539 insertions, 0 deletions
diff --git a/usr.sbin/vnconfig/Makefile b/usr.sbin/vnconfig/Makefile
new file mode 100644
index 0000000..ba8a893
--- /dev/null
+++ b/usr.sbin/vnconfig/Makefile
@@ -0,0 +1,6 @@
+# $Id: Makefile,v 1.2 1993/12/23 07:04:31 cgd Exp $
+
+PROG= vnconfig
+MAN8= vnconfig.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/vnconfig/vnconfig.8 b/usr.sbin/vnconfig/vnconfig.8
new file mode 100644
index 0000000..50bde91
--- /dev/null
+++ b/usr.sbin/vnconfig/vnconfig.8
@@ -0,0 +1,165 @@
+.\" Copyright (c) 1993 University of Utah.
+.\" Copyright (c) 1980, 1989, 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Systems Programming Group of the University of Utah Computer
+.\" Science Department.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)vnconfig.8 8.1 (Berkeley) 6/5/93
+.\"
+.Dd July 8, 1993
+.Dt VNCONFIG 8
+.Os BSD 4
+.Sh NAME
+.Nm vnconfig
+.Nd configure and enable vnode disks
+.Sh SYNOPSIS
+.Nm vnconfig
+.Op Fl cdeuv
+.Ar special_file Ar regular_file
+.Oo Ar feature Oc
+.Nm vnconfig
+.Fl a
+.Op Fl cdeuv
+.Op Fl f Ar config_file
+.Sh DESCRIPTION
+The
+.Nm vnconfig
+command configures and enables vnode pseudo disk devices.
+The first form of the command will associate the special file
+.Ar special_file
+with the regular file
+.Ar regular_file
+allowing the latter to be accessed as though it were a disk.
+Hence a regular file within the filesystem can be used for swapping
+or can contain a filesystem that is mounted in the name space.
+.Pp
+Options indicate an action to be performed:
+.Bl -tag -width indent
+.It Fl c
+Configures the device.
+If successful, references to
+.Ar special_file
+will access the contents of
+.Ar regular_file .
+.It Fl e
+Configures the device and enables any
+.Ar feature
+that was specified.
+If no feature was specified,
+.Fl e
+is the same as
+.Fl c .
+.It Fl d
+Disables (if possible) the specified feature.
+.It Fl u
+Disables and ``unconfigures'' the device.
+.It Fl v
+Print messages to stdout describing actions taken.
+.El
+.Pp
+If no action option is given,
+.Fl c
+is assumed.
+.Pp
+The
+.Ar feature
+argument specifies a feature that can be enabled via the
+.Fl e
+option:
+.Bl -tag -width indent
+.It Dv swap
+Swapping is enabled on the special file.
+See
+.Xr swapon 2 .
+.It Dv Pf mountro= Pa mount_point
+The special file is mounted read-only on
+.Ar mount_point .
+See
+.Xr mount 2 .
+.It Dv Pf mountrw= Pa mount_point
+The special file is mounted read-write on
+.Ar mount_point .
+See
+.Xr mount 2 .
+.It Dv Pf mount= Pa mount_point
+Same as ``mountrw=''.
+.El
+.Pp
+The second (-a) form of the command reads a command file and performs the
+specified actions for each device/file pair.
+With
+.Fl f
+it reads the indicated configuration file
+.Ar config_file .
+Otherwise it uses a default configuration file.
+A configuration file contains one line per device/file pair in the form:
+.Bd -literal
+ special_file regular_file [ feature ]
+.Ed
+.Pp
+where fields are seperated by white space.
+The previously described action options serve to configure, enable,
+disable or unconfigure all devices in the configuration file.
+.Sh FILES
+.Bl -tag -width /etc/vntab -compact
+.It Pa /etc/vntab
+default configuration file for
+.Fl a
+option.
+.El
+.Sh EXAMPLES
+.Pp
+.Dl vnconfig /dev/vnd0c /tmp/diskimage
+.Pp
+Configures the vnode disk
+.Pa vnd0c .
+.Pp
+.Dl vnconfig -e /dev/vnd0c /var/swapfile swap
+.Pp
+Configures
+.Pa vnd0c
+and enables swapping on it.
+.Pp
+.Dl vnconfig -d /dev/vnd0c myfilesystem mount=/mnt
+.Pp
+Unmounts (disables)
+.Pa vnd0c .
+.Pp
+.Dl vnconfig -ae
+.Pp
+Configures and enables all devices specified in
+.Pa /etc/vntab .
+.Sh SEE ALSO
+.Xr swapon 2 ,
+.Xr mount 2 ,
+.Xr unmount 2 .
diff --git a/usr.sbin/vnconfig/vnconfig.c b/usr.sbin/vnconfig/vnconfig.c
new file mode 100644
index 0000000..7c6a9e8
--- /dev/null
+++ b/usr.sbin/vnconfig/vnconfig.c
@@ -0,0 +1,368 @@
+/*
+ * Copyright (c) 1993 University of Utah.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah $Hdr: vnconfig.c 1.1 93/12/15$
+ *
+ * @(#)vnconfig.c 8.1 (Berkeley) 12/15/93
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/vnioctl.h>
+
+#define MAXVNDISK 16
+#define LINESIZE 1024
+
+struct vndisk {
+ char *dev;
+ char *file;
+ int flags;
+ char *oarg;
+} vndisks[MAXVNDISK];
+
+#define VN_CONFIG 0x01
+#define VN_UNCONFIG 0x02
+#define VN_ENABLE 0x04
+#define VN_DISABLE 0x08
+#define VN_SWAP 0x10
+#define VN_MOUNTRO 0x20
+#define VN_MOUNTRW 0x40
+#define VN_IGNORE 0x80
+
+int nvndisks;
+
+int all = 0;
+int verbose = 0;
+char *configfile;
+char *pname;
+
+char *malloc(), *rawdevice(), *rindex();
+
+main(argc, argv)
+ char **argv;
+{
+ extern int optind, optopt, opterr;
+ extern char *optarg;
+ register int i, rv;
+ int flags = 0;
+
+ pname = argv[0];
+ configfile = _PATH_VNTAB;
+ while ((i = getopt(argc, argv, "acdef:uv")) != EOF)
+ switch (i) {
+
+ /* all -- use config file */
+ case 'a':
+ all++;
+ break;
+
+ /* configure */
+ case 'c':
+ flags |= VN_CONFIG;
+ flags &= ~VN_UNCONFIG;
+ break;
+
+ /* disable */
+ case 'd':
+ flags |= VN_DISABLE;
+ flags &= ~VN_ENABLE;
+ break;
+
+ /* enable */
+ case 'e':
+ flags |= (VN_ENABLE|VN_CONFIG);
+ flags &= ~(VN_DISABLE|VN_UNCONFIG);
+ break;
+
+ /* alternate config file */
+ case 'f':
+ configfile = optarg;
+ break;
+
+ /* unconfigure */
+ case 'u':
+ flags |= (VN_DISABLE|VN_UNCONFIG);
+ flags &= ~(VN_ENABLE|VN_CONFIG);
+ break;
+
+ /* verbose */
+ case 'v':
+ verbose++;
+ break;
+
+ default:
+ fprintf(stderr, "invalid option '%c'\n", optopt);
+ usage();
+ }
+
+ if (flags == 0)
+ flags = VN_CONFIG;
+ if (all)
+ readconfig(flags);
+ else {
+ if (argc < optind + 1)
+ usage();
+ vndisks[0].dev = argv[optind++];
+ vndisks[0].file = argv[optind++];
+ vndisks[0].flags = flags;
+ if (optind < argc)
+ getoptions(&vndisks[0], argv[optind]);
+ nvndisks = 1;
+ }
+ rv = 0;
+ for (i = 0; i < nvndisks; i++)
+ rv += config(&vndisks[i]);
+ exit(rv);
+}
+
+config(vnp)
+ struct vndisk *vnp;
+{
+ char *dev, *file, *oarg;
+ int flags;
+ struct vn_ioctl vnio;
+ register int rv;
+ char *rdev;
+ FILE *f;
+ extern int errno;
+
+ dev = vnp->dev;
+ file = vnp->file;
+ flags = vnp->flags;
+ oarg = vnp->oarg;
+
+ if (flags & VN_IGNORE)
+ return(0);
+
+ rdev = rawdevice(dev);
+ f = fopen(rdev, "rw");
+ if (f == NULL) {
+ perror("open");
+ return(1);
+ }
+ vnio.vn_file = file;
+
+ /*
+ * Disable the device
+ */
+ if (flags & VN_DISABLE) {
+ if (flags & (VN_MOUNTRO|VN_MOUNTRW)) {
+ rv = unmount(oarg, 0);
+ if (rv) {
+ if (errno == EBUSY)
+ flags &= ~VN_UNCONFIG;
+ if ((flags & VN_UNCONFIG) == 0)
+ perror("umount");
+ } else if (verbose)
+ printf("%s: unmounted\n", dev);
+ }
+ }
+ /*
+ * Clear (un-configure) the device
+ */
+ if (flags & VN_UNCONFIG) {
+ rv = ioctl(fileno(f), VNIOCCLR, &vnio);
+ if (rv) {
+ if (errno == ENODEV) {
+ if (verbose)
+ printf("%s: not configured\n", dev);
+ rv = 0;
+ } else
+ perror("VNIOCCLR");
+ } else if (verbose)
+ printf("%s: cleared\n", dev);
+ }
+ /*
+ * Configure the device
+ */
+ if (flags & VN_CONFIG) {
+ rv = ioctl(fileno(f), VNIOCSET, &vnio);
+ if (rv) {
+ perror("VNIOCSET");
+ flags &= ~VN_ENABLE;
+ } else if (verbose)
+ printf("%s: %d bytes on %s\n",
+ dev, vnio.vn_size, file);
+ }
+ /*
+ * Enable special functions on the device
+ */
+ if (flags & VN_ENABLE) {
+ if (flags & VN_SWAP) {
+ rv = swapon(dev);
+ if (rv)
+ perror("swapon");
+ else if (verbose)
+ printf("%s: swapping enabled\n", dev);
+ }
+ if (flags & (VN_MOUNTRO|VN_MOUNTRW)) {
+ struct ufs_args args;
+ int mflags;
+
+ args.fspec = dev;
+ mflags = (flags & VN_MOUNTRO) ? MNT_RDONLY : 0;
+ rv = mount(MOUNT_UFS, oarg, mflags, &args);
+ if (rv)
+ perror("mount");
+ else if (verbose)
+ printf("%s: mounted on %s\n", dev, oarg);
+ }
+ }
+done:
+ fclose(f);
+ fflush(stdout);
+ return(rv < 0);
+}
+
+#define EOL(c) ((c) == '\0' || (c) == '\n')
+#define WHITE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
+
+readconfig(flags)
+ int flags;
+{
+ char buf[LINESIZE];
+ FILE *f;
+ register char *cp, *sp;
+ register int ix;
+
+ f = fopen(configfile, "r");
+ if (f == NULL) {
+ perror(configfile);
+ exit(1);
+ }
+ ix = 0;
+ while (fgets(buf, LINESIZE, f) != NULL) {
+ cp = buf;
+ if (*cp == '#')
+ continue;
+ while (!EOL(*cp) && WHITE(*cp))
+ cp++;
+ if (EOL(*cp))
+ continue;
+ sp = cp;
+ while (!EOL(*cp) && !WHITE(*cp))
+ cp++;
+ if (EOL(*cp))
+ continue;
+ *cp++ = '\0';
+ vndisks[ix].dev = malloc(cp - sp);
+ strcpy(vndisks[ix].dev, sp);
+ while (!EOL(*cp) && WHITE(*cp))
+ cp++;
+ if (EOL(*cp))
+ continue;
+ sp = cp;
+ while (!EOL(*cp) && !WHITE(*cp))
+ cp++;
+ *cp++ = '\0';
+ vndisks[ix].file = malloc(cp - sp);
+ strcpy(vndisks[ix].file, sp);
+ while (!EOL(*cp) && WHITE(*cp))
+ cp++;
+ vndisks[ix].flags = flags;
+ if (!EOL(*cp)) {
+ sp = cp;
+ while (!EOL(*cp) && !WHITE(*cp))
+ cp++;
+ *cp++ = '\0';
+ getoptions(&vndisks[ix], sp);
+ }
+ nvndisks++;
+ ix++;
+ }
+}
+
+getoptions(vnp, fstr)
+ struct vndisk *vnp;
+ char *fstr;
+{
+ int flags = 0;
+ char *oarg = NULL;
+
+ if (strcmp(fstr, "swap") == 0)
+ flags |= VN_SWAP;
+ else if (strncmp(fstr, "mount=", 6) == 0) {
+ flags |= VN_MOUNTRW;
+ oarg = &fstr[6];
+ } else if (strncmp(fstr, "mountrw=", 8) == 0) {
+ flags |= VN_MOUNTRW;
+ oarg = &fstr[8];
+ } else if (strncmp(fstr, "mountro=", 8) == 0) {
+ flags |= VN_MOUNTRO;
+ oarg = &fstr[8];
+ } else if (strcmp(fstr, "ignore") == 0)
+ flags |= VN_IGNORE;
+ vnp->flags |= flags;
+ if (oarg) {
+ vnp->oarg = malloc(strlen(oarg) + 1);
+ strcpy(vnp->oarg, oarg);
+ } else
+ vnp->oarg = NULL;
+}
+
+char *
+rawdevice(dev)
+ char *dev;
+{
+ register char *rawbuf, *dp, *ep;
+ struct stat sb;
+ int len;
+
+ len = strlen(dev);
+ rawbuf = malloc(len + 2);
+ strcpy(rawbuf, dev);
+ if (stat(rawbuf, &sb) != 0 || !S_ISCHR(sb.st_mode)) {
+ dp = rindex(rawbuf, '/');
+ if (dp) {
+ for (ep = &rawbuf[len]; ep > dp; --ep)
+ *(ep+1) = *ep;
+ *++ep = 'r';
+ }
+ }
+ return (rawbuf);
+}
+
+usage()
+{
+ fprintf(stderr, "usage: %s [-acdefuv] [special-device file]\n",
+ pname);
+ exit(1);
+}
OpenPOWER on IntegriCloud