1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: char copyright[] =
   9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
  10:  All rights reserved.\n";
  11: #endif not lint
  12: 
  13: #ifndef lint
  14: static char sccsid[] = "@(#)ncheck.c	5.4 (Berkeley) 1/9/86";
  15: #endif not lint
  16: 
  17: /*
  18:  * ncheck -- obtain file names from reading filesystem
  19:  */
  20: 
  21: #define NB      500
  22: #define MAXNINDIR   (MAXBSIZE / sizeof (daddr_t))
  23: 
  24: #include <sys/param.h>
  25: #include <sys/inode.h>
  26: #include <sys/fs.h>
  27: #include <sys/dir.h>
  28: #include <stdio.h>
  29: 
  30: struct  fs  sblock;
  31: struct  dinode  itab[MAXIPG];
  32: struct  dinode  *gip;
  33: struct ilist {
  34:     ino_t   ino;
  35:     u_short mode;
  36:     short   uid;
  37:     short   gid;
  38: } ilist[NB];
  39: struct  htab
  40: {
  41:     ino_t   h_ino;
  42:     ino_t   h_pino;
  43:     char    *h_name;
  44: } *htab;
  45: char *strngtab;
  46: long hsize;
  47: int strngloc;
  48: 
  49: struct dirstuff {
  50:     int loc;
  51:     struct dinode *ip;
  52:     char dbuf[MAXBSIZE];
  53: };
  54: 
  55: int aflg;
  56: int sflg;
  57: int iflg; /* number of inodes being searched for */
  58: int mflg;
  59: int fi;
  60: ino_t   ino;
  61: int nhent;
  62: int nxfile;
  63: 
  64: int nerror;
  65: daddr_t bmap();
  66: long    atol();
  67: struct htab *lookup();
  68: 
  69: main(argc, argv)
  70:     int argc;
  71:     char *argv[];
  72: {
  73:     register i;
  74:     long n;
  75: 
  76:     while (--argc) {
  77:         argv++;
  78:         if (**argv=='-')
  79:         switch ((*argv)[1]) {
  80: 
  81:         case 'a':
  82:             aflg++;
  83:             continue;
  84: 
  85:         case 'i':
  86:             for(iflg=0; iflg<NB; iflg++) {
  87:                 n = atol(argv[1]);
  88:                 if(n == 0)
  89:                     break;
  90:                 ilist[iflg].ino = n;
  91:                 nxfile = iflg;
  92:                 argv++;
  93:                 argc--;
  94:             }
  95:             continue;
  96: 
  97:         case 'm':
  98:             mflg++;
  99:             continue;
 100: 
 101:         case 's':
 102:             sflg++;
 103:             continue;
 104: 
 105:         default:
 106:             fprintf(stderr, "ncheck: bad flag %c\n", (*argv)[1]);
 107:             nerror++;
 108:         }
 109:         check(*argv);
 110:     }
 111:     return(nerror);
 112: }
 113: 
 114: check(file)
 115:     char *file;
 116: {
 117:     register int i, j, c;
 118:     int nfiles;
 119: 
 120:     fi = open(file, 0);
 121:     if(fi < 0) {
 122:         fprintf(stderr, "ncheck: cannot open %s\n", file);
 123:         nerror++;
 124:         return;
 125:     }
 126:     nhent = 0;
 127:     printf("%s:\n", file);
 128:     sync();
 129:     bread(SBLOCK, (char *)&sblock, SBSIZE);
 130:     if (sblock.fs_magic != FS_MAGIC) {
 131:         printf("%s: not a file system\n", file);
 132:         nerror++;
 133:         return;
 134:     }
 135:     hsize = sblock.fs_ipg * sblock.fs_ncg - sblock.fs_cstotal.cs_nifree + 1;
 136:     htab = (struct htab *)malloc(hsize * sizeof(struct htab));
 137:     strngtab = (char *)malloc(30 * hsize);
 138:     if (htab == 0 || strngtab == 0) {
 139:         printf("not enough memory to allocate tables\n");
 140:         nerror++;
 141:         return;
 142:     }
 143:     ino = 0;
 144:     for (c = 0; c < sblock.fs_ncg; c++) {
 145:         bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
 146:             sblock.fs_ipg * sizeof (struct dinode));
 147:         for(j = 0; j < sblock.fs_ipg; j++) {
 148:             if (itab[j].di_mode != 0)
 149:                 pass1(&itab[j]);
 150:             ino++;
 151:         }
 152:     }
 153:     ilist[nxfile+1].ino = 0;
 154:     ino = 0;
 155:     for (c = 0; c < sblock.fs_ncg; c++) {
 156:         bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
 157:             sblock.fs_ipg * sizeof (struct dinode));
 158:         for(j = 0; j < sblock.fs_ipg; j++) {
 159:             if (itab[j].di_mode != 0)
 160:                 pass2(&itab[j]);
 161:             ino++;
 162:         }
 163:     }
 164:     ino = 0;
 165:     for (c = 0; c < sblock.fs_ncg; c++) {
 166:         bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
 167:             sblock.fs_ipg * sizeof (struct dinode));
 168:         for(j = 0; j < sblock.fs_ipg; j++) {
 169:             if (itab[j].di_mode != 0)
 170:                 pass3(&itab[j]);
 171:             ino++;
 172:         }
 173:     }
 174:     close(fi);
 175:     for (i = 0; i < hsize; i++)
 176:         htab[i].h_ino = 0;
 177:     for (i = iflg; i < NB; i++)
 178:         ilist[i].ino = 0;
 179:     nxfile = iflg;
 180: }
 181: 
 182: pass1(ip)
 183:     register struct dinode *ip;
 184: {
 185:     int i;
 186: 
 187:     if (mflg)
 188:         for (i = 0; i < iflg; i++)
 189:             if (ino == ilist[i].ino) {
 190:                 ilist[i].mode = ip->di_mode;
 191:                 ilist[i].uid = ip->di_uid;
 192:                 ilist[i].gid = ip->di_gid;
 193:             }
 194:     if ((ip->di_mode & IFMT) != IFDIR) {
 195:         if (sflg==0 || nxfile>=NB)
 196:             return;
 197:         if ((ip->di_mode&IFMT)==IFBLK || (ip->di_mode&IFMT)==IFCHR
 198:           || ip->di_mode&(ISUID|ISGID)) {
 199:             ilist[nxfile].ino = ino;
 200:             ilist[nxfile].mode = ip->di_mode;
 201:             ilist[nxfile].uid = ip->di_uid;
 202:             ilist[nxfile++].gid = ip->di_gid;
 203:             return;
 204:         }
 205:     }
 206:     lookup(ino, 1);
 207: }
 208: 
 209: pass2(ip)
 210:     register struct dinode *ip;
 211: {
 212:     register struct direct *dp;
 213:     struct dirstuff dirp;
 214:     struct htab *hp;
 215: 
 216:     if((ip->di_mode&IFMT) != IFDIR)
 217:         return;
 218:     dirp.loc = 0;
 219:     dirp.ip = ip;
 220:     gip = ip;
 221:     for (dp = readdir(&dirp); dp != NULL; dp = readdir(&dirp)) {
 222:         if(dp->d_ino == 0)
 223:             continue;
 224:         hp = lookup(dp->d_ino, 0);
 225:         if(hp == 0)
 226:             continue;
 227:         if(dotname(dp))
 228:             continue;
 229:         hp->h_pino = ino;
 230:         hp->h_name = &strngtab[strngloc];
 231:         strngloc += strlen(dp->d_name) + 1;
 232:         strcpy(hp->h_name, dp->d_name);
 233:     }
 234: }
 235: 
 236: pass3(ip)
 237:     register struct dinode *ip;
 238: {
 239:     register struct direct *dp;
 240:     struct dirstuff dirp;
 241:     int k;
 242: 
 243:     if((ip->di_mode&IFMT) != IFDIR)
 244:         return;
 245:     dirp.loc = 0;
 246:     dirp.ip = ip;
 247:     gip = ip;
 248:     for(dp = readdir(&dirp); dp != NULL; dp = readdir(&dirp)) {
 249:         if(aflg==0 && dotname(dp))
 250:             continue;
 251:         if(sflg == 0 && iflg == 0)
 252:             goto pr;
 253:         for(k = 0; ilist[k].ino != 0; k++)
 254:             if(ilist[k].ino == dp->d_ino)
 255:                 break;
 256:         if (ilist[k].ino == 0)
 257:             continue;
 258:         if (mflg)
 259:             printf("mode %-6o uid %-5d gid %-5d ino ",
 260:                 ilist[k].mode, ilist[k].uid, ilist[k].gid);
 261:     pr:
 262:         printf("%-5u\t", dp->d_ino);
 263:         pname(ino, 0);
 264:         printf("/%s", dp->d_name);
 265:         if (lookup(dp->d_ino, 0))
 266:             printf("/.");
 267:         printf("\n");
 268:     }
 269: }
 270: 
 271: /*
 272:  * get next entry in a directory.
 273:  */
 274: struct direct *
 275: readdir(dirp)
 276:     register struct dirstuff *dirp;
 277: {
 278:     register struct direct *dp;
 279:     daddr_t lbn, d;
 280: 
 281:     for(;;) {
 282:         if (dirp->loc >= dirp->ip->di_size)
 283:             return NULL;
 284:         if (blkoff(&sblock, dirp->loc) == 0) {
 285:             lbn = lblkno(&sblock, dirp->loc);
 286:             d = bmap(lbn);
 287:             if(d == 0)
 288:                 return NULL;
 289:             bread(fsbtodb(&sblock, d), dirp->dbuf,
 290:                 dblksize(&sblock, dirp->ip, lbn));
 291:         }
 292:         dp = (struct direct *)
 293:             (dirp->dbuf + blkoff(&sblock, dirp->loc));
 294:         dirp->loc += dp->d_reclen;
 295:         if (dp->d_ino == 0)
 296:             continue;
 297:         return (dp);
 298:     }
 299: }
 300: 
 301: dotname(dp)
 302:     register struct direct *dp;
 303: {
 304: 
 305:     if (dp->d_name[0]=='.')
 306:         if (dp->d_name[1]==0 ||
 307:            (dp->d_name[1]=='.' && dp->d_name[2]==0))
 308:             return(1);
 309:     return(0);
 310: }
 311: 
 312: pname(i, lev)
 313:     ino_t i;
 314:     int lev;
 315: {
 316:     register struct htab *hp;
 317: 
 318:     if (i==ROOTINO)
 319:         return;
 320:     if ((hp = lookup(i, 0)) == 0) {
 321:         printf("???");
 322:         return;
 323:     }
 324:     if (lev > 10) {
 325:         printf("...");
 326:         return;
 327:     }
 328:     pname(hp->h_pino, ++lev);
 329:     printf("/%s", hp->h_name);
 330: }
 331: 
 332: struct htab *
 333: lookup(i, ef)
 334:     ino_t i;
 335:     int ef;
 336: {
 337:     register struct htab *hp;
 338: 
 339:     for (hp = &htab[i%hsize]; hp->h_ino;) {
 340:         if (hp->h_ino==i)
 341:             return(hp);
 342:         if (++hp >= &htab[hsize])
 343:             hp = htab;
 344:     }
 345:     if (ef==0)
 346:         return(0);
 347:     if (++nhent >= hsize) {
 348:         fprintf(stderr, "ncheck: hsize of %d is too small\n", hsize);
 349:         exit(1);
 350:     }
 351:     hp->h_ino = i;
 352:     return(hp);
 353: }
 354: 
 355: bread(bno, buf, cnt)
 356:     daddr_t bno;
 357:     char *buf;
 358:     int cnt;
 359: {
 360:     register i;
 361: 
 362:     lseek(fi, bno * DEV_BSIZE, 0);
 363:     if (read(fi, buf, cnt) != cnt) {
 364:         fprintf(stderr, "ncheck: read error %d\n", bno);
 365:         for(i=0; i < cnt; i++)
 366:             buf[i] = 0;
 367:     }
 368: }
 369: 
 370: daddr_t
 371: bmap(i)
 372:     int i;
 373: {
 374:     daddr_t ibuf[MAXNINDIR];
 375: 
 376:     if(i < NDADDR)
 377:         return(gip->di_db[i]);
 378:     i -= NDADDR;
 379:     if(i > NINDIR(&sblock)) {
 380:         fprintf(stderr, "ncheck: %u - huge directory\n", ino);
 381:         return((daddr_t)0);
 382:     }
 383:     bread(fsbtodb(&sblock, gip->di_ib[i]), (char *)ibuf, sizeof(ibuf));
 384:     return(ibuf[i]);
 385: }

Defined functions

bmap defined in line 370; used 2 times
bread defined in line 355; used 6 times
check defined in line 114; used 1 times
dotname defined in line 301; used 2 times
lookup defined in line 332; used 5 times
main defined in line 69; never used
pass1 defined in line 182; used 1 times
pass2 defined in line 209; used 1 times
pass3 defined in line 236; used 1 times
pname defined in line 312; used 2 times
readdir defined in line 274; used 4 times

Defined variables

aflg defined in line 55; used 2 times
copyright defined in line 8; never used
fi defined in line 59; used 5 times
gip defined in line 32; used 4 times
hsize defined in line 46; used 8 times
htab defined in line 44; used 6 times
iflg defined in line 57; used 9 times
ilist defined in line 38; used 17 times
itab defined in line 31; used 9 times
mflg defined in line 58; used 3 times
nerror defined in line 64; used 5 times
nhent defined in line 61; used 2 times
nxfile defined in line 62; used 8 times
sblock defined in line 30; used 27 times
sccsid defined in line 14; never used
sflg defined in line 56; used 3 times
strngloc defined in line 47; used 2 times
strngtab defined in line 45; used 3 times

Defined struct's

dirstuff defined in line 49; used 6 times
htab defined in line 39; used 14 times
ilist defined in line 33; never used

Defined macros

MAXNINDIR defined in line 22; used 1 times
NB defined in line 21; used 4 times
Last modified: 1986-01-11
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1918
Valid CSS Valid XHTML 1.0 Strict