summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1997-07-02 00:25:26 +0000
committerbde <bde@FreeBSD.org>1997-07-02 00:25:26 +0000
commit4e789e88d887b2015822fd4ddb14016866f05f97 (patch)
treebe8bd81d4452042fab77f096c69bfdaec85ba2a8 /sbin
parent8197c5b09b2f0f0b82d6629879a7e2ce3133322a (diff)
downloadFreeBSD-src-4e789e88d887b2015822fd4ddb14016866f05f97.zip
FreeBSD-src-4e789e88d887b2015822fd4ddb14016866f05f97.tar.gz
Import Lite2's src/sbin, except for XNSrouted and routed. All relevant
files in src/sbin are off the vendor branch, so this doesn't change the active versions.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/badsect/badsect.c4
-rw-r--r--sbin/clri/clri.c23
-rw-r--r--sbin/disklabel/disklabel.5.5388
-rw-r--r--sbin/disklabel/disklabel.c17
-rw-r--r--sbin/fastboot/fastboot.869
-rw-r--r--sbin/ifconfig/ifconfig.86
-rw-r--r--sbin/init/init.814
-rw-r--r--sbin/init/init.c8
-rw-r--r--sbin/ping/ping.87
-rw-r--r--sbin/ping/ping.c10
-rw-r--r--sbin/route/ccitt_addr.c4
-rw-r--r--sbin/route/route.85
-rw-r--r--sbin/route/route.c26
-rw-r--r--sbin/savecore/savecore.c8
-rw-r--r--sbin/scsiformat/scsiformat.c664
-rw-r--r--sbin/shutdown/shutdown.86
-rw-r--r--sbin/shutdown/shutdown.c7
-rw-r--r--sbin/tunefs/tunefs.836
-rw-r--r--sbin/tunefs/tunefs.c59
19 files changed, 1277 insertions, 84 deletions
diff --git a/sbin/badsect/badsect.c b/sbin/badsect/badsect.c
index fa978b1..f6f01ccc 100644
--- a/sbin/badsect/badsect.c
+++ b/sbin/badsect/badsect.c
@@ -38,7 +38,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)badsect.c 8.1 (Berkeley) 6/5/93";
+static char sccsid[] = "@(#)badsect.c 8.2 (Berkeley) 5/4/95";
#endif /* not lint */
/*
@@ -55,8 +55,8 @@ static char sccsid[] = "@(#)badsect.c 8.1 (Berkeley) 6/5/93";
#include <sys/dir.h>
#include <sys/stat.h>
-#include <ufs/ffs/fs.h>
#include <ufs/ufs/dinode.h>
+#include <ufs/ffs/fs.h>
#include <fcntl.h>
#include <paths.h>
diff --git a/sbin/clri/clri.c b/sbin/clri/clri.c
index c2bdccc..1841201 100644
--- a/sbin/clri/clri.c
+++ b/sbin/clri/clri.c
@@ -41,7 +41,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)clri.c 8.2 (Berkeley) 9/23/93";
+static char sccsid[] = "@(#)clri.c 8.3 (Berkeley) 4/28/95";
#endif /* not lint */
#include <sys/param.h>
@@ -84,29 +84,20 @@ main(argc, argv)
err(1, "%s", fs);
if (lseek(fd, (off_t)(SBLOCK * DEV_BSIZE), SEEK_SET) < 0)
err(1, "%s", fs);
- if (read(fd, sblock, sizeof(sblock)) != sizeof(sblock)) {
- (void)fprintf(stderr,
- "clri: %s: can't read the superblock.\n", fs);
- exit(1);
- }
+ if (read(fd, sblock, sizeof(sblock)) != sizeof(sblock))
+ errx(1, "%s: can't read superblock", fs);
sbp = (struct fs *)sblock;
- if (sbp->fs_magic != FS_MAGIC) {
- (void)fprintf(stderr,
- "clri: %s: superblock magic number 0x%x, not 0x%x.\n",
+ if (sbp->fs_magic != FS_MAGIC)
+ errx(1, "%s: superblock magic number 0x%x, not 0x%x",
fs, sbp->fs_magic, FS_MAGIC);
- exit(1);
- }
bsize = sbp->fs_bsize;
/* remaining arguments are inode numbers. */
while (*++argv) {
/* get the inode number. */
- if ((inonum = atoi(*argv)) <= 0) {
- (void)fprintf(stderr,
- "clri: %s is not a valid inode number.\n", *argv);
- exit(1);
- }
+ if ((inonum = atoi(*argv)) <= 0)
+ errx(1, "%s is not a valid inode number", *argv);
(void)printf("clearing %d\n", inonum);
/* read in the appropriate block. */
diff --git a/sbin/disklabel/disklabel.5.5 b/sbin/disklabel/disklabel.5.5
new file mode 100644
index 0000000..7b4f70b
--- /dev/null
+++ b/sbin/disklabel/disklabel.5.5
@@ -0,0 +1,388 @@
+.\" Copyright (c) 1987, 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Symmetric Computer Systems.
+.\"
+.\" 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.
+.\"
+.\" @(#)disklabel.5.5 8.2 (Berkeley) 5/6/94
+.\"
+.Dd May 6, 1994
+.Dt DISKLABEL 5
+.Os
+.Sh NAME
+.Nm disklabel
+.Nd disk pack label
+.Sh SYNOPSIS
+.Fd #include <sys/disklabel.h>
+.Sh DESCRIPTION
+Each disk or disk pack on a system may contain a disk label
+which provides detailed information
+about the geometry of the disk and the partitions into which the disk
+is divided.
+It should be initialized when the disk is formatted,
+and may be changed later with the
+.Xr disklabel 8
+program.
+This information is used by the system disk driver and by the bootstrap
+program to determine how to program the drive
+and where to find the filesystems on the disk partitions.
+Additional information is used by the filesystem in order
+to use the disk most efficiently and to locate important filesystem information.
+The description of each partition contains an identifier for the partition
+type (standard filesystem, swap area, etc.).
+The filesystem updates the in-core copy of the label if it contains
+incomplete information about the filesystem.
+.Pp
+The label is located in sector number
+.Dv LABELSECTOR
+of the drive, usually sector 0 where it may be found
+without any information about the disk geometry.
+It is at an offset
+.Dv LABELOFFSET
+from the beginning of the sector, to allow room for the initial bootstrap.
+The disk sector containing the label is normally made read-only
+so that it is not accidentally overwritten by pack-to-pack copies
+or swap operations;
+the
+.Dv DIOCWLABEL
+.Xr ioctl 2 ,
+which is done as needed by the
+.Xr disklabel
+program.
+.Pp
+A copy of the in-core label for a disk can be obtained with the
+.Dv DIOCGDINFO
+.Xr ioctl ;
+this works with a file descriptor for a block or character (``raw'') device
+for any partition of the disk.
+The in-core copy of the label is set by the
+.Dv DIOCSDINFO
+.Xr ioctl .
+The offset of a partition cannot generally be changed while it is open,
+nor can it be made smaller while it is open.
+One exception is that any change is allowed if no label was found
+on the disk, and the driver was able to construct only a skeletal label
+without partition information.
+Finally, the
+.Dv DIOCWDINFO
+.Xr ioctl
+operation sets the in-core label and then updates the on-disk label;
+there must be an existing label on the disk for this operation to succeed.
+Thus, the initial label for a disk or disk pack must be installed
+by writing to the raw disk.
+All of these operations are normally done using
+.Xr disklabel .
+.Pp
+The format of the disk label, as specified in
+.Aw Pa sys/disklabel.h ,
+is
+.Bd -literal
+/*
+* Disk description table, see disktab(5)
+*/
+#define DISKTAB "/etc/disktab"
+
+/*
+* Each disk has a label which includes information about the hardware
+* disk geometry, filesystem partitions, and drive specific information.
+* The label is in block 0 or 1, possibly offset from the beginning
+* to leave room for a bootstrap, etc.
+*/
+
+#ifndef LABELSECTOR
+#define LABELSECTOR 0 /* sector containing label */
+#endif
+
+#ifndef LABELOFFSET
+#define LABELOFFSET 64 /* offset of label in sector */
+#endif
+
+#define DISKMAGIC ((u_long) 0x82564557) /* The disk magic number */
+#ifndef MAXPARTITIONS
+#define MAXPARTITIONS 8
+#endif
+
+#ifndef LOCORE
+struct disklabel {
+ u_long d_magic; /* the magic number */
+ short d_type; /* drive type */
+ short d_subtype; /* controller/d_type specific */
+ char d_typename[16]; /* type name, e.g. "eagle" */
+ /*
+ * d_packname contains the pack identifier and is returned when
+ * the disklabel is read off the disk or in-core copy.
+ * d_boot0 and d_boot1 are the (optional) names of the
+ * primary (block 0) and secondary (block 1-15) bootstraps
+ * as found in /usr/mdec. These are returned when using
+ * getdiskbyname(3)
+ to retrieve the values from /etc/disktab.
+ */
+#if defined(KERNEL) || defined(STANDALONE)
+ char d_packname[16]; /* pack identifier */
+#else
+ union {
+ char un_d_packname[16]; /* pack identifier */
+ struct {
+ char *un_d_boot0; /* primary bootstrap name */
+ char *un_d_boot1; /* secondary bootstrap name */
+ } un_b;
+ } d_un;
+
+#define d_packname d_un.un_d_packname
+#define d_boot0 d_un.un_b.un_d_boot0
+#define d_boot1 d_un.un_b.un_d_boot1
+#endif /* ! KERNEL or STANDALONE */
+
+ /* disk geometry: */
+ u_long d_secsize; /* # of bytes per sector */
+ u_long d_nsectors; /* # of data sectors per track */
+ u_long d_ntracks; /* # of tracks per cylinder */
+ u_long d_ncylinders; /* # of data cylinders per unit */
+ u_long d_secpercyl; /* # of data sectors per cylinder */
+ u_long d_secperunit; /* # of data sectors per unit */
+ /*
+ * Spares (bad sector replacements) below
+ * are not counted in d_nsectors or d_secpercyl.
+ * Spare sectors are assumed to be physical sectors
+ * which occupy space at the end of each track and/or cylinder.
+ */
+ u_short d_sparespertrack; /* # of spare sectors per track */
+ u_short d_sparespercyl; /* # of spare sectors per cylinder */
+ /*
+ * Alternate cylinders include maintenance, replacement,
+ * configuration description areas, etc.
+ */
+ u_long d_acylinders; /* # of alt. cylinders per unit */
+
+ /* hardware characteristics: */
+ /*
+ * d_interleave, d_trackskew and d_cylskew describe perturbations
+ * in the media format used to compensate for a slow controller.
+ * Interleave is physical sector interleave, set up by the formatter
+ * or controller when formatting. When interleaving is in use,
+ * logically adjacent sectors are not physically contiguous,
+ * but instead are separated by some number of sectors.
+ * It is specified as the ratio of physical sectors traversed
+ * per logical sector. Thus an interleave of 1:1 implies contiguous
+ * layout, while 2:1 implies that logical sector 0 is separated
+ * by one sector from logical sector 1.
+ * d_trackskew is the offset of sector 0 on track N
+ * relative to sector 0 on track N-1 on the same cylinder.
+ * Finally, d_cylskew is the offset of sector 0 on cylinder N
+ * relative to sector 0 on cylinder N-1.
+ */
+ u_short d_rpm; /* rotational speed */
+ u_short d_interleave; /* hardware sector interleave */
+ u_short d_trackskew; /* sector 0 skew, per track */
+ u_short d_cylskew; /* sector 0 skew, per cylinder */
+ u_long d_headswitch; /* head switch time, usec */
+ u_long d_trkseek; /* track-to-track seek, usec */
+ u_long d_flags; /* generic flags */
+#define NDDATA 5
+ u_long d_drivedata[NDDATA]; /* drive-type specific information */
+#define NSPARE 5
+ u_long d_spare[NSPARE]; /* reserved for future use */
+ u_long d_magic2; /* the magic number (again) */
+ u_short d_checksum; /* xor of data incl. partitions */
+
+ /* filesystem and partition information: */
+ u_short d_npartitions; /* number of partitions in following */
+ u_long d_bbsize; /* size of boot area at sn0, bytes */
+ u_long d_sbsize; /* max size of fs superblock, bytes */
+ struct partition { /* the partition table */
+ u_long p_size; /* number of sectors in partition */
+ u_long p_offset; /* starting sector */
+ u_long p_fsize; /* filesystem basic fragment size */
+ u_char p_fstype; /* filesystem type, see below */
+ u_char p_frag; /* filesystem fragments per block */
+ union {
+ u_short cpg; /* UFS: FS cylinders per group */
+ u_short sgs; /* LFS: FS segment shift */
+ } __partition_u1;
+#define p_cpg __partition_u1.cpg
+#define p_sgs __partition_u1.sgs
+ u_short p_cpg; /* filesystem cylinders per group */
+ } d_partitions[MAXPARTITIONS]; /* actually may be more */
+};
+
+/* d_type values: */
+#define DTYPE_SMD 1 /* SMD, XSMD; VAX hp/up */
+#define DTYPE_MSCP 2 /* MSCP */
+#define DTYPE_DEC 3 /* other DEC (rk, rl) */
+#define DTYPE_SCSI 4 /* SCSI */
+#define DTYPE_ESDI 5 /* ESDI interface */
+#define DTYPE_ST506 6 /* ST506 etc. */
+#define DTYPE_HPIB 7 /* CS/80 on HP-IB */
+#define DTYPE_HPFL 8 /* HP Fiber-link */
+#define DTYPE_FLOPPY 10 /* floppy */
+
+#ifdef DKTYPENAMES
+static char *dktypenames[] = {
+ "unknown",
+ "SMD",
+ "MSCP",
+ "old DEC",
+ "SCSI",
+ "ESDI",
+ "ST506",
+ "HP-IB",
+ "HP-FL",
+ "type 9",
+ "floppy",
+ 0
+};
+#define DKMAXTYPES (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
+#endif
+
+/*
+* Filesystem type and version.
+* Used to interpret other filesystem-specific
+* per-partition information.
+*/
+#define FS_UNUSED 0 /* unused */
+#define FS_SWAP 1 /* swap */
+#define FS_V6 2 /* Sixth Edition */
+#define FS_V7 3 /* Seventh Edition */
+#define FS_SYSV 4 /* System V */
+#define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */
+#define FS_V8 6 /* Eighth Edition, 4K blocks */
+#define FS_BSDFFS 7 /* 4.2BSD fast file system */
+#define FS_MSDOS 8 /* MSDOS file system */
+#define FS_BSDLFS 9 /* 4.4BSD log-structured file system */
+#define FS_OTHER 10 /* in use, but unknown/unsupported */
+#define FS_HPFS 11 /* OS/2 high-performance file system */
+#define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */
+#define FS_BOOT 13 /* partition contains bootstrap */
+
+#ifdef DKTYPENAMES
+static char *fstypenames[] = {
+ "unused",
+ "swap",
+ "Version 6",
+ "Version 7",
+ "System V",
+ "4.1BSD",
+ "Eighth Edition",
+ "4.2BSD",
+ "MSDOS",
+ "4.4LFS",
+ "unknown",
+ "HPFS",
+ "ISO9660",
+ "boot",
+ 0
+};
+#define FSMAXTYPES (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
+#endif
+
+/*
+* flags shared by various drives:
+*/
+#define D_REMOVABLE 0x01 /* removable media */
+#define D_ECC 0x02 /* supports ECC */
+#define D_BADSECT 0x04 /* supports bad sector forw. */
+#define D_RAMDISK 0x08 /* disk emulator */
+#define D_CHAIN 0x10 /* can do back-back transfers */
+
+/*
+* Drive data for SMD.
+*/
+
+#define d_smdflags d_drivedata[0]
+#define D_SSE 0x1 /* supports skip sectoring */
+#define d_mindist d_drivedata[1]
+#define d_maxdist d_drivedata[2]
+#define d_sdist d_drivedata[3]
+
+/*
+* Drive data for ST506.
+*/
+#define d_precompcyl d_drivedata[0]
+#define d_gap3 d_drivedata[1] /* used only when formatting */
+
+/*
+ * Drive data for SCSI.
+ */
+#define d_blind d_drivedata[0]
+
+#ifndef LOCORE
+/*
+* Structure used to perform a format
+* or other raw operation, returning data
+* and/or register values.
+* Register identification and format
+* are device- and driver-dependent.
+*/
+struct format_op {
+ char *df_buf;
+ int df_count; /* value-result */
+ daddr_t df_startblk;
+ int df_reg[8]; /* result */
+};
+
+/*
+* Structure used internally to retrieve
+* information about a partition on a disk.
+*/
+struct partinfo {
+ struct disklabel *disklab;
+ struct partition *part;
+};
+
+/*
+* Disk-specific ioctls.
+*/
+ /* get and set disklabel; DIOCGPART used internally */
+#define DIOCGDINFO _IOR('d', 101, struct disklabel) /* get */
+#define DIOCSDINFO _IOW('d', 102, struct disklabel) /* set */
+#define DIOCWDINFO _IOW('d', 103, struct disklabel) /* set, update disk */
+#define DIOCGPART _IOW('d', 104, struct partinfo) /* get partition */
+
+/* do format operation, read or write */
+#define DIOCRFORMAT _IOWR('d', 105, struct format_op)
+#define DIOCWFORMAT _IOWR('d', 106, struct format_op)
+
+#define DIOCSSTEP _IOW('d', 107, int) /* set step rate */
+#define DIOCSRETRIES _IOW('d', 108, int) /* set # of retries */
+#define DIOCWLABEL _IOW('d', 109, int) /* write en/disable label */
+
+#define DIOCSBAD _IOW('d', 110, struct dkbad) /* set kernel dkbad */
+
+#endif LOCORE
+.Ed
+.Sh SEE ALSO
+.Xr disktab 5 ,
+.Xr disklabel 8
+.Sh HISTORY
+The
+.Nm disklabel
+function was introduced in
+.Bx 4.3 Tahoe .
diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c
index 4a29340..7a70c30 100644
--- a/sbin/disklabel/disklabel.c
+++ b/sbin/disklabel/disklabel.c
@@ -41,7 +41,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)disklabel.c 8.2 (Berkeley) 1/7/94";
+static char sccsid[] = "@(#)disklabel.c 8.4 (Berkeley) 5/4/95";
/* from static char sccsid[] = "@(#)disklabel.c 1.2 (Symmetric) 11/28/85"; */
#endif /* not lint */
@@ -53,6 +53,7 @@ static char sccsid[] = "@(#)disklabel.c 8.2 (Berkeley) 1/7/94";
#include <sys/stat.h>
#define DKTYPENAMES
#include <sys/disklabel.h>
+#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
#include <unistd.h>
#include <string.h>
@@ -349,7 +350,7 @@ makelabel(type, name, lp)
#endif
#endif
/* d_packname is union d_boot[01], so zero */
- bzero(lp->d_packname, sizeof(lp->d_packname));
+ memset(lp->d_packname, 0, sizeof(lp->d_packname));
if (name)
(void)strncpy(lp->d_packname, name, sizeof(lp->d_packname));
}
@@ -524,7 +525,7 @@ makebootarea(boot, dp, f)
}
lp = (struct disklabel *)
(boot + (LABELSECTOR * dp->d_secsize) + LABELOFFSET);
- bzero((char *)lp, sizeof *lp);
+ memset(lp, 0, sizeof *lp);
#if NUMBOOT > 0
/*
* If we are not installing a boot program but we are installing a
@@ -535,7 +536,7 @@ makebootarea(boot, dp, f)
if (rflag) {
if (read(f, boot, BBSIZE) < BBSIZE)
Perror(specname);
- bzero((char *)lp, sizeof *lp);
+ memset(lp, 0, sizeof *lp);
}
return (lp);
}
@@ -545,7 +546,7 @@ makebootarea(boot, dp, f)
*/
if (!xxboot || !bootxx) {
dkbasename = np;
- if ((p = rindex(dkname, '/')) == NULL)
+ if ((p = strrchr(dkname, '/')) == NULL)
p = dkname;
else
p++;
@@ -751,7 +752,7 @@ edit(lp, f)
tmpfil);
break;
}
- bzero((char *)&label, sizeof(label));
+ memset(&label, 0, sizeof(label));
if (getasciilabel(fd, &label)) {
*lp = label;
if (writelabel(f, bootarea, lp) == 0) {
@@ -856,12 +857,12 @@ getasciilabel(f, lp)
lp->d_sbsize = SBSIZE; /* XXX */
while (fgets(line, sizeof(line) - 1, f)) {
lineno++;
- if (cp = index(line,'\n'))
+ if (cp = strchr(line,'\n'))
*cp = '\0';
cp = skip(line);
if (cp == NULL)
continue;
- tp = index(cp, ':');
+ tp = strchr(cp, ':');
if (tp == NULL) {
fprintf(stderr, "line %d: syntax error\n", lineno);
errors++;
diff --git a/sbin/fastboot/fastboot.8 b/sbin/fastboot/fastboot.8
new file mode 100644
index 0000000..2f6ac829
--- /dev/null
+++ b/sbin/fastboot/fastboot.8
@@ -0,0 +1,69 @@
+.\" Copyright (c) 1983, 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" 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.
+.\"
+.\" @(#)fastboot.8 8.1 (Berkeley) 6/5/93
+.\"
+.Dd June 5, 1993
+.Dt FASTBOOT 8
+.Os BSD 4.2
+.Sh NAME
+.Nm fastboot ,
+.Nm fasthalt
+.Nd "reboot/halt the system without checking the disks"
+.Sh SYNOPSIS
+.Nm fastboot
+.Op Ar boot-options
+.Nm fasthalt
+.Op Ar halt-options
+.Sh DESCRIPTION
+.Nm Fastboot
+and
+.Nm fasthalt
+are shell scripts which reboot and halt the system without
+checking the file systems. This is done by creating a
+file
+.Pa /fastboot ,
+then invoking the
+.Xr reboot
+program. The system startup script,
+.Pa /etc/rc ,
+looks for this file and, if present, skips the normal
+invocation of
+.Xr fsck 8 .
+.Sh SEE ALSO
+.Xr halt 8 ,
+.Xr reboot 8 ,
+.Xr rc 8
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.2 .
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 58a2163..b7bc4db 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
+.\" @(#)ifconfig.8 8.4 (Berkeley) 6/1/94
.\"
-.Dd January 5, 1994
+.Dd June 1, 1994
.Dt IFCONFIG 8
.Os BSD 4.2
.Sh NAME
@@ -140,6 +140,7 @@ Enable driver dependent debugging code; usually, this turns on
extra console error logging.
.It Fl debug
Disable driver dependent debugging code.
+.ne 1i
.It Cm delete
Remove the network address specified.
This would be used if you incorrectly specified an alias, or it
@@ -240,6 +241,7 @@ Enable special processing of the link level of the interface.
These three options are interface specific in actual effect, however,
they are in general used to select special modes of operation. An example
of this is to enable SLIP compression. Currently, only used by SLIP.
+.ne 1i
.It Fl link[0-2]
Disable special processing at the link level with the specified interface.
.It Cm up
diff --git a/sbin/init/init.8 b/sbin/init/init.8
index 71e3184..8db766d 100644
--- a/sbin/init/init.8
+++ b/sbin/init/init.8
@@ -32,9 +32,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)init.8 8.3 (Berkeley) 4/18/94
+.\" @(#)init.8 8.6 (Berkeley) 5/26/95
.\"
-.Dd April 18, 1994
+.Dd May 26, 1995
.Dt INIT 8
.Os BSD 4
.Sh NAME
@@ -101,6 +101,9 @@ disks for mounted filesystems,
and
.Pa /dev/kmem
are read-only.
+The
+.Xr settimeofday 2
+system call can only advance the time.
.It Ic 2
Highly secure mode \- same as secure mode, plus disks are always
read-only whether mounted or not.
@@ -159,6 +162,7 @@ then restarted by
executing a new
.Xr getty
for the line.
+.pl +1
.Pp
Line status (on, off, secure, getty, or window information)
may be changed in the
@@ -168,7 +172,7 @@ file without a reboot by sending the signal
to
.Nm init
with the command
-.Dq Li "kill -HUP 1" .
+.Dq Li "kill \-s HUP 1" .
On receipt of this signal,
.Nm init
re-reads the
@@ -208,7 +212,7 @@ will terminate multi-user operations and resume single-user mode
if sent a terminate
.Pq Dv TERM
signal, for example,
-.Dq Li "kill \-TERM 1" .
+.Dq Li "kill \-s TERM 1" .
If there are processes outstanding that are deadlocked (because of
hardware or software failure),
.Xr init
@@ -221,7 +225,7 @@ will cease creating new
and allow the system to slowly die away, if it is sent a terminal stop
.Pq Dv TSTP
signal, i.e.
-.Dq Li "kill \-TSTP 1" .
+.Dq Li "kill \-s TSTP 1" .
A later hangup will resume full
multi-user operations, or a terminate will start a single user shell.
This hook is used by
diff --git a/sbin/init/init.c b/sbin/init/init.c
index ff03598..316aa93 100644
--- a/sbin/init/init.c
+++ b/sbin/init/init.c
@@ -41,7 +41,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 7/15/93";
+static char sccsid[] = "@(#)init.c 8.2 (Berkeley) 4/28/95";
#endif /* not lint */
#include <sys/param.h>
@@ -582,7 +582,7 @@ single_user()
if (clear == 0 || *clear == '\0')
_exit(0);
password = crypt(clear, pp->pw_passwd);
- bzero(clear, _PASSWORD_LEN);
+ memset(clear, 0, _PASSWORD_LEN);
if (strcmp(password, pp->pw_passwd) == 0)
break;
warning("single-user login failed\n");
@@ -839,7 +839,7 @@ find_session(pid)
key.size = sizeof pid;
if ((*session_db->get)(session_db, &key, &data, 0) != 0)
return 0;
- bcopy(data.data, (char *)&ret, sizeof(ret));
+ memmove(&ret, data.data, sizeof(ret));
return ret;
}
@@ -898,7 +898,7 @@ new_session(sprev, session_index, typ)
return 0;
sp = (session_t *) malloc(sizeof (session_t));
- bzero(sp, sizeof *sp);
+ memset(sp, 0, sizeof *sp);
sp->se_index = session_index;
diff --git a/sbin/ping/ping.8 b/sbin/ping/ping.8
index e3de68a..2382365 100644
--- a/sbin/ping/ping.8
+++ b/sbin/ping/ping.8
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)ping.8 8.2 (Berkeley) 12/11/93
+.\" @(#)ping.8 8.3 (Berkeley) 4/28/95
.\"
-.Dd December 11, 1993
+.Dd April 28, 1995
.Dt PING 8
.Os BSD 4.3
.Sh NAME
@@ -41,12 +41,13 @@
packets to network hosts
.Sh SYNOPSIS
.Nm ping
-.Op Fl dfnqrvR
+.Op Fl Rdfnqrv
.Op Fl c Ar count
.Op Fl i Ar wait
.Op Fl l Ar preload
.Op Fl p Ar pattern
.Op Fl s Ar packetsize
+.Ar host
.Sh DESCRIPTION
.Nm Ping
uses the
diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
index 46db1ca..7ccec1e 100644
--- a/sbin/ping/ping.c
+++ b/sbin/ping/ping.c
@@ -41,7 +41,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93";
+static char sccsid[] = "@(#)ping.c 8.3 (Berkeley) 4/28/95";
#endif /* not lint */
/*
@@ -240,7 +240,7 @@ main(argc, argv)
usage();
target = *argv;
- bzero((char *)&whereto, sizeof(struct sockaddr));
+ memset(&whereto, 0, sizeof(struct sockaddr));
to = (struct sockaddr_in *)&whereto;
to->sin_family = AF_INET;
to->sin_addr.s_addr = inet_addr(target);
@@ -254,7 +254,7 @@ main(argc, argv)
exit(1);
}
to->sin_family = hp->h_addrtype;
- bcopy(hp->h_addr, (caddr_t)&to->sin_addr, hp->h_length);
+ memmove(&to->sin_addr, hp->h_addr, hp->h_length);
(void)strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1);
hostname = hnamebuf;
}
@@ -593,7 +593,7 @@ pr_pack(buf, cc, from)
continue;
if (i == old_rrlen
&& cp == (u_char *)buf + sizeof(struct ip) + 2
- && !bcmp((char *)cp, old_rr, i)
+ && !memcmp(cp, old_rr, i)
&& !(options & F_FLOOD)) {
(void)printf("\t(same route)");
i = ((i + 3) / 4) * 4;
@@ -602,7 +602,7 @@ pr_pack(buf, cc, from)
break;
}
old_rrlen = i;
- bcopy((char *)cp, old_rr, i);
+ memmove(old_rr, cp, i);
(void)printf("\nRR: ");
for (;;) {
l = *++cp;
diff --git a/sbin/route/ccitt_addr.c b/sbin/route/ccitt_addr.c
index 868f6fc..54fb9b2 100644
--- a/sbin/route/ccitt_addr.c
+++ b/sbin/route/ccitt_addr.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)ccitt_addr.c 8.1 (Berkeley) 6/5/93
+ * @(#)ccitt_addr.c 8.2 (Berkeley) 4/28/95
*/
/*
* parse CCITT addresses
@@ -62,7 +62,7 @@ register struct sockaddr_x25 *xp;
register char *p, *ap, *limit;
int havenet = 0;
- bzero ((char *)xp, sizeof (*xp));
+ memset(xp, 0, sizeof (*xp));
xp->x25_family = AF_CCITT;
xp->x25_len = sizeof(*xp);
p = addr;
diff --git a/sbin/route/route.8 b/sbin/route/route.8
index 906f8c2..62b9cfe 100644
--- a/sbin/route/route.8
+++ b/sbin/route/route.8
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)route.8 8.3 (Berkeley) 3/19/94
+.\" @(#)route.8 8.4 (Berkeley) 6/1/94
.\"
-.Dd March 19, 1994
+.Dd June 1, 1994
.Dt ROUTE 8
.Os BSD 4.4
.Sh NAME
@@ -276,6 +276,7 @@ and
RTM_CHANGE.
As such, only the super-user may modify
the routing tables.
+.ne 1i
.Sh DIAGNOSTICS
.Bl -tag -width Ds
.It Sy "add [host \&| network ] %s: gateway %s flags %x"
diff --git a/sbin/route/route.c b/sbin/route/route.c
index 893996c..2e48e71 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -39,7 +39,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)route.c 8.3 (Berkeley) 3/19/94";
+static char sccsid[] = "@(#)route.c 8.6 (Berkeley) 4/28/95";
#endif /* not lint */
#include <sys/param.h>
@@ -312,7 +312,7 @@ routename(sa)
if (first) {
first = 0;
if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
- (cp = index(domain, '.')))
+ (cp = strchr(domain, '.')))
(void) strcpy(domain, cp + 1);
else
domain[0] = 0;
@@ -333,7 +333,7 @@ routename(sa)
hp = gethostbyaddr((char *)&in, sizeof (struct in_addr),
AF_INET);
if (hp) {
- if ((cp = index(hp->h_name, '.')) &&
+ if ((cp = strchr(hp->h_name, '.')) &&
!strcmp(cp + 1, domain))
*cp = 0;
cp = hp->h_name;
@@ -663,7 +663,7 @@ newroute(argc, argv)
break;
if (af == AF_INET && *gateway && hp && hp->h_addr_list[1]) {
hp->h_addr_list++;
- bcopy(hp->h_addr_list[0], &so_gate.sin.sin_addr,
+ memmove(&so_gate.sin.sin_addr, hp->h_addr_list[0],
hp->h_length);
} else
break;
@@ -808,7 +808,7 @@ getaddr(which, s, hpp)
if (which == RTA_DST) {
extern short ns_bh[3];
struct sockaddr_ns *sms = &(so_mask.sns);
- bzero((char *)sms, sizeof(*sms));
+ memset(sms, 0, sizeof(*sms));
sms->sns_family = 0;
sms->sns_len = 6;
sms->sns_addr.x_net = *(union ns_net *)ns_bh;
@@ -869,7 +869,7 @@ netdone:
if (hp) {
*hpp = hp;
su->sin.sin_family = hp->h_addrtype;
- bcopy(hp->h_addr, (char *)&su->sin.sin_addr, hp->h_length);
+ memmove(&su->sin.sin_addr, hp->h_addr, hp->h_length);
return (1);
}
(void) fprintf(stderr, "%s: bad value\n", s);
@@ -917,9 +917,9 @@ ns_print(sns)
return (mybuf);
}
- if (bcmp((char *)ns_bh, (char *)work.x_host.c_host, 6) == 0)
+ if (memcmp(ns_bh, work.x_host.c_host, 6) == 0)
host = "any";
- else if (bcmp((char *)ns_nullh, (char *)work.x_host.c_host, 6) == 0)
+ else if (memcmp(ns_nullh, work.x_host.c_host, 6) == 0)
host = "*";
else {
q = work.x_host.c_host;
@@ -999,12 +999,12 @@ rtmsg(cmd, flags)
#define NEXTADDR(w, u) \
if (rtm_addrs & (w)) {\
- l = ROUNDUP(u.sa.sa_len); bcopy((char *)&(u), cp, l); cp += l;\
+ l = ROUNDUP(u.sa.sa_len); memmove(cp, &(u), l); cp += l;\
if (verbose) sodump(&(u),"u");\
}
errno = 0;
- bzero((char *)&m_rtmsg, sizeof(m_rtmsg));
+ memset(&m_rtmsg, 0, sizeof(m_rtmsg));
if (cmd == 'a')
cmd = RTM_ADD;
else if (cmd == 'c')
@@ -1012,8 +1012,8 @@ rtmsg(cmd, flags)
else if (cmd == 'g') {
cmd = RTM_GET;
if (so_ifp.sa.sa_family == 0) {
- so_ifp.sa.sa_family == AF_LINK;
- so_ifp.sa.sa_len == sizeof(struct sockaddr_dl);
+ so_ifp.sa.sa_family = AF_LINK;
+ so_ifp.sa.sa_len = sizeof(struct sockaddr_dl);
rtm_addrs |= RTA_IFP;
}
} else
@@ -1380,7 +1380,7 @@ sockaddr(addr, sa)
char *cplim = cp + size;
register int byte = 0, state = VIRGIN, new;
- bzero(cp, size);
+ memset(cp, 0, size);
cp++;
do {
if ((*addr >= '0') && (*addr <= '9')) {
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index 6e34924be..a377fdc 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -38,7 +38,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)savecore.c 8.3 (Berkeley) 1/2/94";
+static char sccsid[] = "@(#)savecore.c 8.5 (Berkeley) 4/28/95";
#endif /* not lint */
#include <sys/param.h>
@@ -134,7 +134,7 @@ main(argc, argv)
openlog("savecore", LOG_PERROR, LOG_DAEMON);
- while ((ch = getopt(argc, argv, "cdfNvz")) != EOF)
+ while ((ch = getopt(argc, argv, "cdfN:vz")) != EOF)
switch(ch) {
case 'c':
clear = 1;
@@ -491,7 +491,7 @@ rawname(s)
{
char *sl, name[MAXPATHLEN];
- if ((sl = rindex(s, '/')) == NULL || sl[1] == '0') {
+ if ((sl = strrchr(s, '/')) == NULL || sl[1] == '0') {
syslog(LOG_ERR,
"can't make raw dump device name from %s", s);
return (s);
@@ -620,7 +620,7 @@ Create(file, mode)
{
register int fd;
- fd = creat(file, mode);
+ fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);
if (fd < 0) {
syslog(LOG_ERR, "%s: %m", file);
exit(1);
diff --git a/sbin/scsiformat/scsiformat.c b/sbin/scsiformat/scsiformat.c
new file mode 100644
index 0000000..a185a8e
--- /dev/null
+++ b/sbin/scsiformat/scsiformat.c
@@ -0,0 +1,664 @@
+/*-
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * @(#)scsiformat.c 5.5 (Berkeley) 4/2/94
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1992, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)scsiformat.c 5.5 (Berkeley) 4/2/94";
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+
+#include <dev/scsi/scsi.h>
+#include <dev/scsi/disk.h>
+#include <dev/scsi/disktape.h>
+#include <dev/scsi/scsi_ioctl.h>
+
+#define COMPAT_HPSCSI
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int fd;
+char *device;
+
+void scsi_str __P((char *, char *, int));
+void do_command __P((int, struct scsi_cdb *, void *, int));
+void do_format __P((void));
+void print_capacity __P((void));
+void print_inquiry __P((void));
+void prflags __P((int, const char *));
+u_char *print_mode_page __P((u_char *));
+void print_mode_sense __P((void));
+void usage __P((void));
+
+#define N2(c, d) (((c) << 8) | (d))
+#define N3(b, c, d) (((b) << 16) | N2(c, d))
+#define N4(a, b, c, d) (((a) << 24) | N3(b, c, d))
+
+int sense_pctl;
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ extern char *optarg;
+ int ch, readonly;
+
+ readonly = 0;
+ sense_pctl = SCSI_MSENSE_PCTL_CUR;
+ while ((ch = getopt(argc, argv, "rp:")) != EOF) {
+ switch(ch) {
+ case 'r':
+ readonly = 1;
+ break;
+ case 'p': /* mode sense page control */
+ switch (*optarg) {
+ case 'c':
+ sense_pctl = SCSI_MSENSE_PCTL_CUR;
+ break;
+ case 'd':
+ sense_pctl = SCSI_MSENSE_PCTL_DFLT;
+ break;
+ case 's':
+ sense_pctl = SCSI_MSENSE_PCTL_SAVED;
+ break;
+ case 'v':
+ (void)printf(
+ "*** note: for variable parameters, 1-bit means ``can write here''\n");
+ sense_pctl = SCSI_MSENSE_PCTL_VAR;
+ break;
+ }
+ /* FALLTHROUGH */
+ case '?':
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
+ usage();
+
+ device = *argv;
+ fd = open(device, readonly ? O_RDONLY : O_RDWR, 0);
+ if (fd < 0) {
+ (void)fprintf(stderr,
+ "scsiformat: %s: %s\n", device, strerror(errno));
+ exit(1);
+ }
+ print_inquiry();
+ print_capacity();
+ print_mode_sense();
+
+ if (!readonly)
+ do_format();
+ exit(0);
+}
+
+/*
+ * Copy a counted string, trimming trailing blanks, and turning the
+ * result into a C-style string.
+ */
+void
+scsi_str(src, dst, len)
+ register char *src, *dst;
+ register int len;
+{
+
+ while (src[len - 1] == ' ') {
+ if (--len == 0) {
+ *dst = 0;
+ return;
+ }
+ }
+ bcopy(src, dst, len);
+ dst[len] = 0;
+}
+
+void
+print_inquiry()
+{
+ register struct scsi_inq_ansi *si;
+ int ver;
+ struct scsi_inquiry inqbuf;
+ char vendor[10], product[17], rev[5];
+ static struct scsi_cdb inq = {
+ CMD_INQUIRY, 0, 0, 0, sizeof(inqbuf), 0
+ };
+
+ do_command(fd, &inq, &inqbuf, sizeof(inqbuf));
+ (void)printf("%s: ", device);
+
+ ver = (inqbuf.si_version >> VER_ANSI_SHIFT) & VER_ANSI_MASK;
+ if (ver != 1 && ver != 2) {
+ (void)printf("type 0x%x, qual 0x%x, ver 0x%x (ansi %d)\n",
+ inqbuf.si_type, inqbuf.si_qual, inqbuf.si_version, ver);
+ return;
+ }
+ si = (struct scsi_inq_ansi *)&inqbuf;
+ switch (si->si_type & TYPE_TYPE_MASK) {
+
+ case TYPE_DAD:
+ (void)printf("(disk)");
+ break;
+
+ case TYPE_WORM:
+ (void)printf("(WORM)");
+ break;
+
+ case TYPE_ROM:
+ (void)printf("(CD-ROM)");
+ break;
+
+ case TYPE_MO:
+ (void)printf("(MO-DISK)");
+ break;
+
+ case TYPE_JUKEBOX:
+ (void)printf("(jukebox)");
+ break;
+
+ default:
+ (void)printf("(??)");
+ break;
+ }
+ scsi_str(si->si_vendor, vendor, sizeof(si->si_vendor));
+ scsi_str(si->si_product, product, sizeof(si->si_product));
+ scsi_str(si->si_rev, rev, sizeof(si->si_rev));
+ (void)printf(" %s %s rev %s:", vendor, product, rev);
+}
+
+void
+print_capacity()
+{
+ struct scsi_rc rc; /* for READ CAPACITY */
+ static struct scsi_cdb cap = { CMD_READ_CAPACITY };
+
+ do_command(fd, &cap, &rc, sizeof(rc));
+ (void)printf(" %d blocks of %d bytes each\n",
+ N4(rc.rc_lbah, rc.rc_lbahm, rc.rc_lbalm, rc.rc_lbal) + 1,
+ N4(rc.rc_blh, rc.rc_blhm, rc.rc_bllm, rc.rc_bll));
+}
+
+void
+print_mode_sense()
+{
+ register u_char *cp, *ep;
+ register struct scsi_ms_bd *bd;
+ register int n, i, l, len, bdlen;
+#ifdef TEN_BYTE_SENSE
+ struct {
+ struct scsi_ms10 ms;
+ u_char p[1023 - sizeof(struct scsi_ms10)];
+ } msbuf;
+ static struct scsi_cdb modesense = {
+ CMD_MODE_SENSE10, SCSI_MSENSE_DBD, 0, 0, 0, 0, 0,
+ sizeof(msbuf) >> 8, sizeof (msbuf), 0
+ };
+
+ CDB10(&modesense)->cdb_lbam = sense_pctl | SCSI_MS_PC_ALL;
+ do_command(fd, &modesense, &msbuf, sizeof(msbuf));
+ len = N2(msbuf.ms.ms_lenh, msbuf.ms.ms_lenl);
+ bdlen = N2(msbuf.ms.ms_bdlh, msbuf.ms.ms_bdll);
+#else
+ struct {
+ struct scsi_ms6 ms;
+ u_char p[255 - sizeof(struct scsi_ms6)];
+ } msbuf;
+ static struct scsi_cdb modesense = {
+ CMD_MODE_SENSE6, 0, 0, 0, sizeof(msbuf), 0
+ };
+
+ CDB6(&modesense)->cdb_lbam = sense_pctl | SCSI_MS_PC_ALL;
+ do_command(fd, &modesense, &msbuf, sizeof(msbuf));
+ len = msbuf.ms.ms_len;
+ bdlen = msbuf.ms.ms_bdl;
+#endif
+ (void)printf("\n%d bytes of mode sense data. ", len);
+ (void)printf("medium type 0x%x, %swrite protected\n",
+ msbuf.ms.ms_mt, msbuf.ms.ms_dsp & SCSI_MS_DSP_WP ? "" : "not ");
+ if ((n = bdlen) != 0) {
+ bd = (struct scsi_ms_bd *)msbuf.p;
+ for (n /= sizeof(*bd); --n >= 0; bd++) {
+ (void)printf("\tdensity code 0x%x, ", bd->bd_dc);
+ i = N3(bd->bd_nbh, bd->bd_nbm, bd->bd_nbl);
+ l = N3(bd->bd_blh, bd->bd_blm, bd->bd_bll);
+ if (i)
+ (void)printf("%d blocks of length %d\n", i, l);
+ else
+ (void)printf("all blocks of length %d\n", l);
+ }
+ }
+ /*
+ * Sense header lengths includes the sense header, while mode page
+ * lengths do not ... let's hear it for consistency!
+ */
+ cp = msbuf.p + bdlen;
+ ep = msbuf.p + len - sizeof(msbuf.ms);
+ while (cp < ep)
+ cp = print_mode_page(cp);
+}
+
+void
+prflags(v, cp)
+ int v;
+ register const char *cp;
+{
+ register const char *np;
+ char f, sep;
+
+ for (sep = '<'; (f = *cp++) != 0; cp = np) {
+ for (np = cp; *np >= ' ';)
+ np++;
+ if ((v & (1 << (f - 1))) == 0)
+ continue;
+ printf("%c%.*s", sep, np - cp, cp);
+ sep = ',';
+ }
+ if (sep != '<')
+ putchar('>');
+}
+
+static char *
+cache_policy(x)
+ int x;
+{
+ static char rsvd[30];
+
+ switch (x) {
+
+ case SCSI_CACHE_DEFAULT:
+ return ("default");
+
+ case SCSI_CACHE_KEEPPF:
+ return ("toss cmd data, save prefetch");
+
+ case SCSI_CACHE_KEEPCMD:
+ return ("toss prefetch data, save cmd");
+
+ default:
+ (void)sprintf(rsvd, "reserved %d", x);
+ return (rsvd);
+ }
+ /* NOTREACHED */
+}
+
+u_char *
+print_mode_page(cp)
+ u_char *cp;
+{
+ register struct scsi_ms_page_hdr *mp;
+ int len, code, i;
+ u_char *tp;
+ const char *s;
+
+ mp = (struct scsi_ms_page_hdr *)cp;
+ code = mp->mp_psc & SCSI_MS_PC_MASK;
+ len = mp->mp_len;
+ (void)printf("\npage type %d%s (%d bytes): ",
+ code, mp->mp_psc & SCSI_MS_MP_SAVEABLE ? " (saveable)" : "", len);
+ switch (code) {
+
+ case SCSI_MS_PC_RWERRREC:
+#define rw ((struct scsi_page_rwerrrec *)(mp + 1))
+ (void)printf("Read/Write Error Recovery parameters.\n");
+ (void)printf("\tflags = 0x%x", rw->rw_flags);
+ prflags(rw->rw_flags,
+ "\10AWRE\7ARRE\6TB\5RC\4EER\3PER\2DTE\1DCR");
+ (void)printf(",\n\t%d read retries, %d correction span bits,\n",
+ rw->rw_read_retry, rw->rw_corr_span);
+ (void)printf("\t%d head offsets, %d data strobe offsets%s\n",
+ rw->rw_hd_off, rw->rw_ds_off, len > 6 ? "," : ".");
+ if (len <= 6)
+ break;
+ (void)printf("\t%d write retries, ", rw->rw_write_retry);
+ i = N2(rw->rw_rtlh, rw->rw_rtll);
+ if (i != 0xffff)
+ (void)printf("%d", i);
+ else
+ (void)printf("no");
+ (void)printf(" recovery time limit.\n");
+ break;
+#undef rw
+
+ case SCSI_MS_PC_DR:
+#define dr ((struct scsi_page_dr *)(mp + 1))
+ (void)printf("Disconnect/Reconnect control.\n");
+ (void)printf("\tbuffer full ratio %d, buffer empty ratio %d,\n",
+ dr->dr_full, dr->dr_empty);
+ (void)printf("\ttime limits: %d bus inactivity, ",
+ N2(dr->dr_inacth, dr->dr_inactl));
+ (void)printf("%d disconnect, %d connect.\n",
+ N2(dr->dr_disconh, dr->dr_disconl),
+ N2(dr->dr_conh, dr->dr_conl));
+ (void)printf("\tmaximum burst size %d,\n",
+ N2(dr->dr_bursth, dr->dr_burstl));
+ switch (dr->dr_dtdc & SCSI_DR_DTDC_MASK) {
+ case SCSI_DR_DTDC_NONE:
+ s = "never";
+ break;
+ case SCSI_DR_DTDC_NOTDATA:
+ s = "during data transfer";
+ break;
+ case SCSI_DR_DTDC_RSVD:
+ s = "???";
+ break;
+ case SCSI_DR_DTDC_NOTD2:
+ s = "during and after data transfer";
+ break;
+ }
+ (void)printf("\tsuppress disconnect %s.\n", s);
+ break;
+#undef dr
+
+ case SCSI_MS_PC_FMT:
+#define fmt ((struct scsi_page_fmt *)(mp + 1))
+ (void)printf("Format parameters.\n");
+ (void)printf("\t%d tracks/zone, %d alt.sect./zone, ",
+ N2(fmt->fmt_tpzh, fmt->fmt_tpzl),
+ N2(fmt->fmt_aspzh, fmt->fmt_aspzl));
+ (void)printf("%d alt.tracks/zone,\n\t%d alt.tracks/vol., ",
+ N2(fmt->fmt_atpzh, fmt->fmt_atpzl),
+ N2(fmt->fmt_atpvh, fmt->fmt_atpvl));
+ (void)printf("%d sectors/track, %d bytes/phys.sector,\n",
+ N2(fmt->fmt_spth, fmt->fmt_sptl),
+ N2(fmt->fmt_dbppsh, fmt->fmt_dbppsl));
+ (void)printf("\tinterleave %d, track skew %d, cyl.skew %d,\n",
+ N2(fmt->fmt_ilh, fmt->fmt_ill),
+ N2(fmt->fmt_tsfh, fmt->fmt_tsfl),
+ N2(fmt->fmt_csfh, fmt->fmt_csfl));
+ (void)printf("\tdrive flags 0x%x", fmt->fmt_flags);
+ prflags(fmt->fmt_flags, "\10SSEC\7HSEC\6RMB\5SURF");
+ (void)printf(".\n");
+ break;
+#undef fmt
+
+ case SCSI_MS_PC_RDGEOM:
+#define rd ((struct scsi_page_rdgeom *)(mp + 1))
+ (void)printf("Disk Geometry parameters.\n");
+ (void)printf("\t%d cylinders, %d heads,\n",
+ N3(rd->rd_ncylh, rd->rd_ncylm, rd->rd_ncyll),
+ rd->rd_nheads);
+ (void)printf("\tstart write precompensation at cyl %d,\n",
+ N3(rd->rd_wpcylh, rd->rd_wpcylm, rd->rd_wpcyll));
+ (void)printf("\tstart reduced write current at cyl %d,\n",
+ N3(rd->rd_rwcylh, rd->rd_rwcylm, rd->rd_rwcyll));
+ (void)printf("\tseek step rate %f us, landing zone cyl %d,\n",
+ N2(rd->rd_steph, rd->rd_stepl) * 0.1,
+ N3(rd->rd_lcylh, rd->rd_lcylm, rd->rd_lcyll));
+ switch (rd->rd_rpl & SCSI_RD_RPL_MASK) {
+ case SCSI_RD_RPL_NONE:
+ s = "disabled or unsupported";
+ break;
+ case SCSI_RD_RPL_SLAVE:
+ s = "slave";
+ break;
+ case SCSI_RD_RPL_MASTER:
+ s = "master";
+ break;
+ case SCSI_RD_RPL_MCONTROL:
+ s = "master control";
+ break;
+ }
+ (void)printf("\trotational synch %s, offset %d/256%s\n",
+ s, rd->rd_roff, len > 18 ? "," : ".");
+ if (len > 18)
+ (void)printf("\trotation %d rpm.\n",
+ N2(rd->rd_rpmh, rd->rd_rpml));
+ break;
+#undef rd
+
+ case SCSI_MS_PC_VERRREC:
+#define v ((struct scsi_page_verrrec *)(mp + 1))
+ (void)printf("Verify Error Recovery parameters.\n");
+ (void)printf("\tflags = 0x%x", v->v_flags);
+ prflags(v->v_flags, "\4EER\3PER\2DTE\1DCR");
+ (void)printf(",\n\t%d verify retries, %d %s span bits,\n\t",
+ v->v_verify_retry, v->v_corr_span, "correction");
+ (void)printf("%d recovery time limit.\n",
+ N2(v->v_rtlh, v->v_rtll));
+ break;
+#undef v
+
+ case SCSI_MS_PC_CACHE:
+#define cache ((struct scsi_page_cache *)(mp + 1))
+ (void)printf("Caching Page.\n");
+ (void)printf("\tflags = 0x%x", cache->cache_flags);
+ prflags(cache->cache_flags, "\3WCE\2MF\1RCD");
+ (void)printf(
+ ",\n\tread retention = %s, write retention = %s,\n",
+ cache_policy(SCSI_CACHE_RDPOLICY(cache->cache_reten)),
+ cache_policy(SCSI_CACHE_WRPOLICY(cache->cache_reten)));
+ (void)printf("\tdisable prefetch transfer length = %d,\n",
+ N2(cache->cache_dptlh, cache->cache_dptll));
+ (void)printf("\tmin prefetch = %d, max prefetch = %d, ",
+ N2(cache->cache_minpfh, cache->cache_minpfl),
+ N2(cache->cache_maxpfh, cache->cache_maxpfl));
+ (void)printf("max prefetch ceiling = %d.\n",
+ N2(cache->cache_mpch, cache->cache_mpcl));
+ break;
+#undef cache
+
+ case SCSI_MS_PC_CTLMODE:
+#define cm ((struct scsi_page_ctlmode *)(mp + 1))
+ (void)printf("Control Mode Page.\n");
+ (void)printf("\t%s report log-activity error conditions,\n",
+ cm->cm_rlec & SCSI_CM_RLEC ? "do" : "do not");
+ (void)printf("\tqueue algorithm modifier = %d, flags = 0x%x",
+ SCSI_CM_QMOD(cm->cm_qctl),
+ cm->cm_qctl & (SCSI_CM_QERR|SCSI_CM_DQUE));
+ prflags(cm->cm_qctl, "\2QERR\1DQUE");
+ (void)printf(",\n\tECA/AEN flags = 0x%x", cm->cm_ecaaen);
+ prflags(cm->cm_ecaaen, "\10ECA\3RAENP\2UUAENP\1EAENP");
+ (void)printf(", AEN holdoff period = %d ms.\n",
+ N2(cm->cm_aenholdh, cm->cm_aenholdl));
+ break;
+#undef cm
+
+ /*
+ * Vendor Unique, but what the heck.
+ */
+ case SCSI_MS_PC_CDCCACHECTL:
+#define ccm ((struct scsi_page_CDCcachectlmode *)(mp + 1))
+ (void)printf("CDC-specific Cache Control Mode Page.\n");
+ (void)printf("\tflags = 0x%x", ccm->ccm_flags);
+ prflags(ccm->ccm_flags, "\7WIE\5ENABLE");
+ (void)printf(", table size = %d, prefetch threshold = %d\n",
+ SCSI_CDC_CCM_TBLSZ(ccm->ccm_flags),
+ ccm->ccm_pfthresh);
+ (void)printf("\tmaximum %s = %d, maximum %s = %d,\n",
+ "threshold", ccm->ccm_maxthresh,
+ "prefetch multiplier", ccm->ccm_maxpfmult);
+ (void)printf("\tminimum %s = %d, minimum %s = %d.\n",
+ "threshold", ccm->ccm_minthresh,
+ "prefetch multiplier", ccm->ccm_minpfmult);
+ break;
+#undef ccm
+
+ default:
+ (void)printf("Unknown page type.");
+ for (tp = cp + sizeof(*mp), i = 0; i < len; ++i) {
+ if ((i & 7) == 0)
+ (void)printf("\n\t%2d: ", i);
+ (void)printf(" %02x", *tp++);
+ }
+ (void)printf(".\n");
+ break;
+ }
+ return (cp + sizeof(*mp) + len);
+}
+
+void
+pr_sense(fd)
+ int fd;
+{
+ static struct scsi_fmt_sense s;
+ register struct scsi_sense *sn;
+
+ if (ioctl(fd, SDIOCSENSE, &s) < 0)
+ (void)fprintf(stderr,
+ "scsiformat: SDIOCSENSE: %s\n", strerror(errno));
+
+ (void)printf("scsi status 0x%x", s.status);
+ if (s.status & STS_CHECKCOND) {
+ sn = (struct scsi_sense *)s.sense;
+
+ (void)printf(" sense class %d, code %d",
+ SENSE_ECLASS(sn), SENSE_ECODE(sn));
+ if (SENSE_ISXSENSE(sn)) {
+ (void)printf(", key %d", XSENSE_KEY(sn));
+ if (XSENSE_IVALID(sn))
+ (void)printf(", blk %d", XSENSE_INFO(sn));
+ }
+ }
+ (void)printf("\n");
+}
+
+void
+do_format()
+{
+ struct {
+ struct scsi_ms6 ms; /* mode select header */
+ struct scsi_ms_bd bd; /* block descriptor */
+ struct scsi_ms_page_hdr mp; /* ctl mode page hdr */
+ struct scsi_page_ctlmode cm; /* ctl mode page */
+ u_char pad[4]; /* ??? */
+ } msel;
+ u_char fmtbuf[128];
+ static struct scsi_cdb modeselect = {
+ CMD_MODE_SELECT6,
+ SCSI_MSEL_SCSI2_DATA | SCSI_MSEL_SAVEPAGES, 0, 0,
+ sizeof(msel), 0
+ };
+ static struct scsi_cdb format = { CMD_FORMAT_UNIT };
+
+ /* want mostly 0s; set them all zero here */
+ bzero(&msel, sizeof(msel));
+
+ /* one block descriptor */
+ msel.ms.ms_bdl = sizeof(struct scsi_ms_bd);
+
+ /* block length = 512 bytes */
+ msel.bd.bd_blm = 512 / 256;
+ msel.bd.bd_bll = 512 % 256;
+
+ /*
+ * In the following, the mystery pad region is copied from
+ * the original driver. I have no idea what it is for.
+ * (Anyone got SCSI-2 documents?)
+ */
+
+ /* mode page parameters: report log-activity exception conditions */
+ msel.mp.mp_psc = SCSI_MS_PC_CTLMODE;
+ msel.mp.mp_len = sizeof(msel.cm) + sizeof(msel.pad);
+ msel.cm.cm_rlec = SCSI_CM_RLEC;
+
+ do_command(fd, &modeselect, &msel, sizeof(msel));
+
+ bzero(fmtbuf, sizeof(fmtbuf));
+ do_command(fd, &format, fmtbuf, sizeof(fmtbuf));
+}
+
+void
+do_command(fd, cdb, buf, len)
+ int fd;
+ struct scsi_cdb *cdb;
+ void *buf;
+ int len;
+{
+ static int on = 1, off = 0;
+ int user, ret;
+
+ bzero(buf, len);
+ if (ioctl(fd, SDIOCSFORMAT, &on) < 0) {
+ (void)fprintf(stderr,
+ "scsiformat: SDIOCSFORMAT (on): %s\n", strerror(errno));
+ if (ioctl(fd, SDIOCGFORMAT, &user) == 0 && user != 0)
+ (void)fprintf(stderr, "scsiformat: pid %d has it\n",
+ user);
+ return;
+ }
+ ret = ioctl(fd, SDIOCSCSICOMMAND, cdb);
+#ifdef COMPAT_HPSCSI
+ if (ret < 0) {
+ static const char scsicmdlen[8] = { 6, 10, 0, 0, 0, 12, 0, 0 };
+#define SCSICMDLEN(cmd) scsicmdlen[(cmd) >> 5]
+ struct scsi_fmt_cdb {
+ int len;
+ u_char cdb[28];
+ } sc;
+#define OSDIOCSCSICOMMAND _IOW('S', 0x3, struct scsi_fmt_cdb)
+
+ sc.len = SCSICMDLEN(cdb->cdb_bytes[0]);
+ bcopy(cdb->cdb_bytes, sc.cdb, sc.len);
+ ret = ioctl(fd, OSDIOCSCSICOMMAND, &sc);
+ }
+#endif
+ if (ret < 0)
+ (void)fprintf(stderr,
+ "scsiformat: SDIOCSCSICOMMAND: %s\n", strerror(errno));
+ else if (read(fd, buf, len) < 0) {
+ (void)fprintf(stderr,
+ "scsiformat: read: %s\n", strerror(errno));
+ pr_sense(fd);
+ }
+
+ if (ioctl(fd, SDIOCSFORMAT, &off) < 0)
+ (void)fprintf(stderr,
+ "scsiformat: SDIOCSFORMAT (off): %s\n", strerror(errno));
+}
+
+void
+usage()
+{
+ (void)fprintf(stderr, "usage: scsiformat [-r] [-p c|d|s|v] device\n");
+ exit(1);
+}
diff --git a/sbin/shutdown/shutdown.8 b/sbin/shutdown/shutdown.8
index d582569..74126f8 100644
--- a/sbin/shutdown/shutdown.8
+++ b/sbin/shutdown/shutdown.8
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)shutdown.8 8.1 (Berkeley) 6/5/93
+.\" @(#)shutdown.8 8.2 (Berkeley) 4/27/95
.\"
-.Dd June 5, 1993
+.Dd April 27, 1995
.Dt SHUTDOWN 8
.Os BSD 4
.Sh NAME
@@ -67,7 +67,7 @@ when
execs
.Xr halt 8 .
.It Fl k
-Kick every body off.
+Kick everybody off.
The
.Fl k
option
diff --git a/sbin/shutdown/shutdown.c b/sbin/shutdown/shutdown.c
index c63ba65..373c6f7 100644
--- a/sbin/shutdown/shutdown.c
+++ b/sbin/shutdown/shutdown.c
@@ -38,7 +38,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)shutdown.c 8.2 (Berkeley) 2/16/94";
+static char sccsid[] = "@(#)shutdown.c 8.4 (Berkeley) 4/28/95";
#endif /* not lint */
#include <sys/param.h>
@@ -164,7 +164,7 @@ main(argc, argv)
break;
if (p != mbuf)
*p++ = ' ';
- bcopy(*argv, p, arglen);
+ memmove(p, *argv, arglen);
p += arglen;
}
*p = '\n';
@@ -473,7 +473,8 @@ void
finish(signo)
int signo;
{
- (void)unlink(_PATH_NOLOGIN);
+ if (!killflg)
+ (void)unlink(_PATH_NOLOGIN);
exit(0);
}
diff --git a/sbin/tunefs/tunefs.8 b/sbin/tunefs/tunefs.8
index bfe4cb1..dc2c397 100644
--- a/sbin/tunefs/tunefs.8
+++ b/sbin/tunefs/tunefs.8
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)tunefs.8 8.2 (Berkeley) 12/11/93
+.\" @(#)tunefs.8 8.3 (Berkeley) 5/3/95
.\"
-.Dd December 11, 1993
+.Dd May 3, 1995
.Dt TUNEFS 8
.Os BSD 4.2
.Sh NAME
@@ -39,6 +39,7 @@
.Nd tune up an existing file system
.Sh SYNOPSIS
.Nm tunefs
+.Op Fl AN
.Op Fl a Ar maxcontig
.Op Fl d Ar rotdelay
.Op Fl e Ar maxbpg
@@ -46,11 +47,33 @@
.Bk -words
.Op Fl o Ar optimize_preference
.Ek
+.Op Fl t Ar trackskew
.Op Ar special | Ar filesys
.Sh DESCRIPTION
-.Nm Tunefs
-is designed to change the dynamic parameters of a file system
+The
+.Nm tunefs
+program is designed to change the dynamic parameters of a file system
which affect the layout policies.
+The
+.Fl N
+flag displays all the settable options
+(after any changes from the tuning options)
+but does not cause any of them to be changed.
+The
+.Fl A
+flag causes the values to be updated in all the alternate
+superblocks instead of just the standard superblock.
+If this option is not used,
+then use of a backup superblock by
+.Xr fsck 8
+will lose anything changed by
+.Nm tunefs .
+The
+.Fl A
+flag is ignored when the
+.Fl N
+flag is specified.
+.Pp
The parameters which are to be changed are indicated by the flags
given below:
.Bl -tag -width Ds
@@ -104,10 +127,15 @@ running out of full sized blocks.
For values of minfree greater than or equal to 10%,
fragmentation is unlikely to be problematical, and
the file system can be optimized for time.
+.It Fl t Ar trackskew
+This specifies the skew in sectors from one track to the next in a cylinder.
+The default value is zero, indicating that each track in a cylinder begins at
+the same rotational position.
.El
.Sh SEE ALSO
.Xr fs 5 ,
.Xr dumpfs 8 ,
+.Xr fsck 8 ,
.Xr newfs 8 ,
.Xr mkfs 8
.Rs
diff --git a/sbin/tunefs/tunefs.c b/sbin/tunefs/tunefs.c
index 583dbff..d5868eb 100644
--- a/sbin/tunefs/tunefs.c
+++ b/sbin/tunefs/tunefs.c
@@ -38,7 +38,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)tunefs.c 8.2 (Berkeley) 4/19/94";
+static char sccsid[] = "@(#)tunefs.c 8.3 (Berkeley) 5/3/95";
#endif /* not lint */
/*
@@ -47,6 +47,7 @@ static char sccsid[] = "@(#)tunefs.c 8.2 (Berkeley) 4/19/94";
#include <sys/param.h>
#include <sys/stat.h>
+#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
#include <errno.h>
@@ -83,7 +84,7 @@ main(argc, argv)
char *cp, *special, *name;
struct stat st;
int i;
- int Aflag = 0;
+ int Aflag = 0, Nflag = 0;
struct fstab *fs;
char *chg[2], device[MAXPATHLEN];
@@ -109,6 +110,8 @@ again:
(st.st_mode & S_IFMT) != S_IFCHR)
errx(10, "%s: not a block or character device", special);
getsb(&sblock, special);
+ chg[FS_OPTSPACE] = "space";
+ chg[FS_OPTTIME] = "time";
for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) {
for (cp = &argv[0][1]; *cp; cp++)
switch (*cp) {
@@ -117,6 +120,10 @@ again:
Aflag++;
continue;
+ case 'N':
+ Nflag++;
+ continue;
+
case 'a':
name = "maximum contiguous block count";
if (argc < 1)
@@ -182,8 +189,6 @@ again:
if (argc < 1)
errx(10, "-o: missing %s", name);
argc--, argv++;
- chg[FS_OPTSPACE] = "space";
- chg[FS_OPTTIME] = "time";
if (strcmp(*argv, chg[FS_OPTSPACE]) == 0)
i = FS_OPTSPACE;
else if (strcmp(*argv, chg[FS_OPTTIME]) == 0)
@@ -207,12 +212,48 @@ again:
warnx(OPTWARN, "space", "<", MINFREE);
continue;
+ case 't':
+ name = "track skew in sectors";
+ if (argc < 1)
+ errx(10, "-t: missing %s", name);
+ argc--, argv++;
+ i = atoi(*argv);
+ if (i < 0)
+ errx(10, "%s: %s must be >= 0",
+ *argv, name);
+ warnx("%s changes from %d to %d",
+ name, sblock.fs_trackskew, i);
+ sblock.fs_trackskew = i;
+ continue;
+
default:
usage();
}
}
if (argc != 1)
usage();
+ if (Nflag) {
+ fprintf(stdout, "tunefs: current settings\n");
+ fprintf(stdout, "\tmaximum contiguous block count %d\n",
+ sblock.fs_maxcontig);
+ fprintf(stdout,
+ "\trotational delay between contiguous blocks %dms\n",
+ sblock.fs_rotdelay);
+ fprintf(stdout,
+ "\tmaximum blocks per file in a cylinder group %d\n",
+ sblock.fs_maxbpg);
+ fprintf(stdout, "\tminimum percentage of free space %d%%\n",
+ sblock.fs_minfree);
+ fprintf(stdout, "\toptimization preference: %s\n",
+ chg[sblock.fs_optim]);
+ fprintf(stdout, "\ttrack skew %d sectors\n",
+ sblock.fs_trackskew);
+ fprintf(stdout, "tunefs: no changes made\n");
+ exit(0);
+ }
+ fi = open(special, 1);
+ if (fi < 0)
+ err(3, "cannot open %s for writing", special);
bwrite((daddr_t)SBOFF / dev_bsize, (char *)&sblock, SBSIZE);
if (Aflag)
for (i = 0; i < sblock.fs_ncg; i++)
@@ -226,13 +267,14 @@ void
usage()
{
- fprintf(stderr, "Usage: tunefs tuneup-options special-device\n");
+ fprintf(stderr, "Usage: tunefs [-AN] tuneup-options special-device\n");
fprintf(stderr, "where tuneup-options are:\n");
- fprintf(stderr, "\t-a maximum contiguous blocks\n");
fprintf(stderr, "\t-d rotational delay between contiguous blocks\n");
+ fprintf(stderr, "\t-a maximum contiguous blocks\n");
fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n");
fprintf(stderr, "\t-m minimum percentage of free space\n");
fprintf(stderr, "\t-o optimization preference (`space' or `time')\n");
+ fprintf(stderr, "\t-t track skew in sectors\n");
exit(2);
}
@@ -242,14 +284,15 @@ getsb(fs, file)
char *file;
{
- fi = open(file, 2);
+ fi = open(file, 0);
if (fi < 0)
- err(3, "cannot open %s", file);
+ err(3, "cannot open %s for reading", file);
if (bread((daddr_t)SBOFF, (char *)fs, SBSIZE))
err(4, "%s: bad super block", file);
if (fs->fs_magic != FS_MAGIC)
err(5, "%s: bad magic number", file);
dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
+ close(fi);
}
void
OpenPOWER on IntegriCloud