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

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

unix.superglobalmegacorp.com

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