📄 bad144.c
字号:
checkold(){ register int i; register struct bt_bad *bt; daddr_t sn, lsn; int errors = 0, warned = 0; if (oldbad.bt_flag != DKBAD_MAGIC) { fprintf(stderr, "bad144: %s: bad flag in bad-sector table\n", name); errors++; } if (oldbad.bt_mbz != 0) { fprintf(stderr, "bad144: %s: bad magic number\n", name); errors++; } bt = oldbad.bt_bad; for (i = 0; i < 126; 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)) { fprintf(stderr, "bad144: cyl/trk/sect out of range in existing entry: "); fprintf(stderr, "sn=%d, cn=%d, tn=%d, sn=%d\n", 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) { fprintf(stderr, "bad144: bad sector file is out of order\n"); errors++; warned++; } if (i > 0 && sn == lsn) { fprintf(stderr, "bad144: bad sector file contains duplicates (sn %d)\n", 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. */shift(f, new, 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. */blkcopy(f, s1, s2)daddr_t s1, s2;{ register tries, n; if (buf == (char *)NULL) { buf = malloc((unsigned)dp->d_secsize); if (buf == (char *)NULL) { fprintf(stderr, "Out of memory\n"); exit(20); } } for (tries = 0; tries < RETRIES; tries++) { if (lseek(f, dp->d_secsize * s1, L_SET) < 0) Perror("lseek"); if ((n = read(f, buf, dp->d_secsize)) == dp->d_secsize) break; } if (n != dp->d_secsize) { fprintf(stderr, "bad144: can't read sector, %d: ", s1); if (n < 0) perror((char *)0); return(0); } if (lseek(f, dp->d_secsize * s2, L_SET) < 0) Perror("lseek"); if (verbose) printf("copying %d to %d\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); perror((char *)0); return(0); } return(1);}char *zbuf;blkzero(f, sn)daddr_t sn;{ if (zbuf == (char *)NULL) { zbuf = malloc((unsigned)dp->d_secsize); if (zbuf == (char *)NULL) { fprintf(stderr, "Out of memory\n"); exit(20); } } if (lseek(f, dp->d_secsize * sn, L_SET) < 0) Perror("lseek"); if (verbose) printf("zeroing %d\n", sn); if (nflag == 0 && write(f, zbuf, dp->d_secsize) != dp->d_secsize) { fprintf(stderr, "bad144: can't write replacement sector, %d: ", sn); perror((char *)0); }}compare(b1, b2)register struct bt_bad *b1, *b2;{ 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_tbadsn(bt)register struct bt_bad *bt;{ return ((bt->bt_cyl*dp->d_ntracks + (bt->bt_trksec>>8)) * dp->d_nsectors + (bt->bt_trksec&0xff));}#ifdef vaxstruct 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(fp, dp, blk, buf, count) 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(fp, dp, blk, buf, count) 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(fd, blk) int fd; daddr_t blk;{ register 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)sprintf(msg, "bad144: write format %d", blk); perror(msg); }}#endifPerror(op) char *op;{ fprintf(stderr, "bad144: "); perror(op); exit(4);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -