Add vnconfig command.
This commit is contained in:
parent
4c8df92432
commit
30669098ec
|
@ -1,11 +1,11 @@
|
||||||
# from: @(#)Makefile 5.6.1.2 (Berkeley) 5/8/91
|
# from: @(#)Makefile 5.6.1.2 (Berkeley) 5/8/91
|
||||||
# $Id: Makefile,v 1.20 1993/12/16 05:38:42 deraadt Exp $
|
# $Id: Makefile,v 1.21 1993/12/21 04:13:39 brezak Exp $
|
||||||
|
|
||||||
SUBDIR= accton amd arp chown chroot config config.new dbsym dev_mkdb \
|
SUBDIR= accton amd arp chown chroot config config.new dbsym dev_mkdb \
|
||||||
diskpart edquota flcopy gettable htable inetd iostat kgmon \
|
diskpart edquota flcopy gettable htable inetd iostat kgmon \
|
||||||
kvm_mkdb lpr mtree named portmap pppd pwd_mkdb quotaon rarpd repquota \
|
kvm_mkdb lpr mtree named portmap pppd pwd_mkdb quotaon rarpd repquota \
|
||||||
rmt rwhod sendmail sliplogin slstats spray swapinfo syslogd tcpdump \
|
rmt rwhod sendmail sliplogin slstats spray swapinfo syslogd tcpdump \
|
||||||
timed traceroute trpt trsp update vipw yp
|
timed traceroute trpt trsp update vipw vnconfig yp
|
||||||
|
|
||||||
.if make(clean) || make(cleandir)
|
.if make(clean) || make(cleandir)
|
||||||
SUBDIR+=bad144
|
SUBDIR+=bad144
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
PROG= vnconfig
|
||||||
|
CFLAGS+= -I/sys
|
||||||
|
MAN8= vnconfig.0
|
||||||
|
|
||||||
|
all: ${PROG} ${MAN8}
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
|
@ -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/vn0c /tmp/diskimage
|
||||||
|
.Pp
|
||||||
|
Configures the vnode disk
|
||||||
|
.Pa vn0c .
|
||||||
|
.Pp
|
||||||
|
.Dl vnconfig -e /dev/vn0c /var/swapfile swap
|
||||||
|
.Pp
|
||||||
|
Configures
|
||||||
|
.Pa vn0c
|
||||||
|
and enables swapping on it.
|
||||||
|
.Pp
|
||||||
|
.Dl vnconfig -d /dev/vn0c myfilesystem mount=/mnt
|
||||||
|
.Pp
|
||||||
|
Unmounts (disables)
|
||||||
|
.Pa vn0c .
|
||||||
|
.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 .
|
|
@ -0,0 +1,374 @@
|
||||||
|
/*
|
||||||
|
* 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 <dev/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 + 2)
|
||||||
|
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) {
|
||||||
|
if (errno == EBUSY) {
|
||||||
|
if ((flags & VN_ENABLE) == 0 && verbose)
|
||||||
|
printf("%s: already configured\n",dev);
|
||||||
|
rv = 0;
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
}
|
Loading…
Reference in New Issue