|
|
1.1 ! root 1: /* ! 2: * ncheck -- obtain file names from reading filesystem ! 3: */ ! 4: ! 5: #define NI 16 ! 6: #define NB 100 ! 7: #define HSIZE 2503 ! 8: #define NDIR (BSIZE/sizeof(struct direct)) ! 9: ! 10: #include <stdio.h> ! 11: #include <sys/param.h> ! 12: #include <sys/inode.h> ! 13: #include <sys/ino.h> ! 14: #include <sys/dir.h> ! 15: #include <sys/filsys.h> ! 16: #include <sys/fblk.h> ! 17: ! 18: struct filsys sblock; ! 19: struct dinode itab[INOPB*NI]; ! 20: daddr_t iaddr[NADDR]; ! 21: ino_t ilist[NB]; ! 22: struct htab ! 23: { ! 24: ino_t h_ino; ! 25: ino_t h_pino; ! 26: char h_name[DIRSIZ]; ! 27: } htab[HSIZE]; ! 28: ! 29: int aflg; ! 30: int sflg; ! 31: int fi; ! 32: ino_t ino; ! 33: int nhent; ! 34: int nxfile; ! 35: ! 36: int nerror; ! 37: daddr_t bmap(); ! 38: long atol(); ! 39: struct htab *lookup(); ! 40: ! 41: main(argc, argv) ! 42: char *argv[]; ! 43: { ! 44: register i; ! 45: long n; ! 46: ! 47: while (--argc) { ! 48: argv++; ! 49: if (**argv=='-') ! 50: switch ((*argv)[1]) { ! 51: ! 52: case 'a': ! 53: aflg++; ! 54: continue; ! 55: ! 56: case 'i': ! 57: for(i=0; i<NB; i++) { ! 58: n = atol(argv[1]); ! 59: if(n == 0) ! 60: break; ! 61: ilist[i] = n; ! 62: nxfile = i; ! 63: argv++; ! 64: argc--; ! 65: } ! 66: continue; ! 67: ! 68: case 's': ! 69: sflg++; ! 70: continue; ! 71: ! 72: default: ! 73: fprintf(stderr, "ncheck: bad flag %c\n", (*argv)[1]); ! 74: nerror++; ! 75: } ! 76: check(*argv); ! 77: } ! 78: return(nerror); ! 79: } ! 80: ! 81: check(file) ! 82: char *file; ! 83: { ! 84: register i, j; ! 85: ino_t mino; ! 86: ! 87: fi = open(file, 0); ! 88: if(fi < 0) { ! 89: fprintf(stderr, "ncheck: cannot open %s\n", file); ! 90: nerror++; ! 91: return; ! 92: } ! 93: nhent = 0; ! 94: printf("%s:\n", file); ! 95: sync(); ! 96: bread((daddr_t)1, (char *)&sblock, sizeof(sblock)); ! 97: mino = (sblock.s_isize-2) * INOPB; ! 98: ino = 0; ! 99: for(i=2;; i+=NI) { ! 100: if(ino >= mino) ! 101: break; ! 102: bread((daddr_t)i, (char *)itab, sizeof(itab)); ! 103: for(j=0; j<INOPB*NI; j++) { ! 104: if(ino >= mino) ! 105: break; ! 106: ino++; ! 107: pass1(&itab[j]); ! 108: } ! 109: } ! 110: ilist[nxfile+1] = 0; ! 111: ino = 0; ! 112: for(i=2;; i+=NI) { ! 113: if(ino >= mino) ! 114: break; ! 115: bread((daddr_t)i, (char *)itab, sizeof(itab)); ! 116: for(j=0; j<INOPB*NI; j++) { ! 117: if(ino >= mino) ! 118: break; ! 119: ino++; ! 120: pass2(&itab[j]); ! 121: } ! 122: } ! 123: ino = 0; ! 124: for(i=2;; i+=NI) { ! 125: if(ino >= mino) ! 126: break; ! 127: bread((daddr_t)i, (char *)itab, sizeof(itab)); ! 128: for(j=0; j<INOPB*NI; j++) { ! 129: if(ino >= mino) ! 130: break; ! 131: ino++; ! 132: pass3(&itab[j]); ! 133: } ! 134: } ! 135: } ! 136: ! 137: pass1(ip) ! 138: register struct dinode *ip; ! 139: { ! 140: if((ip->di_mode & IFMT) != IFDIR) { ! 141: if (sflg==0 || nxfile>=NB) ! 142: return; ! 143: if ((ip->di_mode&IFMT)==IFBLK || (ip->di_mode&IFMT)==IFCHR ! 144: || ip->di_mode&(ISUID|ISGID)) ! 145: ilist[nxfile++] = ino; ! 146: return; ! 147: } ! 148: lookup(ino, 1); ! 149: } ! 150: ! 151: pass2(ip) ! 152: register struct dinode *ip; ! 153: { ! 154: struct direct dbuf[NDIR]; ! 155: long doff; ! 156: struct direct *dp; ! 157: register i, j; ! 158: int k; ! 159: struct htab *hp; ! 160: daddr_t d; ! 161: ino_t kno; ! 162: ! 163: if((ip->di_mode&IFMT) != IFDIR) ! 164: return; ! 165: l3tol(iaddr, ip->di_addr, NADDR); ! 166: doff = 0; ! 167: for(i=0;; i++) { ! 168: if(doff >= ip->di_size) ! 169: break; ! 170: d = bmap(i); ! 171: if(d == 0) ! 172: break; ! 173: bread(d, (char *)dbuf, sizeof(dbuf)); ! 174: for(j=0; j<NDIR; j++) { ! 175: if(doff >= ip->di_size) ! 176: break; ! 177: doff += sizeof(struct direct); ! 178: dp = dbuf+j; ! 179: kno = dp->d_ino; ! 180: if(kno == 0) ! 181: continue; ! 182: hp = lookup(kno, 0); ! 183: if(hp == 0) ! 184: continue; ! 185: if(dotname(dp)) ! 186: continue; ! 187: hp->h_pino = ino; ! 188: for(k=0; k<DIRSIZ; k++) ! 189: hp->h_name[k] = dp->d_name[k]; ! 190: } ! 191: } ! 192: } ! 193: ! 194: pass3(ip) ! 195: register struct dinode *ip; ! 196: { ! 197: struct direct dbuf[NDIR]; ! 198: long doff; ! 199: struct direct *dp; ! 200: register i, j; ! 201: int k; ! 202: daddr_t d; ! 203: ino_t kno; ! 204: ! 205: if((ip->di_mode&IFMT) != IFDIR) ! 206: return; ! 207: l3tol(iaddr, ip->di_addr, NADDR); ! 208: doff = 0; ! 209: for(i=0;; i++) { ! 210: if(doff >= ip->di_size) ! 211: break; ! 212: d = bmap(i); ! 213: if(d == 0) ! 214: break; ! 215: bread(d, (char *)dbuf, sizeof(dbuf)); ! 216: for(j=0; j<NDIR; j++) { ! 217: if(doff >= ip->di_size) ! 218: break; ! 219: doff += sizeof(struct direct); ! 220: dp = dbuf+j; ! 221: kno = dp->d_ino; ! 222: if(kno == 0) ! 223: continue; ! 224: if(aflg==0 && dotname(dp)) ! 225: continue; ! 226: if(ilist[0] == 0) ! 227: goto pr; ! 228: for(k=0; ilist[k] != 0; k++) ! 229: if(ilist[k] == kno) ! 230: goto pr; ! 231: continue; ! 232: pr: ! 233: printf("%u ", kno); ! 234: pname(ino, 0); ! 235: printf("/%.14s", dp->d_name); ! 236: if (lookup(kno, 0)) ! 237: printf("/."); ! 238: printf("\n"); ! 239: } ! 240: } ! 241: } ! 242: ! 243: dotname(dp) ! 244: register struct direct *dp; ! 245: { ! 246: ! 247: if (dp->d_name[0]=='.') ! 248: if (dp->d_name[1]==0 || (dp->d_name[1]=='.' && dp->d_name[2]==0)) ! 249: return(1); ! 250: return(0); ! 251: } ! 252: ! 253: pname(i, lev) ! 254: ino_t i; ! 255: { ! 256: register struct htab *hp; ! 257: ! 258: if (i==ROOTINO) ! 259: return; ! 260: if ((hp = lookup(i, 0)) == 0) { ! 261: printf("???"); ! 262: return; ! 263: } ! 264: if (lev > 10) { ! 265: printf("..."); ! 266: return; ! 267: } ! 268: pname(hp->h_pino, ++lev); ! 269: printf("/%.14s", hp->h_name); ! 270: } ! 271: ! 272: struct htab * ! 273: lookup(i, ef) ! 274: ino_t i; ! 275: { ! 276: register struct htab *hp; ! 277: ! 278: for (hp = &htab[i%HSIZE]; hp->h_ino;) { ! 279: if (hp->h_ino==i) ! 280: return(hp); ! 281: if (++hp >= &htab[HSIZE]) ! 282: hp = htab; ! 283: } ! 284: if (ef==0) ! 285: return(0); ! 286: if (++nhent >= HSIZE) { ! 287: fprintf(stderr, "ncheck: out of core-- increase HSIZE\n"); ! 288: exit(1); ! 289: } ! 290: hp->h_ino = i; ! 291: return(hp); ! 292: } ! 293: ! 294: bread(bno, buf, cnt) ! 295: daddr_t bno; ! 296: char *buf; ! 297: { ! 298: register i; ! 299: ! 300: lseek(fi, bno*BSIZE, 0); ! 301: if (read(fi, buf, cnt) != cnt) { ! 302: fprintf(stderr, "ncheck: read error %d\n", bno); ! 303: for(i=0; i<BSIZE; i++) ! 304: buf[i] = 0; ! 305: } ! 306: } ! 307: ! 308: daddr_t ! 309: bmap(i) ! 310: { ! 311: daddr_t ibuf[NINDIR]; ! 312: ! 313: if(i < NADDR-3) ! 314: return(iaddr[i]); ! 315: i -= NADDR-3; ! 316: if(i > NINDIR) { ! 317: fprintf(stderr, "ncheck: %u - huge directory\n", ino); ! 318: return((daddr_t)0); ! 319: } ! 320: bread(iaddr[NADDR-3], (char *)ibuf, sizeof(ibuf)); ! 321: return(ibuf[i]); ! 322: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.