Annotation of 41BSD/cmd/whereis.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)whereis.c   4.1 (Berkeley) 10/1/80";
        !             2: #include <sys/types.h>
        !             3: #include <stdio.h>
        !             4: #include <ctype.h>
        !             5: #include <sys/dir.h>
        !             6: #include <whoami.h>
        !             7: 
        !             8: static char *bindirs[] = {
        !             9:        "/etc",
        !            10:        "/bin",
        !            11:        "/usr/bin",
        !            12:        "/usr/games",
        !            13: #ifdef CSVAX
        !            14:        "/lib",
        !            15:        "/usr/ucb",
        !            16:        "/usr/lib",
        !            17:        "/usr/local",
        !            18:        "/usr/new",
        !            19:        "/usr/old",
        !            20: #endif
        !            21: #ifdef CORY
        !            22:        "/usr/bin/eecs",
        !            23:        "/usr/bin/new",
        !            24:        "/usr/bin/v7",
        !            25:        "/usr/bin/old",
        !            26:        "/usr/bin/UNSUPPORTED",
        !            27: #endif
        !            28:        0
        !            29: };
        !            30: static char *mandirs[] = {
        !            31:        "/usr/man/man1",
        !            32:        "/usr/man/man2",
        !            33:        "/usr/man/man3",
        !            34:        "/usr/man/man4",
        !            35:        "/usr/man/man5",
        !            36:        "/usr/man/man6",
        !            37:        "/usr/man/man7",
        !            38:        "/usr/man/man8",
        !            39: #ifdef CORY
        !            40:        "/usr/man/manu",
        !            41:        "/usr/man/manc",
        !            42:        "/usr/man/manv7",
        !            43:        "/usr/bin/eecs/mane",
        !            44: #endif
        !            45:        0
        !            46: };
        !            47: static char *srcdirs[]  = {
        !            48:        "/usr/src/cmd",
        !            49:        "/usr/src/games",
        !            50:        "/usr/src/libc/gen",
        !            51:        "/usr/src/libc/stdio",
        !            52: #ifdef CSVAX
        !            53:        "/usr/src/libc/sys",
        !            54:        "/usr/src/new",
        !            55:        "/usr/src/old",
        !            56:        "/usr/src/local",
        !            57:        "/usr/src/undoc",
        !            58: #endif
        !            59: #ifdef CORY
        !            60:        "/usr/bin/eecs/src",
        !            61:        "/usr/src/cmd/v7",
        !            62:        "/usr/src/cmd/new",
        !            63:        "/usr/src/cmd/old",
        !            64:        "/usr/src/cmd/UNSUPPORTED",
        !            65: #endif
        !            66:        0
        !            67: };
        !            68: 
        !            69: char   sflag = 1;
        !            70: char   bflag = 1;
        !            71: char   mflag = 1;
        !            72: char   **Sflag;
        !            73: int    Scnt;
        !            74: char   **Bflag;
        !            75: int    Bcnt;
        !            76: char   **Mflag;
        !            77: int    Mcnt;
        !            78: char   uflag;
        !            79: /*
        !            80:  * whereis name
        !            81:  * look for source, documentation and binaries
        !            82:  */
        !            83: main(argc, argv)
        !            84:        int argc;
        !            85:        char *argv[];
        !            86: {
        !            87: 
        !            88: #ifdef CORY
        !            89:        if (getuid() == 0)
        !            90:                nice(-20);
        !            91:        if (((getuid() >> 8) & 0377) > 10)
        !            92:                setuid(getuid());
        !            93: #endif
        !            94:        argc--, argv++;
        !            95:        if (argc == 0) {
        !            96: usage:
        !            97:                fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n");
        !            98:                exit(1);
        !            99:        }
        !           100:        do
        !           101:                if (argv[0][0] == '-') {
        !           102:                        register char *cp = argv[0] + 1;
        !           103:                        while (*cp) switch (*cp++) {
        !           104: 
        !           105:                        case 'f':
        !           106:                                break;
        !           107: 
        !           108:                        case 'S':
        !           109:                                getlist(&argc, &argv, &Sflag, &Scnt);
        !           110:                                break;
        !           111: 
        !           112:                        case 'B':
        !           113:                                getlist(&argc, &argv, &Bflag, &Bcnt);
        !           114:                                break;
        !           115: 
        !           116:                        case 'M':
        !           117:                                getlist(&argc, &argv, &Mflag, &Mcnt);
        !           118:                                break;
        !           119: 
        !           120:                        case 's':
        !           121:                                zerof();
        !           122:                                sflag++;
        !           123:                                continue;
        !           124: 
        !           125:                        case 'u':
        !           126:                                uflag++;
        !           127:                                continue;
        !           128: 
        !           129:                        case 'b':
        !           130:                                zerof();
        !           131:                                bflag++;
        !           132:                                continue;
        !           133: 
        !           134:                        case 'm':
        !           135:                                zerof();
        !           136:                                mflag++;
        !           137:                                continue;
        !           138: 
        !           139:                        default:
        !           140:                                goto usage;
        !           141:                        }
        !           142:                        argv++;
        !           143:                } else
        !           144:                        lookup(*argv++);
        !           145:        while (--argc > 0);
        !           146: }
        !           147: 
        !           148: getlist(argcp, argvp, flagp, cntp)
        !           149:        char ***argvp;
        !           150:        int *argcp;
        !           151:        char ***flagp;
        !           152:        int *cntp;
        !           153: {
        !           154: 
        !           155:        (*argvp)++;
        !           156:        *flagp = *argvp;
        !           157:        *cntp = 0;
        !           158:        for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--)
        !           159:                (*cntp)++, (*argvp)++;
        !           160:        (*argcp)++;
        !           161:        (*argvp)--;
        !           162: }
        !           163: 
        !           164: 
        !           165: zerof()
        !           166: {
        !           167: 
        !           168:        if (sflag && bflag && mflag)
        !           169:                sflag = bflag = mflag = 0;
        !           170: }
        !           171: int    count;
        !           172: int    print;
        !           173: 
        !           174: 
        !           175: lookup(cp)
        !           176:        register char *cp;
        !           177: {
        !           178:        register char *dp;
        !           179: 
        !           180:        for (dp = cp; *dp; dp++)
        !           181:                continue;
        !           182:        for (; dp > cp; dp--) {
        !           183:                if (*dp == '.') {
        !           184:                        *dp = 0;
        !           185:                        break;
        !           186:                }
        !           187:        }
        !           188:        for (dp = cp; *dp; dp++)
        !           189:                if (*dp == '/')
        !           190:                        cp = dp + 1;
        !           191:        if (uflag) {
        !           192:                print = 0;
        !           193:                count = 0;
        !           194:        } else
        !           195:                print = 1;
        !           196: again:
        !           197:        if (print)
        !           198:                printf("%s:", cp);
        !           199:        if (sflag) {
        !           200:                looksrc(cp);
        !           201:                if (uflag && print == 0 && count != 1) {
        !           202:                        print = 1;
        !           203:                        goto again;
        !           204:                }
        !           205:        }
        !           206:        count = 0;
        !           207:        if (bflag) {
        !           208:                lookbin(cp);
        !           209:                if (uflag && print == 0 && count != 1) {
        !           210:                        print = 1;
        !           211:                        goto again;
        !           212:                }
        !           213:        }
        !           214:        count = 0;
        !           215:        if (mflag) {
        !           216:                lookman(cp);
        !           217:                if (uflag && print == 0 && count != 1) {
        !           218:                        print = 1;
        !           219:                        goto again;
        !           220:                }
        !           221:        }
        !           222:        if (print)
        !           223:                printf("\n");
        !           224: }
        !           225: 
        !           226: looksrc(cp)
        !           227:        char *cp;
        !           228: {
        !           229:        if (Sflag == 0) {
        !           230:                find(srcdirs, cp);
        !           231:        } else
        !           232:                findv(Sflag, Scnt, cp);
        !           233: }
        !           234: 
        !           235: lookbin(cp)
        !           236:        char *cp;
        !           237: {
        !           238:        if (Bflag == 0)
        !           239:                find(bindirs, cp);
        !           240:        else
        !           241:                findv(Bflag, Bcnt, cp);
        !           242: }
        !           243: 
        !           244: lookman(cp)
        !           245:        char *cp;
        !           246: {
        !           247:        if (Mflag == 0) {
        !           248:                find(mandirs, cp);
        !           249:        } else
        !           250:                findv(Mflag, Mcnt, cp);
        !           251: }
        !           252: 
        !           253: findv(dirv, dirc, cp)
        !           254:        char **dirv;
        !           255:        int dirc;
        !           256:        char *cp;
        !           257: {
        !           258: 
        !           259:        while (dirc > 0)
        !           260:                findin(*dirv++, cp), dirc--;
        !           261: }
        !           262: 
        !           263: find(dirs, cp)
        !           264:        char **dirs;
        !           265:        char *cp;
        !           266: {
        !           267: 
        !           268:        while (*dirs)
        !           269:                findin(*dirs++, cp);
        !           270: }
        !           271: 
        !           272: findin(dir, cp)
        !           273:        char *dir, *cp;
        !           274: {
        !           275:        register FILE *d;
        !           276:        struct direct direct;
        !           277: 
        !           278:        d = fopen(dir, "r");
        !           279:        if (d == NULL)
        !           280:                return;
        !           281:        while (fread(&direct, sizeof direct, 1, d) == 1) {
        !           282:                if (direct.d_ino == 0)
        !           283:                        continue;
        !           284:                if (itsit(cp, direct.d_name)) {
        !           285:                        count++;
        !           286:                        if (print)
        !           287:                                printf(" %s/%.14s", dir, direct.d_name);
        !           288:                }
        !           289:        }
        !           290:        fclose(d);
        !           291: }
        !           292: 
        !           293: itsit(cp, dp)
        !           294:        register char *cp, *dp;
        !           295: {
        !           296:        register int i = 14;
        !           297: 
        !           298:        if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
        !           299:                return (1);
        !           300:        while (*cp && *dp && *cp == *dp)
        !           301:                cp++, dp++, i--;
        !           302:        if (*cp == 0 && *dp == 0)
        !           303:                return (1);
        !           304:        while (isdigit(*dp))
        !           305:                dp++;
        !           306:        if (*cp == 0 && *dp++ == '.') {
        !           307:                --i;
        !           308:                while (i > 0 && *dp)
        !           309:                        if (--i, *dp++ == '.')
        !           310:                                return (*dp++ == 'C' && *dp++ == 0);
        !           311:                return (1);
        !           312:        }
        !           313:        return (0);
        !           314: }

unix.superglobalmegacorp.com

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