summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Martelletto <pedro@cvs.openbsd.org>2006-09-20 14:58:33 +0000
committerPedro Martelletto <pedro@cvs.openbsd.org>2006-09-20 14:58:33 +0000
commitc6e84d9484ba8e891c53e3f05c25582901b5f10e (patch)
tree5da838164fad3c0af2d70caf2abe9c1d9ff11723
parentce9ae77e65f5a4d495a12f5738751174ec0bca83 (diff)
Remove bad144, okay deraadt@ miod@
-rw-r--r--usr.sbin/Makefile4
-rw-r--r--usr.sbin/bad144/Makefile12
-rw-r--r--usr.sbin/bad144/bad144.8177
-rw-r--r--usr.sbin/bad144/bad144.c644
4 files changed, 2 insertions, 835 deletions
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 89ae48a57ae..3bd0727dee1 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -1,8 +1,8 @@
-# $OpenBSD: Makefile,v 1.127 2006/06/01 16:49:55 norby Exp $
+# $OpenBSD: Makefile,v 1.128 2006/09/20 14:58:32 pedro Exp $
.include <bsd.own.mk>
-SUBDIR= ac accton acpid acpidump adduser amd apm apmd arp authpf bad144 \
+SUBDIR= ac accton acpid acpidump adduser amd apm apmd arp authpf \
bgpctl bgpd bind chroot config cron dev_mkdb dhcpd dhcrelay \
dvmrpctl dvmrpd \
edquota eeprom fdformat ftp-proxy gpioctl hostapd hotplugd httpd \
diff --git a/usr.sbin/bad144/Makefile b/usr.sbin/bad144/Makefile
deleted file mode 100644
index e43eb44f29d..00000000000
--- a/usr.sbin/bad144/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $OpenBSD: Makefile,v 1.3 2000/05/18 16:46:37 espie Exp $
-
-.if ${MACHINE} == "i386"
-PROG= bad144
-.else
-NOPROG=yes
-.endif
-
-MAN= bad144.8
-MANSUBDIR=i386
-
-.include <bsd.prog.mk>
diff --git a/usr.sbin/bad144/bad144.8 b/usr.sbin/bad144/bad144.8
deleted file mode 100644
index deba9301d80..00000000000
--- a/usr.sbin/bad144/bad144.8
+++ /dev/null
@@ -1,177 +0,0 @@
-.\" Copyright (c) 1980, 1988, 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. 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: @(#)bad144.8 8.1 (Berkeley) 6/6/93
-.\" $Id: bad144.8,v 1.13 2003/06/02 23:36:52 millert Exp $
-.\"
-.Dd June 6, 1993
-.Dt BAD144 8
-.Os
-.Sh NAME
-.Nm bad144
-.Nd read/write DEC standard 144 bad sector information
-.Sh SYNOPSIS
-.Nm bad144
-.Op Fl c
-.Op Fl n
-.Op Fl v
-.Ar disk
-.Oo
-.Ar snum
-.Op Ar bad ...
-.Oc
-.Nm bad144
-.Fl a
-.Op Fl c
-.Op Fl n
-.Op Fl v
-.Ar disk
-.Op Ar bad ...
-.Sh DESCRIPTION
-.Nm
-can be used to inspect the information stored on a disk that is used by
-the disk drivers to implement bad sector forwarding.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl a
-The argument list consists of new bad sectors to be added to an existing
-list.
-The new sectors are sorted into the list,
-which must be in order.
-Replacement sectors are moved to accommodate the additions;
-the new replacement sectors are cleared.
-.It Fl c
-Forces an attempt to copy the old sector to the replacement,
-and may be useful when replacing an unreliable sector.
-.It Fl n
-Make no permanent changes.
-Useful for debugging.
-Implies
-.Fl v .
-.It Fl v
-The entire process is described as it happens in gory detail if
-.Fl v
-(verbose) is given.
-.El
-.Pp
-The format of
-the information is specified by
-.Tn DEC
-standard 144, as follows.
-The bad sector information is located in the first 5 even numbered sectors
-of the last track of the disk pack.
-There are five identical copies of the information, described by the
-.Va dkbad
-structure.
-.Pp
-Replacement sectors are allocated starting with the first sector before
-the bad sector information and working backwards towards the beginning
-of the disk.
-A maximum of 126 bad sectors are supported.
-The position of the bad sector in the bad sector table determines the
-replacement sector to which it corresponds.
-The bad sectors must be listed in ascending order.
-.Pp
-The bad sector information and replacement sectors are conventionally
-only accessible through the
-.Dq c
-file system partition of disk.o.
-If that partition is used for a file system, the user is responsible for
-making sure that it does not overlap the bad sector information or any
-replacement sectors.
-Thus, one track plus 126 sectors must be reserved to allow use
-of all of the possible bad sector replacements.
-.Pp
-The bad sector structure is as follows:
-.Bd -literal
-struct dkbad {
- long bt_csn; /* cartridge serial number */
- u_short bt_mbz; /* unused; should be 0 */
- u_short bt_flag; /* -1 => alignment cartridge */
- struct bt_bad {
- u_short bt_cyl; /* bad sector cylinder number */
- u_short bt_trksec; /* track and sector number */
- } bt_bad[126];
-};
-.Ed
-.Pp
-Unused slots in the
-.Va bt_bad
-array are filled with all bits set, a putatively
-illegal value.
-.Pp
-.Nm
-is invoked by giving a device name (e.g.,
-.Dq hk0 ,
-.Dq hp1 ) .
-With no optional arguments
-it reads the first sector of the last track
-of the corresponding disk and prints out the bad sector information.
-It issues a warning if the bad sectors are out of order.
-.Nm
-may also be invoked with a serial number for the pack and a list
-of bad sectors.
-It will write the supplied information into all copies
-of the bad-sector file, replacing any previous information.
-Note, however, that
-.Nm
-does not arrange for the specified sectors to be marked bad in this case.
-This procedure should only be used to restore known bad sector information which
-was destroyed.
-.Pp
-It is no longer necessary to reboot to allow the kernel
-to reread the bad-sector table from the drive.
-.Sh SEE ALSO
-.Xr badsect 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.1 .
-.Sh BUGS
-It should be possible to format disks on-line under
-.Tn UNIX .
-.Pp
-It should be possible to mark bad sectors on drives of all type.
-.Pp
-On an 11/750,
-the standard bootstrap drivers used to boot the system do
-not understand bad sectors,
-handle
-.Tn ECC
-errors, or the special
-.Tn SSE
-(skip sector) errors of RM80-type disks.
-This means that none of these errors can occur when reading the file
-.Pa /bsd
-to boot.
-Sectors 0-15 of the disk drive must also not have any of these errors.
-.Pp
-The drivers which write a system core image on disk after a crash do not
-handle errors; thus the crash dump area must be free of errors and bad
-sectors.
diff --git a/usr.sbin/bad144/bad144.c b/usr.sbin/bad144/bad144.c
deleted file mode 100644
index 0daa705c2db..00000000000
--- a/usr.sbin/bad144/bad144.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/* $OpenBSD: bad144.c,v 1.18 2005/02/17 13:50:41 aaron Exp $ */
-/*
- * Copyright (c) 1980, 1986, 1988, 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. 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.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1980, 1986, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)bad144.c 8.1 (Berkeley) 6/6/93";*/
-static char *rcsid = "$Id: bad144.c,v 1.18 2005/02/17 13:50:41 aaron Exp $";
-#endif /* not lint */
-
-/*
- * bad144
- *
- * This program prints and/or initializes a bad block record for a pack,
- * in the format used by the DEC standard 144.
- * It can also add bad sector(s) to the record, moving the sector
- * replacements as necessary.
- *
- * It is preferable to write the bad information with a standard formatter,
- * but this program will do.
- *
- * RP06 sectors are marked as bad by inverting the format bit in the
- * header; on other drives the valid-sector bit is cleared.
- */
-#include <sys/param.h>
-#include <sys/dkbad.h>
-#include <sys/ioctl.h>
-#include <sys/file.h>
-#include <sys/disklabel.h>
-#include <ufs/ffs/fs.h>
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <paths.h>
-#include <string.h>
-#include <err.h>
-
-#define RETRIES 10 /* number of retries on reading old sectors */
-
-int add, copy, verbose, nflag;
-int dups;
-int badfile = -1; /* copy of badsector table to use, -1 if any */
-#define MAXSECSIZE 1024
-struct dkbad curbad, oldbad;
-#define DKBAD_MAGIC 0x4321
-
-char label[BBSIZE];
-daddr_t size;
-struct disklabel *dp;
-char name[BUFSIZ];
-
-void Perror(const char *);
-daddr_t badsn(const struct bt_bad *);
-int blkcopy(int, daddr_t, daddr_t);
-void blkzero(int, daddr_t);
-int checkold(void);
-int compare(const void *, const void *);
-daddr_t getold(int, struct dkbad *);
-void shift(int, int, int);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct bt_bad *bt;
- daddr_t sn, bn[NBT_BAD];
- int i, f, nbad, new, bad, errs, ch;
-
- while ((ch = getopt(argc, argv, "acnv01234")) != -1) {
- switch(ch) {
- case 'a':
- add = 1;
- break;
- case 'c':
- copy = 1;
- break;
- case 'n':
- nflag = 1;
- /* FALLTHROUGH */
- case 'v':
- verbose = 1;
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- badfile = ch - '0';
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 1)
- usage();
-
- if (argv[0][0] != '/')
- (void)snprintf(name, sizeof(name), "%sr%s%c", _PATH_DEV,
- argv[0], 'a' + RAW_PART);
- else
- strlcpy(name, argv[0], sizeof(name));
- f = open(name, argc == 1? O_RDONLY : O_RDWR);
- if (f < 0)
- err(4, "can't open %s", name);
-
- /* obtain label and adjust to fit */
- dp = (struct disklabel *)&label;
- if (ioctl(f, DIOCGDINFO, dp) < 0)
- err(4, "DIOCGDINFO");
-
- if (dp->d_magic != DISKMAGIC || dp->d_magic2 != DISKMAGIC
- /* dkcksum(lp) != 0 */ ) {
- errx(1, "bad pack magic number (pack is unlabeled)");
- }
- if (dp->d_secsize > MAXSECSIZE || dp->d_secsize <= 0) {
- errx(7, "Disk sector size too large/small (%d)",
- dp->d_secsize);
- }
- if (dp->d_type == DTYPE_SCSI) {
- errx(1, "SCSI disks don't need bad144!");
- }
-#ifdef __i386__
- /* are we inside a DOS partition? */
- if (dp->d_partitions[0].p_offset) {
- /* yes, rules change. assume bad tables at end of partition C,
- which maps all of DOS partition we are within -wfj */
- size = dp->d_partitions[2].p_offset + dp->d_partitions[2].p_size;
- } else
-#endif
- size = dp->d_nsectors * dp->d_ntracks * dp->d_ncylinders;
-
- argc--;
- argv++;
- if (argc == 0) {
- sn = getold(f, &oldbad);
- printf("bad block information at sector %d in %s:\n",
- sn, name);
- printf("cartridge serial number: %d(10)\n", oldbad.bt_csn);
- switch (oldbad.bt_flag) {
-
- case (u_short)-1:
- printf("alignment cartridge\n");
- break;
-
- case DKBAD_MAGIC:
- break;
-
- default:
- printf("bt_flag=%x(16)?\n", oldbad.bt_flag);
- break;
- }
- bt = oldbad.bt_bad;
- for (i = 0; i < NBT_BAD; i++) {
- bad = (bt->bt_cyl<<16) + bt->bt_trksec;
- if (bad < 0)
- break;
- printf("sn=%d, cn=%d, tn=%d, sn=%d\n", badsn(bt),
- bt->bt_cyl, bt->bt_trksec>>8, bt->bt_trksec&0xff);
- bt++;
- }
- (void) checkold();
- exit(0);
- }
- if (add) {
- /*
- * Read in the old badsector table.
- * Verify that it makes sense, and the bad sectors
- * are in order. Copy the old table to the new one.
- */
- (void) getold(f, &oldbad);
- i = checkold();
- if (verbose)
- printf("Had %d bad sectors, adding %d\n", i, argc);
- if (i + argc > NBT_BAD) {
- errx(1, "not enough room for %d more sectors, "
- "limited to %d by information format",
- argc, NBT_BAD);
- }
- curbad = oldbad;
- } else {
- curbad.bt_csn = strtol(*argv++, NULL, 10);
- argc--;
- curbad.bt_mbz = 0;
- curbad.bt_flag = DKBAD_MAGIC;
- if (argc > NBT_BAD) {
- errx(1, "too many bad sectors specified, "
- "limited to %d by information format",
- NBT_BAD);
- }
- i = 0;
- }
- errs = 0;
- new = argc;
- while (argc > 0) {
- daddr_t sn = atoi(*argv++);
- argc--;
- if (sn < 0 || sn >= size) {
- printf("%d: out of range [0,%d) for disk %s\n",
- sn, size, dp->d_typename);
- errs++;
- continue;
- }
- bn[i] = sn;
- curbad.bt_bad[i].bt_cyl = sn / (dp->d_nsectors*dp->d_ntracks);
- sn %= (dp->d_nsectors*dp->d_ntracks);
- curbad.bt_bad[i].bt_trksec =
- ((sn/dp->d_nsectors) << 8) + (sn%dp->d_nsectors);
- i++;
- }
- if (errs)
- exit(1);
- nbad = i;
- while (i < NBT_BAD) {
- curbad.bt_bad[i].bt_trksec = -1;
- curbad.bt_bad[i].bt_cyl = -1;
- i++;
- }
- if (add) {
- /*
- * Sort the new bad sectors into the list.
- * Then shuffle the replacement sectors so that
- * the previous bad sectors get the same replacement data.
- */
- qsort((char *)curbad.bt_bad, nbad, sizeof (struct bt_bad),
- compare);
- if (dups) {
- errx(3, "bad sectors have been duplicated; "
- "can't add existing sectors");
- }
- shift(f, nbad, nbad-new);
- }
- if (badfile == -1)
- i = 0;
- else
- i = badfile * 2;
- for (; i < 10 && i < dp->d_nsectors; i += 2) {
- if (lseek(f, dp->d_secsize * (size - dp->d_nsectors + i),
- SEEK_SET) < 0)
- err(4, "lseek");
- if (verbose)
- printf("write badsect file at %d\n",
- size - dp->d_nsectors + i);
- if (nflag == 0 && write(f, (caddr_t)&curbad, sizeof(curbad)) !=
- sizeof(curbad)) {
- warn("write bad sector file %d", i/2);
- }
- if (badfile != -1)
- break;
- }
-#ifdef DIOCSBAD
- if (nflag == 0 && ioctl(f, DIOCSBAD, (caddr_t)&curbad) < 0) {
- warn("can't sync bad-sector file");
- warnx("reboot for changes to take effect");
- }
-#endif
- if ((dp->d_flags & D_BADSECT) == 0 && nflag == 0) {
- dp->d_flags |= D_BADSECT;
- if (ioctl(f, DIOCWDINFO, dp) < 0) {
- err(1, "can't write label to enable bad sector handling");
- }
- }
- exit(0);
-}
-
-daddr_t
-getold(int f, struct dkbad *bad)
-{
- int i;
- daddr_t sn;
-
- if (badfile == -1)
- i = 0;
- else
- i = badfile * 2;
- for (; i < 10 && i < dp->d_nsectors; i += 2) {
- sn = size - dp->d_nsectors + i;
- if (lseek(f, sn * dp->d_secsize, SEEK_SET) < 0)
- err(4, "lseek");
- if (read(f, (char *) bad, dp->d_secsize) == dp->d_secsize) {
- if (i > 0)
- printf("Using bad-sector file %d\n", i/2);
- return(sn);
- }
- warn("read bad sector file at sn %d", sn);
- if (badfile != -1)
- break;
- }
- errx(1, "can't read bad block info from %s", name);
- /*NOTREACHED*/
-}
-
-int
-checkold(void)
-{
- int i;
- struct bt_bad *bt;
- daddr_t sn, lsn = 0;
- int errors = 0, warned = 0;
-
- if (oldbad.bt_flag != DKBAD_MAGIC) {
- warnx("bad flag in bad-sector table %s", name);
- errors++;
- }
- if (oldbad.bt_mbz != 0) {
- warnx("%s: bad magic number", name);
- errors++;
- }
- bt = oldbad.bt_bad;
- for (i = 0; i < NBT_BAD; i++, bt++) {
- if (bt->bt_cyl == 0xffff && bt->bt_trksec == 0xffff)
- break;
- if ((bt->bt_cyl >= dp->d_ncylinders) ||
- ((bt->bt_trksec >> 8) >= dp->d_ntracks) ||
- ((bt->bt_trksec & 0xff) >= dp->d_nsectors)) {
- warnx("cyl/trk/sect out of range in existing entry: "
- "sn=%d, cn=%d, tn=%d, sn=%d",
- badsn(bt), bt->bt_cyl, bt->bt_trksec>>8,
- bt->bt_trksec & 0xff);
- errors++;
- }
- sn = (bt->bt_cyl * dp->d_ntracks +
- (bt->bt_trksec >> 8)) *
- dp->d_nsectors + (bt->bt_trksec & 0xff);
- if (i > 0 && sn < lsn && !warned) {
- warnx("bad sector file is out of order");
- errors++;
- warned++;
- }
- if (i > 0 && sn == lsn) {
- warnx("bad sector file contains duplicates (sn %d)",
- sn);
- errors++;
- }
- lsn = sn;
- }
- if (errors)
- exit(1);
- return (i);
-}
-
-/*
- * Move the bad sector replacements
- * to make room for the new bad sectors.
- * new is the new number of bad sectors, old is the previous count.
- */
-void
-shift(int f, int new, int old)
-{
- daddr_t repl;
-
- /*
- * First replacement is last sector of second-to-last track.
- */
- repl = size - dp->d_nsectors - 1;
- new--; old--;
- while (new >= 0 && new != old) {
- if (old < 0 ||
- compare(&curbad.bt_bad[new], &oldbad.bt_bad[old]) > 0) {
- /*
- * Insert new replacement here-- copy original
- * sector if requested and possible,
- * otherwise write a zero block.
- */
- if (!copy ||
- !blkcopy(f, badsn(&curbad.bt_bad[new]), repl - new))
- blkzero(f, repl - new);
- } else {
- if (blkcopy(f, repl - old, repl - new) == 0)
- fprintf(stderr,
- "Can't copy replacement sector %d to %d\n",
- repl-old, repl-new);
- old--;
- }
- new--;
- }
-}
-
-char *buf;
-
-/*
- * Copy disk sector s1 to s2.
- */
-int
-blkcopy(int f, daddr_t s1, daddr_t s2)
-{
- int tries, n;
-
- if (buf == NULL) {
- buf = malloc((unsigned)dp->d_secsize);
- if (buf == NULL) {
- err(20, NULL);
- }
- }
- for (tries = 0; tries < RETRIES; tries++) {
- if (lseek(f, dp->d_secsize * s1, SEEK_SET) < 0)
- err(4, "lseek");
- if ((n = read(f, buf, dp->d_secsize)) == dp->d_secsize)
- break;
- }
- if (n != dp->d_secsize) {
- warnx("can't read sector %d", s1);
- return(0);
- }
- if (lseek(f, dp->d_secsize * s2, SEEK_SET) < 0)
- err(4, "lseek");
- if (verbose)
- printf("copying %d to %d\n", s1, s2);
- if (nflag == 0 && write(f, buf, dp->d_secsize) != dp->d_secsize) {
- warn("can't write replacement sector %d", s2);
- return(0);
- }
- return(1);
-}
-
-char *zbuf;
-
-void
-blkzero(int f, daddr_t sn)
-{
-
- if (zbuf == NULL) {
- zbuf = malloc((unsigned)dp->d_secsize);
- if (zbuf == NULL) {
- err(20, NULL);
- }
- }
- if (lseek(f, dp->d_secsize * sn, SEEK_SET) < 0)
- err(4, "lseek");
- if (verbose)
- printf("zeroing %d\n", sn);
- if (nflag == 0 && write(f, zbuf, dp->d_secsize) != dp->d_secsize) {
- warn("can't write replacement sector %d", sn);
- }
-}
-
-int
-compare(const void *v1, const void *v2)
-{
- const struct bt_bad *b1 = v1, *b2 = v2;
-
- if (b1->bt_cyl > b2->bt_cyl)
- return(1);
- if (b1->bt_cyl < b2->bt_cyl)
- return(-1);
- if (b1->bt_trksec == b2->bt_trksec)
- dups++;
- return (b1->bt_trksec - b2->bt_trksec);
-}
-
-daddr_t
-badsn(const struct bt_bad *bt)
-{
- return ((bt->bt_cyl*dp->d_ntracks + (bt->bt_trksec>>8)) * dp->d_nsectors
- + (bt->bt_trksec&0xff));
-}
-
-#ifdef vax
-
-struct rp06hdr {
- short h_cyl;
- short h_trksec;
- short h_key1;
- short h_key2;
- char h_data[512];
-#define RP06_FMT 010000 /* 1 == 16 bit, 0 == 18 bit */
-};
-
-/*
- * Most massbus and unibus drives
- * have headers of this form
- */
-struct hpuphdr {
- u_short hpup_cyl;
- u_char hpup_sect;
- u_char hpup_track;
- char hpup_data[512];
-#define HPUP_OKSECT 0xc000 /* this normally means sector is good */
-#define HPUP_16BIT 0x1000 /* 1 == 16 bit format */
-};
-int rp06format(), hpupformat();
-
-struct formats {
- char *f_name; /* disk name */
- int f_bufsize; /* size of sector + header */
- int f_bic; /* value to bic in hpup_cyl */
- int (*f_routine)(); /* routine for special handling */
-} formats[] = {
- { "rp06", sizeof (struct rp06hdr), RP06_FMT, rp06format },
- { "eagle", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { "capricorn", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { "rm03", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { "rm05", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { "9300", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { "9766", sizeof (struct hpuphdr), HPUP_OKSECT, hpupformat },
- { 0, 0, 0, 0 }
-};
-
-/*ARGSUSED*/
-hpupformat(struct formats *fp, struct disklabel *dp, daddr_t blk,
- char *buf, int count)
-{
- struct hpuphdr *hdr = (struct hpuphdr *)buf;
- int sect;
-
- if (count < sizeof(struct hpuphdr)) {
- hdr->hpup_cyl = (HPUP_OKSECT | HPUP_16BIT) |
- (blk / (dp->d_nsectors * dp->d_ntracks));
- sect = blk % (dp->d_nsectors * dp->d_ntracks);
- hdr->hpup_track = (u_char)(sect / dp->d_nsectors);
- hdr->hpup_sect = (u_char)(sect % dp->d_nsectors);
- }
- return (0);
-}
-
-/*ARGSUSED*/
-rp06format(struct formats *fp, struct disklabel *dp, daddr_t blk,
- char *buf, int count)
-{
-
- if (count < sizeof(struct rp06hdr)) {
- fprintf(stderr, "Can't read header on blk %d, can't reformat\n",
- blk);
- return (-1);
- }
- return (0);
-}
-
-format(int fd, daddr_t blk)
-{
- struct formats *fp;
- static char *buf;
- static char bufsize;
- struct format_op fop;
- int n;
-
- for (fp = formats; fp->f_name; fp++)
- if (strcmp(dp->d_typename, fp->f_name) == 0)
- break;
- if (fp->f_name == 0) {
- fprintf(stderr, "bad144: don't know how to format %s disks\n",
- dp->d_typename);
- exit(2);
- }
- if (buf && bufsize < fp->f_bufsize) {
- free(buf);
- buf = NULL;
- }
- if (buf == NULL)
- buf = malloc((unsigned)fp->f_bufsize);
- if (buf == NULL) {
- fprintf(stderr, "bad144: can't allocate sector buffer\n");
- exit(3);
- }
- bufsize = fp->f_bufsize;
- /*
- * Here we do the actual formatting. All we really
- * do is rewrite the sector header and flag the bad sector
- * according to the format table description. If a special
- * purpose format routine is specified, we allow it to
- * process the sector as well.
- */
- if (verbose)
- printf("format blk %d\n", blk);
- bzero((char *)&fop, sizeof(fop));
- fop.df_buf = buf;
- fop.df_count = fp->f_bufsize;
- fop.df_startblk = blk;
- bzero(buf, fp->f_bufsize);
- if (ioctl(fd, DIOCRFORMAT, &fop) < 0)
- perror("bad144: read format");
- if (fp->f_routine &&
- (*fp->f_routine)(fp, dp, blk, buf, fop.df_count) != 0)
- return;
- if (fp->f_bic) {
- struct hpuphdr *xp = (struct hpuphdr *)buf;
-
- xp->hpup_cyl &= ~fp->f_bic;
- }
- if (nflag)
- return;
- bzero((char *)&fop, sizeof(fop));
- fop.df_buf = buf;
- fop.df_count = fp->f_bufsize;
- fop.df_startblk = blk;
- if (ioctl(fd, DIOCWFORMAT, &fop) < 0)
- Perror("write format");
- if (fop.df_count != fp->f_bufsize) {
- char msg[80];
- (void)snprintf(msg, sizeof msg,
- "bad144: write format %d", blk);
- perror(msg);
- }
-}
-#endif
-
-void
-usage(void)
-{
- fprintf(stderr,
- "usage: bad144 [-c] [-n] [-v] disk [snum [bn ...]]\n");
- fprintf(stderr,
- "to read or overwrite bad-sector table, e.g.: bad144 hp0\n");
- fprintf(stderr,
- "or bad144 -a [-c] [-n] [-v] disk [bn ...]\n");
- fprintf(stderr, "where options are:\n");
- fprintf(stderr, "\t-a add new bad sectors to the table\n");
- fprintf(stderr, "\t-c copy original sector to replacement\n");
- fprintf(stderr, "\t-n make no permanent changes\n");
- fprintf(stderr, "\t-v be verbose\n");
- exit(1);
-}