diff options
author | phk <phk@FreeBSD.org> | 1994-12-04 20:12:26 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1994-12-04 20:12:26 +0000 |
commit | 267256d1f5b2953c150e291396bc8837a3eb9269 (patch) | |
tree | 307d552eec04d4dd08003908117c1af5b304f30f /usr.sbin/vnconfig | |
parent | 7d893644f99a72328eb2380236b03d27e89d8073 (diff) | |
download | FreeBSD-src-267256d1f5b2953c150e291396bc8837a3eb9269.zip FreeBSD-src-267256d1f5b2953c150e291396bc8837a3eb9269.tar.gz |
The vnconfig program.
Diffstat (limited to 'usr.sbin/vnconfig')
-rw-r--r-- | usr.sbin/vnconfig/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/vnconfig/vnconfig.8 | 165 | ||||
-rw-r--r-- | usr.sbin/vnconfig/vnconfig.c | 368 |
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); +} |