|
|
1.1 ! root 1: /*% cc -O -o rarct % ! 2: * ! 3: * read the rct and other stuff ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: #include <sys/param.h> ! 8: #include <sys/udaioc.h> ! 9: #include "rct.h" ! 10: ! 11: struct ud_unit ud_unit; ! 12: ! 13: main(argc, argv) ! 14: int argc; ! 15: char **argv; ! 16: { ! 17: int hdr = 0; ! 18: int stat = 0; ! 19: int nd = 0; ! 20: int errs = 0; ! 21: ! 22: while (--argc > 0) { ! 23: if (**++argv == '-') ! 24: switch (argv[0][1]) { ! 25: case 'h': ! 26: hdr++; ! 27: continue; ! 28: ! 29: case 'c': ! 30: stat++; ! 31: continue; ! 32: ! 33: default: ! 34: fprintf(stderr, "%s ignored\n", *argv); ! 35: continue; ! 36: } ! 37: nd++; ! 38: errs += dodev(*argv, hdr, stat); ! 39: } ! 40: if (nd == 0) { ! 41: fprintf(stderr, "usage: %s dev\n", argv[0]); ! 42: exit(1); ! 43: } ! 44: exit(errs); ! 45: } ! 46: ! 47: dodev(dev, hdr, stat) ! 48: char *dev; ! 49: int hdr, stat; ! 50: { ! 51: int fd; ! 52: daddr_t size; ! 53: char buf[RBNSEC]; ! 54: register daddr_t i; ! 55: daddr_t rctmax(); ! 56: ! 57: if ((fd = open(dev, 0)) < 0) { ! 58: perror(dev); ! 59: return (1); ! 60: } ! 61: /* ! 62: * hack to force driver to read status ! 63: */ ! 64: if (read(fd, buf, RBNSEC) != RBNSEC) ! 65: perror("read first block"); ! 66: if (ioctl(fd, UIOCHAR, &ud_unit) < 0) { ! 67: perror("ioctl"); ! 68: close(fd); ! 69: return (1); ! 70: } ! 71: if (stat) ! 72: statput(); ! 73: if (hdr) { ! 74: rctread(fd, buf, RCTHDR); ! 75: hdrput(buf); ! 76: } ! 77: if (hdr || stat) { ! 78: close(fd); ! 79: return (0); ! 80: } ! 81: size = rctmax(); ! 82: for (i = RCTTAB; i < size; i++) { ! 83: rctread(fd, buf, i); ! 84: rctput(buf, i); ! 85: } ! 86: close(fd); ! 87: return (0); ! 88: } ! 89: ! 90: daddr_t ! 91: rctmax() ! 92: { ! 93: register daddr_t nrbns; ! 94: ! 95: nrbns = (ud_unit.radsize / ud_unit.tracksz) * ud_unit.rbns; ! 96: nrbns = ((nrbns+RBNPB-1) / RBNPB) + RCTTAB; ! 97: if (nrbns >= ud_unit.rctsize) ! 98: return ((daddr_t)ud_unit.rctsize); ! 99: return (nrbns); ! 100: } ! 101: ! 102: rctread(fd, buf, bno) ! 103: char *buf; ! 104: daddr_t bno; ! 105: { ! 106: struct ud_rctbuf rb; ! 107: register int i; ! 108: ! 109: rb.lbn = bno; ! 110: rb.buf = buf; ! 111: if (ioctl(fd, UIORRCT, &rb) < 0) { ! 112: perror("read rct"); ! 113: fprintf(stderr, "block %d\n", bno); ! 114: for (i = 0; i < RBNSEC; i++) ! 115: buf[i] = 0; ! 116: } ! 117: } ! 118: ! 119: rctput(buf, bno) ! 120: char *buf; ! 121: int bno; ! 122: { ! 123: register long rbn; ! 124: register struct rbd *rp; ! 125: register int i; ! 126: ! 127: rbn = (bno - RCTTAB) * RBNPB; ! 128: rp = (struct rbd *)buf; ! 129: for (i = 0; i < RBNPB; i++, rp++, rbn++) { ! 130: if (rp->rb_code == RFREE || rp->rb_code == RNULL) ! 131: continue; ! 132: printf("%ld: %o: %ld\n", rbn, rp->rb_code, rp->rb_lbn); ! 133: } ! 134: } ! 135: ! 136: hdrput(buf) ! 137: char *buf; ! 138: { ! 139: register struct rct *rc; ! 140: ! 141: rc = (struct rct *)buf; ! 142: printf("volser x%lx x%lx\n", rc->rc_volser[0], rc->rc_volser[1]); ! 143: printf("flags 0%x lbn %ld rbn %ld badrbn %ld\n", ! 144: rc->rc_flags, rc->rc_lbn, rc->rc_rbn, rc->rc_badrbn); ! 145: } ! 146: ! 147: char * ! 148: mtoa(m) ! 149: long m; ! 150: { ! 151: static char buf[10]; ! 152: char *s = buf; ! 153: register k; ! 154: ! 155: #define M5(b, s) if(k = ((m>>(b-4))&0x1F)) *s++ = 'A'-1+k ! 156: ! 157: M5(31, s); ! 158: M5(26, s); ! 159: M5(21, s); ! 160: M5(16, s); ! 161: M5(11, s); ! 162: m &= 0x7F; ! 163: *s++ = '0'+(m/10); ! 164: *s++ = '0'+(m%10); ! 165: *s = 0; ! 166: return(buf); ! 167: } ! 168: ! 169: statput() ! 170: { ! 171: ! 172: printf("size %ld\nrctsize %ld\n", ud_unit.radsize, ud_unit.rctsize); ! 173: printf("medium x%lx='%s'\n", ud_unit.medium, mtoa(ud_unit.medium)); ! 174: printf("tracks %d groups %d cyls %d\n", ! 175: ud_unit.tracksz, ud_unit.groupsz, ud_unit.cylsz); ! 176: printf("rbns/track %d\ncopies %d\n", ud_unit.rbns, ud_unit.copies); ! 177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.