Clean up, and make it work with Bruces wd.c changes.

Bad144 is on the way back.
This commit is contained in:
phk 1995-04-09 06:06:01 +00:00
parent a68a51bd80
commit 4c8f3b9d67
2 changed files with 66 additions and 31 deletions

View File

@ -1,7 +1,9 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= bad144
SRCS= bad144.c dkcksum.c
MAN8= bad144.8
MANSUBDIR=/i386
.PATH: ${.CURDIR}/../../sbin/disklabel
.include <bsd.prog.mk>

View File

@ -63,13 +63,13 @@ static char sccsid[] = "@(#)bad144.c 8.1 (Berkeley) 6/6/93";
#include <ufs/ffs/fs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <paths.h>
#define RETRIES 10 /* number of retries on reading old sectors */
#define RAWPART "c" /* disk partition containing badsector tables */
int fflag, add, copy, verbose, nflag;
int compare();
int dups;
int badfile = -1; /* copy of badsector table to use, -1 if any */
#define MAXSECSIZE 1024
@ -77,11 +77,19 @@ struct dkbad curbad, oldbad;
#define DKBAD_MAGIC 0x4321
char label[BBSIZE];
daddr_t size, getold(), badsn();
daddr_t size;
struct disklabel *dp;
char name[BUFSIZ];
char *malloc();
off_t lseek();
daddr_t sn;
void blkzero __P((int f, daddr_t sn));
int compare __P((struct bt_bad *b1, struct bt_bad *b2));
daddr_t badsn __P((struct bt_bad *bt));
daddr_t getold __P((int f, struct dkbad *bad));
int blkcopy __P((int f, daddr_t s1, daddr_t s2));
void Perror __P((char *op));
void shift __P((int f, int new, int old));
int checkold __P((struct dkbad *oldbad));
main(argc, argv)
int argc;
@ -140,7 +148,7 @@ main(argc, argv)
exit(1);
}
if (argv[0][0] != '/')
(void)sprintf(name, "%s/r%s%s", _PATH_DEV, argv[0], RAWPART);
(void)sprintf(name, "%s/r%sc", _PATH_DEV, argv[0]);
else
strcpy(name, argv[0]);
f = open(name, argc == 1? O_RDONLY : O_RDWR);
@ -159,18 +167,18 @@ main(argc, argv)
exit(1);
}
if (dp->d_secsize > MAXSECSIZE || dp->d_secsize <= 0) {
fprintf(stderr, "Disk sector size too large/small (%d)\n",
fprintf(stderr, "Disk sector size too large/small (%ld)\n",
dp->d_secsize);
exit(7);
}
size = dp->d_nsectors * dp->d_ntracks * dp->d_ncylinders;
size = dp->d_secperunit;
argc--;
argv++;
if (argc == 0) {
sn = getold(f, &oldbad);
printf("bad block information at sector %d in %s:\n",
printf("bad block information at sector %lu in %s:\n",
sn, name);
printf("cartridge serial number: %d(10)\n", oldbad.bt_csn);
printf("cartridge serial number: %ld(10)\n", oldbad.bt_csn);
switch (oldbad.bt_flag) {
case (u_short)-1:
@ -189,7 +197,7 @@ main(argc, argv)
bad = (bt->bt_cyl<<16) + bt->bt_trksec;
if (bad < 0)
break;
printf("sn=%d, cn=%d, tn=%d, sn=%d\n", badsn(bt),
printf("sn=%lu, cn=%d, tn=%d, sn=%d\n", badsn(bt),
bt->bt_cyl, bt->bt_trksec>>8, bt->bt_trksec&0xff);
bt++;
}
@ -231,7 +239,7 @@ main(argc, argv)
daddr_t sn = atoi(*argv++);
argc--;
if (sn < 0 || sn >= size) {
printf("%d: out of range [0,%d) for disk %s\n",
printf("%lu: out of range [0,%lu) for disk %s\n",
sn, size, dp->d_typename);
errs++;
continue;
@ -275,7 +283,7 @@ main(argc, argv)
L_SET) < 0)
Perror("lseek");
if (verbose)
printf("write badsect file at %d\n",
printf("write badsect file at %ld\n",
size - dp->d_nsectors + i);
if (nflag == 0 && write(f, (caddr_t)&curbad, sizeof(curbad)) !=
sizeof(curbad)) {
@ -292,6 +300,20 @@ main(argc, argv)
for (i = nbad - new; i < nbad; i++)
format(f, bn[i]);
#endif
i = 1;
if (ioctl(f, DIOCWLABEL, &i) < 0)
Perror("ioctl DIOCWLABEL(1)");
dp->d_flags |= D_BADSECT;
dp->d_checksum = 0;
dp->d_checksum = dkcksum(dp);
if (lseek(f, 0, L_SET) < 0)
Perror("lseek");
if (write(f, label, sizeof(label)) < 0)
Perror("read");
i = 0;
if (ioctl(f, DIOCWLABEL, &i) < 0)
Perror("ioctl DIOCWLABEL(0)");
#ifdef DIOCSBAD
if (nflag == 0 && ioctl(f, DIOCSBAD, (caddr_t)&curbad) < 0)
fprintf(stderr,
@ -302,7 +324,8 @@ main(argc, argv)
daddr_t
getold(f, bad)
struct dkbad *bad;
int f;
struct dkbad *bad;
{
register int i;
daddr_t sn;
@ -321,7 +344,7 @@ struct dkbad *bad;
printf("Using bad-sector file %d\n", i/2);
return(sn);
}
(void)sprintf(msg, "bad144: read bad sector file at sn %d", sn);
(void)sprintf(msg, "bad144: read bad sector file at sn %lu", sn);
perror(msg);
if (badfile != -1)
break;
@ -331,23 +354,25 @@ struct dkbad *bad;
/*NOTREACHED*/
}
checkold()
int
checkold(oldbad)
struct dkbad *oldbad;
{
register int i;
register struct bt_bad *bt;
daddr_t sn, lsn;
daddr_t sn, lsn=0;
int errors = 0, warned = 0;
if (oldbad.bt_flag != DKBAD_MAGIC) {
if (oldbad->bt_flag != DKBAD_MAGIC) {
fprintf(stderr, "bad144: %s: bad flag in bad-sector table\n",
name);
errors++;
}
if (oldbad.bt_mbz != 0) {
if (oldbad->bt_mbz != 0) {
fprintf(stderr, "bad144: %s: bad magic number\n", name);
errors++;
}
bt = oldbad.bt_bad;
bt = oldbad->bt_bad;
for (i = 0; i < 126; i++, bt++) {
if (bt->bt_cyl == 0xffff && bt->bt_trksec == 0xffff)
break;
@ -356,7 +381,7 @@ checkold()
((bt->bt_trksec & 0xff) >= dp->d_nsectors)) {
fprintf(stderr,
"bad144: cyl/trk/sect out of range in existing entry: ");
fprintf(stderr, "sn=%d, cn=%d, tn=%d, sn=%d\n",
fprintf(stderr, "sn=%lu, cn=%d, tn=%d, sn=%u\n",
badsn(bt), bt->bt_cyl, bt->bt_trksec>>8,
bt->bt_trksec & 0xff);
errors++;
@ -372,7 +397,7 @@ checkold()
}
if (i > 0 && sn == lsn) {
fprintf(stderr,
"bad144: bad sector file contains duplicates (sn %d)\n",
"bad144: bad sector file contains duplicates (sn %lu)\n",
sn);
errors++;
}
@ -388,7 +413,9 @@ checkold()
* to make room for the new bad sectors.
* new is the new number of bad sectors, old is the previous count.
*/
void
shift(f, new, old)
int f,new,old;
{
daddr_t repl;
@ -411,7 +438,7 @@ shift(f, new, old)
} else {
if (blkcopy(f, repl - old, repl - new) == 0)
fprintf(stderr,
"Can't copy replacement sector %d to %d\n",
"Can't copy replacement sector %ld to %ld\n",
repl-old, repl-new);
old--;
}
@ -424,8 +451,10 @@ char *buf;
/*
* Copy disk sector s1 to s2.
*/
int
blkcopy(f, s1, s2)
daddr_t s1, s2;
int f;
daddr_t s1, s2;
{
register tries, n;
@ -443,7 +472,7 @@ daddr_t s1, s2;
break;
}
if (n != dp->d_secsize) {
fprintf(stderr, "bad144: can't read sector, %d: ", s1);
fprintf(stderr, "bad144: can't read sector, %lu: ", s1);
if (n < 0)
perror((char *)0);
return(0);
@ -451,10 +480,10 @@ daddr_t s1, s2;
if (lseek(f, dp->d_secsize * s2, L_SET) < 0)
Perror("lseek");
if (verbose)
printf("copying %d to %d\n", s1, s2);
printf("copying %lu to %lu\n", s1, s2);
if (nflag == 0 && write(f, buf, dp->d_secsize) != dp->d_secsize) {
fprintf(stderr,
"bad144: can't write replacement sector, %d: ", s2);
"bad144: can't write replacement sector, %lu: ", s2);
perror((char *)0);
return(0);
}
@ -463,8 +492,10 @@ daddr_t s1, s2;
char *zbuf;
void
blkzero(f, sn)
daddr_t sn;
int f;
daddr_t sn;
{
if (zbuf == (char *)NULL) {
@ -477,14 +508,15 @@ daddr_t sn;
if (lseek(f, dp->d_secsize * sn, L_SET) < 0)
Perror("lseek");
if (verbose)
printf("zeroing %d\n", sn);
printf("zeroing %lu\n", sn);
if (nflag == 0 && write(f, zbuf, dp->d_secsize) != dp->d_secsize) {
fprintf(stderr,
"bad144: can't write replacement sector, %d: ", sn);
"bad144: can't write replacement sector, %lu: ", sn);
perror((char *)0);
}
}
int
compare(b1, b2)
register struct bt_bad *b1, *b2;
{
@ -499,7 +531,7 @@ register struct bt_bad *b1, *b2;
daddr_t
badsn(bt)
register struct bt_bad *bt;
register struct bt_bad *bt;
{
return ((bt->bt_cyl*dp->d_ntracks + (bt->bt_trksec>>8)) * dp->d_nsectors
+ (bt->bt_trksec&0xff));
@ -653,6 +685,7 @@ format(fd, blk)
}
#endif
void
Perror(op)
char *op;
{