Annotation of researchv10no/cmd/findo.c, revision 1.1.1.1

1.1       root        1: #include "sys/param.h"
                      2: #include "sys/ino.h"
                      3: #include "sys/inode.h"
                      4: #include "sys/dir.h"
                      5: #include "sys/filsys.h"
                      6: #include "stdio.h"
                      7: #include "sys/stat.h"
                      8: #include <pwd.h>
                      9: #include <ctype.h>
                     10: 
                     11: #define MONTH  3600*24L*7L*4L
                     12: #define        DAY     (3600*24L)
                     13: #define        WEEK    3600*24L*7L
                     14: #define        DAY3    3600*24L*3L
                     15: #define        NUID    20000
                     16: 
                     17: int    uid = -2;
                     18: int    nflag = 0;
                     19: 
                     20: #define biton(x, n)    x[(n)>>3] |= 1 << ((n)&7)
                     21: #define isdir(p)       (((p)->di_mode & S_IFMT) == S_IFDIR)
                     22: #define isold(p)       (p->di_mtime + WEEK < nowtime)
                     23: #define isvold(p)      (p->di_mtime + MONTH < nowtime)
                     24: #define        isuser(p)       ((p->di_uid>=NUID||isbad[p->di_uid]) && (nflag==0 || p->di_mtime + DAY3 >= nowtime))
                     25: #define isnt(p)                !(p->di_mode & S_IFMT)
                     26: #define istrue(x, n)   x[(n)>>3] & (1<<((n)&7))
                     27: 
                     28: extern int screen(), consider();
                     29: char dlist[8192], olist[8192], slist[8192], tlist[8192];
                     30: int szlist[65536];
                     31: int days[65536];
                     32: char curdir[256];
                     33: long nowtime;
                     34: char   isbad[NUID];
                     35: struct stat origstat;
                     36: 
                     37: main(argc, argv) char **argv;
                     38: {
                     39:        int i;
                     40: 
                     41:        (void) time(&nowtime);
                     42:        isbad[uid] = 1;
                     43:        for (i = 1; i < argc; i++) {
                     44:                if (strcmp(argv[i], "-n")==0) {
                     45:                        nflag++;
                     46:                        continue;
                     47:                }
                     48:                if (i < argc-2 && strcmp(argv[i], "-u")==0) {
                     49:                        isbad[uid] = 0;
                     50:                        uid = atoi(argv[i+1]);
                     51:                        isbad[uid] = 1;
                     52:                        i++;
                     53:                        continue;
                     54:                }
                     55:                if (strcmp(argv[i], "-f")==0) {
                     56:                        getbad();
                     57:                        continue;
                     58:                }
                     59:                break;
                     60:        }
                     61:        if (i>argc-2) {
                     62:                fprintf(stderr, "findo /dev/device /place-it-is-mounted\n");
                     63:                exit(1);
                     64:        }
                     65:        finit();
                     66:        eachinode(argv[i], screen);
                     67:        if (chdir(argv[++i])) {
                     68:                perror(argv[i]);
                     69:                exit(1);
                     70:        }
                     71:        strcpy(curdir, argv[i]);
                     72:        stat(curdir, &origstat);        /* where we started */
                     73:        alldir(0, consider);
                     74:        exit(0);
                     75: }
                     76: 
                     77: finit()
                     78: {      int i;
                     79:        for (i = 0; i < sizeof(olist); i++)
                     80:                olist[i] = 0;
                     81:        for (i = 0; i < sizeof(dlist); i++)
                     82:                dlist[i] = 0;
                     83:        for (i = 0; i < sizeof(slist); i++)
                     84:                slist[i] = 0;
                     85:        for (i = 0; i<sizeof(tlist); i++)
                     86:                tlist[i] = 0;
                     87:        for (i = 0; i < sizeof(szlist)/sizeof(szlist[0]); i++)
                     88:                szlist[i] = days[i] = 0;
                     89: }
                     90: 
                     91: screen(n, p) struct dinode *p; unsigned int n;
                     92: {
                     93:        if(isnt(p)) return;
                     94:        szlist[n] = p->di_size;
                     95:        days[n] = (nowtime - p->di_mtime) / DAY;
                     96:        if(isdir(p)) {
                     97:                biton(dlist, n);
                     98:        }
                     99:        if(isuser(p)) {
                    100:                biton(slist, n);
                    101:                return;
                    102:        }
                    103:        if(isitroff(p)) {
                    104:                biton(tlist, n);
                    105:                return;
                    106:        }
                    107:        if(isold(p)) {
                    108:                biton(olist, n);
                    109:                if (isvold(p))
                    110:                        biton(tlist, n);
                    111:                return;
                    112:        }
                    113: }
                    114: 
                    115: newsys()
                    116: {
                    117:        struct stat dot;
                    118: 
                    119:        stat(".", &dot);
                    120:        return dot.st_dev != origstat.st_dev;
                    121: }
                    122: 
                    123: consider(n, p) struct direct *p;
                    124: {      int j;
                    125:        char buf[DIRSIZ+1];
                    126:        if(istrue(dlist, p->d_ino)) {
                    127:                for(j = 0; j < DIRSIZ; j++)
                    128:                        buf[j] = p->d_name[j];
                    129:                buf[j] = 0;
                    130:                j = strlen(curdir);
                    131:                if(strcmp(".", buf) == 0 || strcmp("..", buf) == 0)
                    132:                        return; /* of course this can't happen (ha) */
                    133:                strcat(curdir, "/");
                    134:                strcat(curdir, buf);
                    135:                if(chdir(buf) == -1)
                    136:                        perror(curdir);
                    137:                else {
                    138:                        if(!newsys())
                    139:                                alldir(n+1, consider);
                    140:                        if (chdir("..") < 0) {
                    141:                                fprintf(stderr, "bad '..' in %s\n", curdir);
                    142:                                curdir[j] = '\0';
                    143:                                chdir(curdir);
                    144:                        }
                    145:                }
                    146:                curdir[j] = 0;
                    147:        }
                    148:        if (istrue(slist, p->d_ino)) {
                    149:                printf("user\t%8d %8d\t", szlist[p->d_ino], days[p->d_ino]);
                    150:                file(p->d_name);
                    151:        }
                    152:        if (istrue(olist, p->d_ino)) {
                    153:                if(badname(p->d_name, istrue(tlist, p->d_ino))) {
                    154:                        printf("old\t%8d %8d\t", szlist[p->d_ino], days[p->d_ino]);
                    155:                        file(p->d_name);
                    156:                }
                    157:                return;
                    158:        }
                    159:        if (istrue(tlist, p->d_ino)) {
                    160:                printf("troff\t%8d %8d\t", szlist[p->d_ino], days[p->d_ino]);
                    161:                file(p->d_name);
                    162:        }
                    163: }
                    164: 
                    165: badname(s, voflg)
                    166: register char *s;
                    167: {
                    168:        register char *p;
                    169:        register int k;
                    170: 
                    171:        if(strncmp("core", s, DIRSIZ) == 0)
                    172:                return(1);
                    173:        if(strncmp("a.out", s, DIRSIZ) == 0)
                    174:                return(1);
                    175:        if(strncmp("junk", s, DIRSIZ) == 0)
                    176:                return(1);
                    177:        if(strncmp("ed.hup", s, DIRSIZ) == 0)
                    178:                return(1);
                    179:        if(strncmp("jim.recover", s, DIRSIZ) == 0)
                    180:                return(1);
                    181:        if(strncmp("sam.save", s, DIRSIZ) == 0)
                    182:                return(1);
                    183:        if(strncmp("sam.err", s, DIRSIZ) == 0)
                    184:                return(1);
                    185:        if(strncmp("~~sam~~", s, DIRSIZ) == 0)
                    186:                return(1);
                    187:        if(strncmp(".pilog", s, DIRSIZ) == 0)
                    188:                return(1);
                    189:        if(strncmp("mon.out", s, DIRSIZ) == 0)
                    190:                return(1);
                    191:        if(strncmp("qed.hup:", s, 8) == 0)
                    192:                return(1);
                    193:        if(strncmp("x", s, DIRSIZ) == 0)
                    194:                return(1);
                    195:        if(strncmp("dead.letter", s, DIRSIZ) == 0)
                    196:                return(1);
                    197:        if (strend(".dvi", s))
                    198:                return(1);
                    199:        if (strncmp("junk", s, 4)==0 || strncmp("temp", s, 4)==0)
                    200:                return 1;
                    201:        if (strlen(s) == 1 && islower(s[0]))
                    202:                return 1;
                    203:        if (strncmp("foo", s, 3)==0 ||
                    204:           (strncmp("rst", s, 3)==0 && strlen(s)>5)) {
                    205:                p = s+3;
                    206:                while (p < s+DIRSIZ) {
                    207:                        if (*p == 0)
                    208:                                return(1);
                    209:                        if (!isdigit(*p))
                    210:                                break;
                    211:                        p++;
                    212:                }
                    213:        }
                    214:        if (strncmp(".jx", s, 3) == 0)
                    215:                return(1);
                    216:        if (s[5]=='.' && isdigit(s[3]) && isdigit(s[4]) && isdigit(s[7])
                    217:         && isdigit(s[8]) && s[6]=='a')
                    218:                return(1);
                    219:        if (voflg==0)
                    220:                return(0);
                    221:        p = s+DIRSIZ;
                    222:        if (strend(".o", s))
                    223:                return(1);
                    224:        return(0);
                    225: }
                    226: 
                    227: strend(e, s)   /* is e the end of s? */
                    228:        register char *e, *s;
                    229: {
                    230:        register char *t=s;
                    231:        while(*t)
                    232:                t++;
                    233:        t-=strlen(e);
                    234:        return(strcmp(e, t)==0);
                    235: }
                    236: 
                    237: file(s) char *s;
                    238: {      int i;
                    239:        char buf[DIRSIZ+1];
                    240:        for(i = 0; i < DIRSIZ; i++)
                    241:                buf[i] = *s++;
                    242:        buf[i] = 0;
                    243:        printf("%s/%s\n", curdir, buf);
                    244: }
                    245: 
                    246: isitroff(ip)
                    247: register struct dinode *ip;
                    248: {
                    249:        long dska[13];
                    250:        char tbuf[BSIZE(0)];
                    251:        if ((ip->di_mode&IFMT) != IFREG)
                    252:                return(0);
                    253:        if (ip->di_mode&IEXEC)
                    254:                return(0);
                    255: /*     if (ip->di_size < 512)
                    256: /*             return(0);
                    257: */
                    258:        if (ip->di_mtime + DAY > nowtime)
                    259:                return(0);
                    260: /*     if (ip->di_mtime +(200*DAY) < nowtime)
                    261: /*             return(0);
                    262: */
                    263:        l3tol(dska, ip->di_addr, 13);
                    264:        bread(dska[0], tbuf, BSIZE(0));
                    265:        if (troffint(tbuf))
                    266:                return(1);
                    267:        return(0);
                    268: }
                    269: 
                    270: char *troff[] = {      /* troff intermediate lang */
                    271:        "x T ", "x res ", "x init", "V0", "x font ", 0 };
                    272: int ntroff[] = {
                    273:        4,       6,        6,        2,    7 };
                    274: 
                    275: troffint(bp)
                    276: register char *bp;
                    277: {
                    278:        register char **tp;
                    279:        register i, j, k = 0, oi, n;
                    280: 
                    281:        for (i = oi = n = 0; i < BSIZE(0) && k < 15; i++) {
                    282:                if (bp[i] == '\n') {
                    283:                        k++;
                    284:                        bp[i] = '\0';
                    285:                        for (j = 0; troff[j]; j++)
                    286:                                if (strncmp(bp+oi, troff[j], ntroff[j]) == 0)
                    287:                                        n++;
                    288:                        oi = i+1;
                    289:                }
                    290:        }
                    291:        return n > 5;
                    292: }
                    293: 
                    294: word(p1, p2)
                    295: register char *p1, *p2;
                    296: {
                    297:        while (*p1++ == *p2++)
                    298:                ;
                    299:        if (*--p1 != '\0')
                    300:                return(0);
                    301:        if (*--p2 !=' ' && *p2!='\n')
                    302:                return(0);
                    303:        return(1);
                    304: }
                    305: 
                    306: #define        ITABSZ  BUFSIZE/sizeof(long)
                    307: #define        ISIZ    (BUFSIZE/sizeof(struct dinode))
                    308: static struct  filsys  sblock;
                    309: static struct  dinode  itab[ITABSZ];
                    310: static fi;
                    311: struct stat stb;
                    312: int dev;
                    313: 
                    314: 
                    315: eachinode(file, func)
                    316: char *file;
                    317: int (*func)();
                    318: {      unsigned ino;
                    319:        int nfiles = 0;
                    320:        register unsigned i, j;
                    321: 
                    322:        fi = open(file, 0);
                    323:        if(fi < 0 || fstat(fi, &stb) != 0) {
                    324:                fprintf(stderr, "cannot open %s\n", file);
                    325:                return;
                    326:        }
                    327:        dev = stb.st_rdev;
                    328:        bread((long)1, (char *)&sblock, sizeof sblock);
                    329:        nfiles = (sblock.s_isize-2)*(BSIZE(dev)/sizeof(struct dinode));
                    330:        ino = 1;
                    331:        for(i=2+((ino-1)/INOPB(dev)); ino<nfiles; i ++) {
                    332:                bread((long)i, (char *)itab, BSIZE(dev));
                    333:                for (j=0; j<INOPB(dev) && ino<nfiles; j++) {
                    334:                        (*func)(ino, &itab[j]);
                    335:                        ino++;
                    336:                }
                    337:        }
                    338: }
                    339: 
                    340: bread(bno, buf, cnt)
                    341: long bno;
                    342: char *buf;
                    343: {      int i;
                    344: 
                    345:        lseek(fi, bno*BSIZE(dev), 0);
                    346:        if (read(fi, buf, cnt) != cnt) {
                    347:                printf("read error %u\n", bno);
                    348:                for(i=0; i<cnt;i++)
                    349:                        buf[i] = 0;
                    350:        }
                    351: }
                    352: 
                    353: alldir(n, f) int (*f)();
                    354: {      struct direct p;
                    355:        FILE *fd;
                    356:        fd = fopen(".", "r");
                    357:        if(fd == NULL) {
                    358:                perror(".");
                    359:                return(0);
                    360:        }
                    361:        (void) fseek(fd, (long)2 * sizeof(p), 0);       /* skip . and .. */
                    362:        for(;;) {
                    363:                (void) fread((char *)&p, 1, sizeof(p), fd);
                    364:                if(feof(fd)) break;
                    365:                if(p.d_name[0] != 0 && p.d_ino != 0)
                    366:                        (*f)(n, &p);
                    367:        }
                    368:        (void) fclose(fd);
                    369:        return(1);
                    370: }
                    371: 
                    372: getbad()
                    373: {
                    374:        register struct passwd *p;
                    375:        extern struct passwd *getpwent();
                    376:        register i;
                    377: 
                    378:        for (i=0; i<NUID; i++)
                    379:                isbad[i] = 1;
                    380:        while (p = getpwent()) {
                    381:                if (p->pw_uid>=0 && p->pw_uid<NUID)
                    382:                        isbad[p->pw_uid] = 0;
                    383:        }
                    384: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.