Annotation of researchv10no/cmd/bad144.c, revision 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.