|
|
1.1 ! root 1: #include "fs.h" ! 2: #include "sys/ttyio.h" ! 3: #include "ctype.h" ! 4: ! 5: char *options = "ivwI:B:b:M:"; ! 6: int bsize = 4096; ! 7: main(argc, argv) ! 8: char **argv; ! 9: { int c; ! 10: extern char *optarg; ! 11: extern int optind; ! 12: ! 13: timer(0); ! 14: while((c = getopt(argc, argv, options)) != -1) ! 15: switch(c) { ! 16: default: ! 17: flags[c]++; ! 18: continue; ! 19: case '?': ! 20: fatal("unknown arg %c (%s)\n", c, options); ! 21: case 'b': ! 22: bsize = atoi(optarg); ! 23: continue; ! 24: case 'M': ! 25: flags[c]++; ! 26: pblk = atoi(optarg); ! 27: continue; ! 28: case 'I': ! 29: for(optind--; optind < argc && isdigit(argv[optind][0]); optind++) ! 30: addi(atoi(argv[optind])); ! 31: continue; ! 32: case 'B': ! 33: for(optind--; optind < argc && isdigit(argv[optind][0]); optind++) ! 34: addb(atoi(argv[optind])); ! 35: continue; ! 36: } ! 37: if(optind >= argc) ! 38: fatal("no file?\n"); ! 39: if(optind < argc-1) ! 40: fatal("too many files %s\n", argv[optind]); ! 41: if(flags['i']) ! 42: flags['w']++; ! 43: file = argv[optind]; ! 44: if(flags['M']) ! 45: mknew(); ! 46: doit(file); ! 47: } ! 48: ! 49: doit(file) ! 50: { ! 51: fd = -1; ! 52: if(flags['w']) { ! 53: fd = open(file, 2); ! 54: if(fd < 0) { ! 55: pmesg("no write\n"); ! 56: flags['w'] = 0; ! 57: } ! 58: } ! 59: if(fd < 0) ! 60: fd = open(file, 0); ! 61: if(fd < 0) { ! 62: perror(file); ! 63: fatal("can't open file system\n"); ! 64: } ! 65: firstsuper(); /* read it, sanity check, allocate imap, bmap */ ! 66: timer("read"); ! 67: scaninodes(); /* read all the inode blocks */ ! 68: timer("inodes"); ! 69: if(blkcnts[Ind3]) ! 70: indblocks(Ind3, Ind2); ! 71: if(blkcnts[Ind2]) /* cope with indirect blocks */ ! 72: indblocks(Ind2, Ind); ! 73: if(blkcnts[Ind]) ! 74: indblocks(Ind, Data); ! 75: timer("indir"); ! 76: dirblocks(); /* read all the directory blocks */ ! 77: timer("dirs"); ! 78: dochecks(); /* tree structure etc */ ! 79: checksuper(); /* is the super block ok? */ ! 80: repairs(); ! 81: report(); /* say what happened somewhere */ ! 82: timer("done"); ! 83: if (exitcode) ! 84: pmesg("exit %d\n", exitcode); ! 85: exit(exitcode); ! 86: } ! 87: ! 88: pmesg(s, a, b, c, d, e, f, g, h, i) ! 89: char *s; ! 90: { static char *p; ! 91: if(!p) ! 92: p = mbuf; ! 93: if(p == mbuf && file) { ! 94: sprintf(mbuf, "%s: ", file); ! 95: p = mbuf + strlen(mbuf); ! 96: } ! 97: sprintf(p, s, a, b, c, d, e, f, g, h, i); ! 98: write(2, mbuf, strlen(mbuf)); ! 99: } ! 100: ! 101: fatal(s, a, b, c, d, e, f, g, h, i) ! 102: char *s; ! 103: { ! 104: pmesg(s, a, b, c, d, e, f, g, h, i); ! 105: exit(1); ! 106: } ! 107: ! 108: bread(loc, buf, cnt) ! 109: char *buf; ! 110: { int i; ! 111: i = bsize *cnt; ! 112: if(lseek(fd, bsize*loc, 0) < 0 || read(fd, buf, i) != i) ! 113: return(-1); ! 114: return(0); ! 115: } ! 116: ! 117: bwrite(loc, buf, cnt) ! 118: char *buf; ! 119: { int i = bsize * cnt; ! 120: if(lseek(fd, bsize*loc, 0) < 0 || write(fd, buf, i) != i) ! 121: return(-1); ! 122: return(0); ! 123: } ! 124: ! 125: char * ! 126: itype(n) ! 127: { ! 128: switch(n) { ! 129: default: ! 130: sprintf(xbuf, "?%d?", n); ! 131: return(xbuf); ! 132: case Unalloc: return("Unalloc"); ! 133: case Dir: return("Dir"); ! 134: case Lnk: return("Lnk"); ! 135: case Chr: return("Chr"); ! 136: case Blk: return("Blk"); ! 137: case Reg: return("Reg"); ! 138: case Weird: return("Weird"); ! 139: } ! 140: } ! 141: ! 142: char * ! 143: btype(n) ! 144: { ! 145: switch(n) { ! 146: default: ! 147: sprintf(xbuf, "?%d?", n); ! 148: return(xbuf); ! 149: case Unk: return("Unk"); ! 150: case Sblock: return("Sblock"); ! 151: case Inode: return("Inode"); ! 152: case Free: return("Free"); ! 153: case Data: return("Data"); ! 154: case Ind: return("Ind"); ! 155: case Ind2: return("Ind2"); ! 156: case Ind3: return("Ind3"); ! 157: case First: return("First"); ! 158: case Other: return("Otherdir"); ! 159: case Bits: return("Bits"); ! 160: case Ioerr: return("Ioerr"); ! 161: case Boot: return("Boot"); ! 162: case Bad: return("Bad"); ! 163: } ! 164: } ! 165: ! 166: addi(n) ! 167: { ! 168: if(!ilen) ! 169: iarg = (int *) malloc((ilen = 10) * sizeof(int)); ! 170: else if(iptr >= ilen) { ! 171: ilen *= 3; ! 172: iarg = (int *) realloc((char *)iarg, ilen * sizeof(int)); ! 173: } ! 174: if(!iarg) { ! 175: pmesg("can't alloc iarg %d\n", n); ! 176: return; ! 177: } ! 178: iarg[iptr++] = n; ! 179: } ! 180: ! 181: addb(n) ! 182: { ! 183: if(!blen) ! 184: barg = (int *) malloc((blen = 10) * sizeof(int)); ! 185: else if(bptr >= blen) { ! 186: blen *= 3; ! 187: barg = (int *) realloc((char *)barg, blen * sizeof(int)); ! 188: } ! 189: if(!barg) { ! 190: pmesg("can't alloc barg %d\n", n); ! 191: return; ! 192: } ! 193: barg[bptr++] = n; ! 194: } ! 195: ! 196: /* how do we flush stdin? */ ! 197: qry(s) ! 198: char *s; ! 199: { int n; ! 200: pmesg(s); ! 201: ioctl(0, TIOCFLUSH, 0); ! 202: n = read(0, mbuf+40, 128-40); ! 203: if(n <= 0) ! 204: return(n); ! 205: return(mbuf[40]); ! 206: } ! 207: #include "sys/times.h" ! 208: long ot, nt; ! 209: struct tms otm, ntm; ! 210: timer(s) ! 211: char *s; ! 212: { ! 213: if(ot == nt && nt == 0 || !flags['v']) { ! 214: (void) time(&ot); ! 215: times(&otm); ! 216: return; ! 217: } ! 218: (void) time(&nt); ! 219: times(&ntm); ! 220: pmesg("(time)%s %d %.3fu %.3fs\n", s, nt-ot, ! 221: (ntm.tms_utime-otm.tms_utime)/60., ! 222: (ntm.tms_stime-otm.tms_stime)/60.); ! 223: ot=nt; ! 224: otm = ntm; ! 225: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.