Annotation of researchv10no/cmd/bad144.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.