1*2371Skre static char *sccsid = "@(#)whereis.c 4.3 (Berkeley) 02/07/81"; 21163Sbill #include <sys/types.h> 31163Sbill #include <stdio.h> 41163Sbill #include <ctype.h> 51163Sbill #include <sys/dir.h> 61163Sbill #include <whoami.h> 71163Sbill 81163Sbill static char *bindirs[] = { 91163Sbill "/etc", 101163Sbill "/bin", 111163Sbill "/usr/bin", 121163Sbill "/usr/games", 13*2371Skre #ifdef CSVAX 14*2371Skre "/lib", 15*2371Skre "/usr/ucb", 16*2371Skre "/usr/lib", 17*2371Skre "/usr/local", 18*2371Skre "/usr/new", 19*2371Skre "/usr/old", 20*2371Skre #endif 211866Seric #ifdef CORY 221866Seric "/usr/bin/eecs", 231866Seric "/usr/bin/new", 241866Seric "/usr/bin/v7", 251866Seric "/usr/bin/old", 261866Seric "/usr/bin/UNSUPPORTED", 27*2371Skre #endif 28*2371Skre #ifdef ARPAVAX 291163Sbill "/lib", 301163Sbill "/usr/ucb", 311163Sbill "/usr/lib", 321163Sbill "/usr/local", 331163Sbill "/usr/new", 341163Sbill "/usr/old", 351163Sbill #endif 361163Sbill 0 371163Sbill }; 381163Sbill static char *mandirs[] = { 391163Sbill "/usr/man/man1", 401163Sbill "/usr/man/man2", 411163Sbill "/usr/man/man3", 421163Sbill "/usr/man/man4", 431163Sbill "/usr/man/man5", 441163Sbill "/usr/man/man6", 451163Sbill "/usr/man/man7", 461163Sbill "/usr/man/man8", 471163Sbill #ifdef CORY 481163Sbill "/usr/man/manu", 491163Sbill "/usr/man/manc", 501163Sbill "/usr/man/manv7", 511163Sbill "/usr/bin/eecs/mane", 521163Sbill #endif 531163Sbill 0 541163Sbill }; 551163Sbill static char *srcdirs[] = { 561163Sbill "/usr/src/cmd", 571163Sbill "/usr/src/games", 581163Sbill "/usr/src/libc/gen", 591163Sbill "/usr/src/libc/stdio", 60*2371Skre #ifdef CSVAX 61*2371Skre "/usr/src/libc/sys", 62*2371Skre "/usr/src/new", 63*2371Skre "/usr/src/old", 64*2371Skre "/usr/src/local", 65*2371Skre "/usr/src/undoc", 66*2371Skre #endif 671163Sbill #ifdef CORY 681163Sbill "/usr/bin/eecs/src", 691163Sbill "/usr/src/cmd/v7", 701163Sbill "/usr/src/cmd/new", 711163Sbill "/usr/src/cmd/old", 721163Sbill "/usr/src/cmd/UNSUPPORTED", 731163Sbill #endif 74*2371Skre #ifdef ARPAVAX 75*2371Skre "/ra/src/cmd", 76*2371Skre "/ra/src/new", 77*2371Skre "/ra/src/old", 78*2371Skre "/ra/src/libc/gen", 79*2371Skre "/ra/src/libc/stdio", 80*2371Skre #endif 811163Sbill 0 821163Sbill }; 831163Sbill 841163Sbill char sflag = 1; 851163Sbill char bflag = 1; 861163Sbill char mflag = 1; 871163Sbill char **Sflag; 881163Sbill int Scnt; 891163Sbill char **Bflag; 901163Sbill int Bcnt; 911163Sbill char **Mflag; 921163Sbill int Mcnt; 931163Sbill char uflag; 941163Sbill /* 951163Sbill * whereis name 961163Sbill * look for source, documentation and binaries 971163Sbill */ 981163Sbill main(argc, argv) 991163Sbill int argc; 1001163Sbill char *argv[]; 1011163Sbill { 1021163Sbill 1031163Sbill #ifdef CORY 1041163Sbill if (getuid() == 0) 1051163Sbill nice(-20); 1061163Sbill if (((getuid() >> 8) & 0377) > 10) 1071163Sbill setuid(getuid()); 1081163Sbill #endif 1091163Sbill argc--, argv++; 1101163Sbill if (argc == 0) { 1111163Sbill usage: 1121163Sbill fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); 1131163Sbill exit(1); 1141163Sbill } 1151163Sbill do 1161163Sbill if (argv[0][0] == '-') { 1171163Sbill register char *cp = argv[0] + 1; 1181163Sbill while (*cp) switch (*cp++) { 1191163Sbill 1201163Sbill case 'f': 1211163Sbill break; 1221163Sbill 1231163Sbill case 'S': 1241163Sbill getlist(&argc, &argv, &Sflag, &Scnt); 1251163Sbill break; 1261163Sbill 1271163Sbill case 'B': 1281163Sbill getlist(&argc, &argv, &Bflag, &Bcnt); 1291163Sbill break; 1301163Sbill 1311163Sbill case 'M': 1321163Sbill getlist(&argc, &argv, &Mflag, &Mcnt); 1331163Sbill break; 1341163Sbill 1351163Sbill case 's': 1361163Sbill zerof(); 1371163Sbill sflag++; 1381163Sbill continue; 1391163Sbill 1401163Sbill case 'u': 1411163Sbill uflag++; 1421163Sbill continue; 1431163Sbill 1441163Sbill case 'b': 1451163Sbill zerof(); 1461163Sbill bflag++; 1471163Sbill continue; 1481163Sbill 1491163Sbill case 'm': 1501163Sbill zerof(); 1511163Sbill mflag++; 1521163Sbill continue; 1531163Sbill 1541163Sbill default: 1551163Sbill goto usage; 1561163Sbill } 1571163Sbill argv++; 1581163Sbill } else 1591163Sbill lookup(*argv++); 1601163Sbill while (--argc > 0); 1611163Sbill } 1621163Sbill 1631163Sbill getlist(argcp, argvp, flagp, cntp) 1641163Sbill char ***argvp; 1651163Sbill int *argcp; 1661163Sbill char ***flagp; 1671163Sbill int *cntp; 1681163Sbill { 1691163Sbill 1701163Sbill (*argvp)++; 1711163Sbill *flagp = *argvp; 1721163Sbill *cntp = 0; 1731163Sbill for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) 1741163Sbill (*cntp)++, (*argvp)++; 1751163Sbill (*argcp)++; 1761163Sbill (*argvp)--; 1771163Sbill } 1781163Sbill 1791163Sbill 1801163Sbill zerof() 1811163Sbill { 1821163Sbill 1831163Sbill if (sflag && bflag && mflag) 1841163Sbill sflag = bflag = mflag = 0; 1851163Sbill } 1861163Sbill int count; 1871163Sbill int print; 1881163Sbill 1891163Sbill 1901163Sbill lookup(cp) 1911163Sbill register char *cp; 1921163Sbill { 1931163Sbill register char *dp; 1941163Sbill 1951163Sbill for (dp = cp; *dp; dp++) 1961163Sbill continue; 1971163Sbill for (; dp > cp; dp--) { 1981163Sbill if (*dp == '.') { 1991163Sbill *dp = 0; 2001163Sbill break; 2011163Sbill } 2021163Sbill } 2031163Sbill for (dp = cp; *dp; dp++) 2041163Sbill if (*dp == '/') 2051163Sbill cp = dp + 1; 2061163Sbill if (uflag) { 2071163Sbill print = 0; 2081163Sbill count = 0; 2091163Sbill } else 2101163Sbill print = 1; 2111163Sbill again: 2121163Sbill if (print) 2131163Sbill printf("%s:", cp); 2141163Sbill if (sflag) { 2151163Sbill looksrc(cp); 2161163Sbill if (uflag && print == 0 && count != 1) { 2171163Sbill print = 1; 2181163Sbill goto again; 2191163Sbill } 2201163Sbill } 2211163Sbill count = 0; 2221163Sbill if (bflag) { 2231163Sbill lookbin(cp); 2241163Sbill if (uflag && print == 0 && count != 1) { 2251163Sbill print = 1; 2261163Sbill goto again; 2271163Sbill } 2281163Sbill } 2291163Sbill count = 0; 2301163Sbill if (mflag) { 2311163Sbill lookman(cp); 2321163Sbill if (uflag && print == 0 && count != 1) { 2331163Sbill print = 1; 2341163Sbill goto again; 2351163Sbill } 2361163Sbill } 2371163Sbill if (print) 2381163Sbill printf("\n"); 2391163Sbill } 2401163Sbill 2411163Sbill looksrc(cp) 2421163Sbill char *cp; 2431163Sbill { 2441163Sbill if (Sflag == 0) { 2451163Sbill find(srcdirs, cp); 2461163Sbill } else 2471163Sbill findv(Sflag, Scnt, cp); 2481163Sbill } 2491163Sbill 2501163Sbill lookbin(cp) 2511163Sbill char *cp; 2521163Sbill { 2531163Sbill if (Bflag == 0) 2541163Sbill find(bindirs, cp); 2551163Sbill else 2561163Sbill findv(Bflag, Bcnt, cp); 2571163Sbill } 2581163Sbill 2591163Sbill lookman(cp) 2601163Sbill char *cp; 2611163Sbill { 2621163Sbill if (Mflag == 0) { 2631163Sbill find(mandirs, cp); 2641163Sbill } else 2651163Sbill findv(Mflag, Mcnt, cp); 2661163Sbill } 2671163Sbill 2681163Sbill findv(dirv, dirc, cp) 2691163Sbill char **dirv; 2701163Sbill int dirc; 2711163Sbill char *cp; 2721163Sbill { 2731163Sbill 2741163Sbill while (dirc > 0) 2751163Sbill findin(*dirv++, cp), dirc--; 2761163Sbill } 2771163Sbill 2781163Sbill find(dirs, cp) 2791163Sbill char **dirs; 2801163Sbill char *cp; 2811163Sbill { 2821163Sbill 2831163Sbill while (*dirs) 2841163Sbill findin(*dirs++, cp); 2851163Sbill } 2861163Sbill 2871163Sbill findin(dir, cp) 2881163Sbill char *dir, *cp; 2891163Sbill { 2901163Sbill register FILE *d; 2911163Sbill struct direct direct; 2921163Sbill 2931163Sbill d = fopen(dir, "r"); 2941163Sbill if (d == NULL) 2951163Sbill return; 2961163Sbill while (fread(&direct, sizeof direct, 1, d) == 1) { 2971163Sbill if (direct.d_ino == 0) 2981163Sbill continue; 2991163Sbill if (itsit(cp, direct.d_name)) { 3001163Sbill count++; 3011163Sbill if (print) 3021163Sbill printf(" %s/%.14s", dir, direct.d_name); 3031163Sbill } 3041163Sbill } 3051163Sbill fclose(d); 3061163Sbill } 3071163Sbill 3081163Sbill itsit(cp, dp) 3091163Sbill register char *cp, *dp; 3101163Sbill { 3111163Sbill register int i = 14; 3121163Sbill 3131163Sbill if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) 3141163Sbill return (1); 3151163Sbill while (*cp && *dp && *cp == *dp) 3161163Sbill cp++, dp++, i--; 3171163Sbill if (*cp == 0 && *dp == 0) 3181163Sbill return (1); 3191163Sbill while (isdigit(*dp)) 3201163Sbill dp++; 3211163Sbill if (*cp == 0 && *dp++ == '.') { 3221163Sbill --i; 3231163Sbill while (i > 0 && *dp) 3241163Sbill if (--i, *dp++ == '.') 3251163Sbill return (*dp++ == 'C' && *dp++ == 0); 3261163Sbill return (1); 3271163Sbill } 3281163Sbill return (0); 3291163Sbill } 330