|
|
1.1 ! root 1: static char *sccsid = "@(#)icheck.c 4.1 (Berkeley) 10/1/80"; ! 2: #define NI 16 ! 3: #define NB 500 ! 4: #define BITS 8 ! 5: #define MAXFN 500 ! 6: ! 7: #ifndef STANDALONE ! 8: #include <stdio.h> ! 9: #endif ! 10: #include <sys/param.h> ! 11: #include <sys/inode.h> ! 12: #include <sys/ino.h> ! 13: #include <sys/fblk.h> ! 14: #include <sys/filsys.h> ! 15: ! 16: struct filsys sblock; ! 17: struct dinode itab[INOPB*NI]; ! 18: daddr_t iaddr[NADDR]; ! 19: daddr_t blist[NB]; ! 20: char *bmap; ! 21: ! 22: int sflg; ! 23: int mflg; ! 24: int dflg; ! 25: int fi; ! 26: ino_t ino; ! 27: ! 28: ino_t nrfile; ! 29: ino_t ndfile; ! 30: ino_t nbfile; ! 31: ino_t ncfile; ! 32: ! 33: daddr_t ndirect; ! 34: daddr_t nindir; ! 35: daddr_t niindir; ! 36: daddr_t niiindir; ! 37: daddr_t nfree; ! 38: daddr_t ndup; ! 39: ! 40: int nerror; ! 41: ! 42: long atol(); ! 43: daddr_t alloc(); ! 44: #ifndef STANDALONE ! 45: char *malloc(); ! 46: #endif ! 47: ! 48: main(argc, argv) ! 49: char *argv[]; ! 50: { ! 51: register i; ! 52: long n; ! 53: ! 54: blist[0] = -1; ! 55: #ifndef STANDALONE ! 56: while (--argc) { ! 57: argv++; ! 58: if (**argv=='-') ! 59: switch ((*argv)[1]) { ! 60: case 'd': ! 61: dflg++; ! 62: continue; ! 63: ! 64: ! 65: case 'm': ! 66: mflg++; ! 67: continue; ! 68: ! 69: case 's': ! 70: sflg++; ! 71: continue; ! 72: ! 73: case 'b': ! 74: for(i=0; i<NB; i++) { ! 75: n = atol(argv[1]); ! 76: if(n == 0) ! 77: break; ! 78: blist[i] = n; ! 79: argv++; ! 80: argc--; ! 81: } ! 82: blist[i] = -1; ! 83: continue; ! 84: ! 85: default: ! 86: printf("Bad flag\n"); ! 87: } ! 88: check(*argv); ! 89: } ! 90: #else ! 91: { ! 92: static char fname[128]; ! 93: ! 94: printf("File: "); ! 95: gets(fname); ! 96: check(fname); ! 97: } ! 98: #endif ! 99: return(nerror); ! 100: } ! 101: ! 102: check(file) ! 103: char *file; ! 104: { ! 105: register i, j; ! 106: ino_t mino; ! 107: daddr_t d; ! 108: long n; ! 109: ! 110: fi = open(file, sflg?2:0); ! 111: if (fi < 0) { ! 112: printf("cannot open %s\n", file); ! 113: nerror |= 04; ! 114: return; ! 115: } ! 116: printf("%s:\n", file); ! 117: nrfile = 0; ! 118: ndfile = 0; ! 119: ncfile = 0; ! 120: nbfile = 0; ! 121: ! 122: ndirect = 0; ! 123: nindir = 0; ! 124: niindir = 0; ! 125: niiindir = 0; ! 126: ! 127: ndup = 0; ! 128: #ifndef STANDALONE ! 129: sync(); ! 130: #endif ! 131: bread((daddr_t)1, (char *)&sblock, sizeof(sblock)); ! 132: mino = ((int)sblock.s_isize-2) * INOPB; ! 133: ino = 0; ! 134: n = (sblock.s_fsize - (int)sblock.s_isize + BITS-1) / BITS; ! 135: if (n != (unsigned)n) { ! 136: printf("Check fsize and isize: %ld, %u\n", ! 137: sblock.s_fsize, (int)sblock.s_isize); ! 138: } ! 139: #ifdef STANDALONE ! 140: bmap = NULL; ! 141: #else ! 142: bmap = malloc((unsigned)n); ! 143: #endif ! 144: if (bmap==NULL) { ! 145: printf("Not enough core; duplicates unchecked\n"); ! 146: dflg++; ! 147: sflg = 0; ! 148: } ! 149: if(!dflg) ! 150: for(i=0; i<(unsigned)n; i++) ! 151: bmap[i] = 0; ! 152: for(i=2;; i+=NI) { ! 153: if(ino >= mino) ! 154: break; ! 155: bread((daddr_t)i, (char *)itab, sizeof(itab)); ! 156: for(j=0; j<INOPB*NI; j++) { ! 157: if(ino >= mino) ! 158: break; ! 159: ino++; ! 160: pass1(&itab[j]); ! 161: } ! 162: } ! 163: ino = 0; ! 164: #ifndef STANDALONE ! 165: sync(); ! 166: #endif ! 167: bread((daddr_t)1, (char *)&sblock, sizeof(sblock)); ! 168: if (sflg) { ! 169: makefree(); ! 170: close(fi); ! 171: #ifndef STANDALONE ! 172: if (bmap) ! 173: free(bmap); ! 174: #endif ! 175: return; ! 176: } ! 177: nfree = 0; ! 178: while(n = alloc()) { ! 179: if (chk(n, "free")) ! 180: break; ! 181: nfree++; ! 182: } ! 183: close(fi); ! 184: #ifndef STANDALONE ! 185: if (bmap) ! 186: free(bmap); ! 187: #endif ! 188: ! 189: i = nrfile + ndfile + ncfile + nbfile; ! 190: #ifndef STANDALONE ! 191: printf("files %6u (r=%u,d=%u,b=%u,c=%u)\n", ! 192: i, nrfile, ndfile, nbfile, ncfile); ! 193: #else ! 194: printf("files %u (r=%u,d=%u,b=%u,c=%u)\n", ! 195: i, nrfile, ndfile, nbfile, ncfile); ! 196: #endif ! 197: n = ndirect + nindir + niindir + niiindir; ! 198: #ifdef STANDALONE ! 199: printf("used %ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n", ! 200: n, nindir, niindir, niiindir, ndirect); ! 201: printf("free %ld\n", nfree); ! 202: #else ! 203: printf("used %7ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n", ! 204: n, nindir, niindir, niiindir, ndirect); ! 205: printf("free %7ld\n", nfree); ! 206: #endif ! 207: if(!dflg) { ! 208: n = 0; ! 209: for(d=(int)sblock.s_isize; d<sblock.s_fsize; d++) ! 210: if(!duped(d)) { ! 211: if(mflg) ! 212: printf("%ld missing\n", d); ! 213: n++; ! 214: } ! 215: printf("missing%5ld\n", n); ! 216: } ! 217: } ! 218: ! 219: pass1(ip) ! 220: register struct dinode *ip; ! 221: { ! 222: daddr_t ind1[NINDIR]; ! 223: daddr_t ind2[NINDIR]; ! 224: daddr_t ind3[NINDIR]; ! 225: register i, j; ! 226: int k, l; ! 227: ! 228: i = ip->di_mode & IFMT; ! 229: if(i == 0) { ! 230: sblock.s_tinode++; ! 231: return; ! 232: } ! 233: if(i == IFCHR) { ! 234: ncfile++; ! 235: return; ! 236: } ! 237: if(i == IFBLK) { ! 238: nbfile++; ! 239: return; ! 240: } ! 241: if(i == IFDIR) ! 242: ndfile++; else ! 243: if(i == IFREG) ! 244: nrfile++; ! 245: else { ! 246: printf("bad mode %u\n", ino); ! 247: return; ! 248: } ! 249: l3tol(iaddr, ip->di_addr, NADDR); ! 250: for(i=0; i<NADDR; i++) { ! 251: if(iaddr[i] == 0) ! 252: continue; ! 253: if(i < NADDR-3) { ! 254: ndirect++; ! 255: chk(iaddr[i], "data (small)"); ! 256: continue; ! 257: } ! 258: nindir++; ! 259: if (chk(iaddr[i], "1st indirect")) ! 260: continue; ! 261: bread(iaddr[i], (char *)ind1, BSIZE); ! 262: for(j=0; j<NINDIR; j++) { ! 263: if(ind1[j] == 0) ! 264: continue; ! 265: if(i == NADDR-3) { ! 266: ndirect++; ! 267: chk(ind1[j], "data (large)"); ! 268: continue; ! 269: } ! 270: niindir++; ! 271: if(chk(ind1[j], "2nd indirect")) ! 272: continue; ! 273: bread(ind1[j], (char *)ind2, BSIZE); ! 274: for(k=0; k<NINDIR; k++) { ! 275: if(ind2[k] == 0) ! 276: continue; ! 277: if(i == NADDR-2) { ! 278: ndirect++; ! 279: chk(ind2[k], "data (huge)"); ! 280: continue; ! 281: } ! 282: niiindir++; ! 283: if(chk(ind2[k], "3rd indirect")) ! 284: continue; ! 285: bread(ind2[k], (char *)ind3, BSIZE); ! 286: for(l=0; l<NINDIR; l++) ! 287: if(ind3[l]) { ! 288: ndirect++; ! 289: chk(ind3[l], "data (garg)"); ! 290: } ! 291: } ! 292: } ! 293: } ! 294: } ! 295: ! 296: chk(bno, s) ! 297: daddr_t bno; ! 298: char *s; ! 299: { ! 300: register n; ! 301: ! 302: if (bno<(int)sblock.s_isize || bno>=sblock.s_fsize) { ! 303: printf("%ld bad; inode=%u, class=%s\n", bno, ino, s); ! 304: return(1); ! 305: } ! 306: if(duped(bno)) { ! 307: printf("%ld dup; inode=%u, class=%s\n", bno, ino, s); ! 308: ndup++; ! 309: } ! 310: for (n=0; blist[n] != -1; n++) ! 311: if (bno == blist[n]) ! 312: printf("%ld arg; inode=%u, class=%s\n", bno, ino, s); ! 313: return(0); ! 314: } ! 315: ! 316: duped(bno) ! 317: daddr_t bno; ! 318: { ! 319: daddr_t d; ! 320: register m, n; ! 321: ! 322: if(dflg) ! 323: return(0); ! 324: d = bno - (int)sblock.s_isize; ! 325: m = 1 << (d%BITS); ! 326: n = (d/BITS); ! 327: if(bmap[n] & m) ! 328: return(1); ! 329: bmap[n] |= m; ! 330: return(0); ! 331: } ! 332: ! 333: daddr_t ! 334: alloc() ! 335: { ! 336: int i; ! 337: daddr_t bno; ! 338: union { ! 339: char data[BSIZE]; ! 340: struct fblk fb; ! 341: } buf; ! 342: ! 343: sblock.s_tfree--; ! 344: if (sblock.s_nfree<=0) ! 345: return(0); ! 346: if (sblock.s_nfree>NICFREE) { ! 347: printf("Bad free list, s.b. count = %d\n", sblock.s_nfree); ! 348: return(0); ! 349: } ! 350: bno = sblock.s_free[--sblock.s_nfree]; ! 351: sblock.s_free[sblock.s_nfree] = (daddr_t)0; ! 352: if(bno == 0) ! 353: return(bno); ! 354: if(sblock.s_nfree <= 0) { ! 355: bread(bno, buf.data, BSIZE); ! 356: sblock.s_nfree = buf.df_nfree; ! 357: if (sblock.s_nfree<0 || sblock.s_nfree>NICFREE) { ! 358: printf("Bad free list, entry count of block %ld = %d\n", ! 359: bno, sblock.s_nfree); ! 360: sblock.s_nfree = 0; ! 361: return(0); ! 362: } ! 363: for(i=0; i<NICFREE; i++) ! 364: sblock.s_free[i] = buf.df_free[i]; ! 365: } ! 366: return(bno); ! 367: } ! 368: ! 369: bfree(bno) ! 370: daddr_t bno; ! 371: { ! 372: union { ! 373: char data[BSIZE]; ! 374: struct fblk fb; ! 375: } buf; ! 376: int i; ! 377: ! 378: sblock.s_tfree++; ! 379: if(sblock.s_nfree >= NICFREE) { ! 380: for(i=0; i<BSIZE; i++) ! 381: buf.data[i] = 0; ! 382: buf.df_nfree = sblock.s_nfree; ! 383: for(i=0; i<NICFREE; i++) ! 384: buf.df_free[i] = sblock.s_free[i]; ! 385: bwrite(bno, buf.data); ! 386: sblock.s_nfree = 0; ! 387: } ! 388: sblock.s_free[sblock.s_nfree] = bno; ! 389: sblock.s_nfree++; ! 390: } ! 391: ! 392: bread(bno, buf, cnt) ! 393: daddr_t bno; ! 394: char *buf; ! 395: { ! 396: register i; ! 397: ! 398: lseek(fi, bno*BSIZE, 0); ! 399: if (read(fi, buf, cnt) != cnt) { ! 400: printf("read error %ld\n", bno); ! 401: if (sflg) { ! 402: printf("No update\n"); ! 403: sflg = 0; ! 404: } ! 405: for(i=0; i<BSIZE; i++) ! 406: buf[i] = 0; ! 407: } ! 408: } ! 409: ! 410: bwrite(bno, buf) ! 411: daddr_t bno; ! 412: char *buf; ! 413: { ! 414: ! 415: lseek(fi, bno*BSIZE, 0); ! 416: if (write(fi, buf, BSIZE) != BSIZE) ! 417: printf("write error %ld\n", bno); ! 418: } ! 419: ! 420: makefree() ! 421: { ! 422: char flg[MAXFN]; ! 423: int adr[MAXFN]; ! 424: register i, j; ! 425: daddr_t f, d; ! 426: int m, n; ! 427: ! 428: n = sblock.s_n; ! 429: if(n <= 0 || n > MAXFN) ! 430: n = MAXFN; ! 431: sblock.s_n = n; ! 432: m = sblock.s_m; ! 433: if(m <= 0 || m > sblock.s_n) ! 434: m = 3; ! 435: sblock.s_m = m; ! 436: ! 437: for(i=0; i<n; i++) ! 438: flg[i] = 0; ! 439: i = 0; ! 440: for(j=0; j<n; j++) { ! 441: while(flg[i]) ! 442: i = (i+1)%n; ! 443: adr[j] = i+1; ! 444: flg[i]++; ! 445: i = (i+m)%n; ! 446: } ! 447: ! 448: sblock.s_nfree = 0; ! 449: sblock.s_ninode = 0; ! 450: sblock.s_flock = 0; ! 451: sblock.s_ilock = 0; ! 452: sblock.s_fmod = 0; ! 453: sblock.s_ronly = 0; ! 454: #ifndef STANDALONE ! 455: time(&sblock.s_time); ! 456: #endif ! 457: sblock.s_tfree = 0; ! 458: sblock.s_tinode = 0; ! 459: ! 460: bfree((daddr_t)0); ! 461: d = sblock.s_fsize-1; ! 462: while(d%sblock.s_n) ! 463: d++; ! 464: for(; d > 0; d -= sblock.s_n) ! 465: for(i=0; i<sblock.s_n; i++) { ! 466: f = d - adr[i]; ! 467: if(f < sblock.s_fsize && f >= (int)sblock.s_isize) ! 468: if(!duped(f)) ! 469: bfree(f); ! 470: } ! 471: bwrite((daddr_t)1, (char *)&sblock); ! 472: #ifndef STANDALONE ! 473: sync(); ! 474: #endif ! 475: return; ! 476: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.