Annotation of 3BSD/cmd/whereis.c, revision 1.1.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.