|
|
1.1 root 1: static char *sccsid = "@(#)bad144.c 4.2 (Berkeley) 81/05/11";
2:
3: /*
4: * bad144
5: *
6: * This program prints and/or initializes a bad block record for a pack,
7: * in the format used by the DEC standard 144.
8: *
9: * BUGS:
10: * Only reads/writes the first of the bad block record (sector 0
11: * of the last track of the disk); in fact, there are copies
12: * of the information in the first 5 even numbered sectors of this
13: * track, but UNIX uses only the first, and we don't bother with the
14: * others.
15: *
16: * It is preferable to write the bad information with a standard formatter,
17: * but this program will do in a pinch, e.g. if the bad information is
18: * accidentally wiped out this is a much faster way of restoring it than
19: * reformatting. To add a new bad sector the formatter must be used in
20: * general since UNIX doesn't have on-line formatters to write the BSE
21: * error in the header. The
22: */
23: #include <sys/types.h>
24: #include <sys/dkbad.h>
25: #include <stdio.h>
26:
27: struct diskinfo {
28: char *di_type; /* type name of disk */
29: int di_size; /* size of entire volume in sectors */
30: int di_nsect; /* sectors per track */
31: int di_ntrak; /* tracks per cylinder */
32: } diskinfo[] = {
33: "rk06", 22*3*411, 22, 3,
34: "rk07", 22*3*815, 22, 3,
35: "rm03", 32*5*823, 32, 5,
36: "rm05", 32*19*823, 32, 19,
37: "rp06", 22*19*815, 22, 19,
38: "rm80", 31*14*559, 31, 14,
39: "rp05", 22*19*411, 22, 19,
40: "rp07", 50*32*630, 50, 32,
41: 0,
42: };
43: struct dkbad dkbad;
44:
45: main(argc, argv)
46: int argc;
47: char **argv;
48: {
49: register struct diskinfo *di;
50: register struct bt_bad *bt;
51: char name[BUFSIZ];
52: int i, f, bad, oldbad, errs;
53:
54: argc--, argv++;
55: if (argc < 2) {
56: fprintf(stderr, "usage: bad type disk [ snum [ bn ... ] ]\n");
57: fprintf(stderr, "e.g.: bad rk07 hk0\n");
58: exit(1);
59: }
60: for (di = diskinfo; di->di_type; di++)
61: if (!strcmp(di->di_type, argv[0]))
62: goto found;
63: fprintf(stderr, "%s: not a known disk type\n", argv[0]);
64: fprintf(stderr, "known types:");
65: for (di = diskinfo; di->di_type; di++)
66: fprintf(stderr, " %s", di->di_type);
67: fprintf(stderr, "\n");
68: exit(1);
69: found:
70: sprintf(name, "/dev/r%sc", argv[1]);
71: argc -= 2;
72: argv += 2;
73: if (argc == 0) {
74: f = open(name, 0);
75: if (f < 0) {
76: perror(name);
77: exit(1);
78: }
79: lseek(f, 512 * (di->di_size - di->di_nsect), 0);
80: printf("bad block information at 0x%x in %s:\n",
81: tell(f), name);
82: if (read(f, &dkbad, sizeof (struct dkbad)) !=
83: sizeof (struct dkbad)) {
84: fprintf("%s: can't read bad block info (wrong type disk?)\n");
85: exit(1);
86: }
87: printf("cartidge serial number: %d(10)\n", dkbad.bt_csn);
88: switch (dkbad.bt_flag) {
89: case -1:
90: printf("alignment cartridge\n");
91: break;
92: case 0:
93: break;
94: default:
95: printf("bt_flag=%x(16)?\n", dkbad.bt_flag);
96: break;
97: }
98: oldbad = 0;
99: bt = dkbad.bt_bad;
100: for (i = 0; i < 128; i++) {
101: bad = (bt->bt_cyl<<16) + bt->bt_trksec;
102: if (bad < 0)
103: break;
104: printf("sn=%d, cn=%d, tn=%d, sn=%d\n",
105: (bt->bt_cyl*di->di_ntrak + (bt->bt_trksec>>8)) *
106: di->di_nsect + (bt->bt_trksec&0xff),
107: bt->bt_cyl, bt->bt_trksec>>8, bt->bt_trksec&0xff);
108: bt++;
109: }
110: exit (0);
111: }
112: f = open(name, 1);
113: if (f < 0) {
114: perror(name);
115: exit(1);
116: }
117: dkbad.bt_csn = atoi(*argv++);
118: argc--;
119: dkbad.bt_mbz = 0;
120: if (argc > 2 * di->di_nsect || argc > 126) {
121: printf("bad: too many bad sectors specified\n");
122: if (2 * di->di_nsect > 126)
123: printf("limited to 126 by information format\n");
124: else
125: printf("limited to %d (only 2 tracks of sectors)\n",
126: 2 * di->di_nsect);
127: exit(1);
128: }
129: errs = 0;
130: i = 0;
131: while (argc > 0) {
132: int sn = atoi(*argv++);
133: argc--;
134: if (sn < 0 || sn >= di->di_size) {
135: printf("%d: out of range [0,%d) for %s\n",
136: sn, di->di_size, di->di_type);
137: errs++;
138: }
139: dkbad.bt_bad[i].bt_cyl = sn / (di->di_nsect*di->di_ntrak);
140: sn %= (di->di_nsect*di->di_ntrak);
141: dkbad.bt_bad[i].bt_trksec =
142: ((sn/di->di_nsect) << 8) + (sn%di->di_nsect);
143: i++;
144: }
145: while (i < 126) {
146: dkbad.bt_bad[i].bt_trksec = -1;
147: dkbad.bt_bad[i].bt_cyl = -1;
148: i++;
149: }
150: if (errs)
151: exit(1);
152: lseek(f, 512 * (di->di_size - di->di_nsect), 0);
153: if (write(f, (caddr_t)&dkbad, sizeof (dkbad)) != sizeof (dkbad)) {
154: perror(name);
155: exit(1);
156: }
157: exit(0);
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.