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