1*6732Smckusick static char *sccsid = "@(#)whereis.c 4.6 (Berkeley) 05/11/82"; 26206Sroot 3*6732Smckusick #include <sys/param.h> 41163Sbill #include <stdio.h> 51163Sbill #include <ctype.h> 6*6732Smckusick #include <dir.h> 71163Sbill 81163Sbill static char *bindirs[] = { 91163Sbill "/etc", 101163Sbill "/bin", 111163Sbill "/usr/bin", 121163Sbill "/usr/games", 132371Skre "/lib", 142371Skre "/usr/ucb", 152371Skre "/usr/lib", 162371Skre "/usr/local", 172371Skre "/usr/new", 182371Skre "/usr/old", 19*6732Smckusick "/usr/hosts", 201163Sbill 0 211163Sbill }; 221163Sbill static char *mandirs[] = { 231163Sbill "/usr/man/man1", 241163Sbill "/usr/man/man2", 251163Sbill "/usr/man/man3", 261163Sbill "/usr/man/man4", 271163Sbill "/usr/man/man5", 281163Sbill "/usr/man/man6", 291163Sbill "/usr/man/man7", 301163Sbill "/usr/man/man8", 311163Sbill 0 321163Sbill }; 331163Sbill static char *srcdirs[] = { 34*6732Smckusick "/usr/src/etc", 35*6732Smckusick "/usr/src/bin", 36*6732Smckusick "/usr/src/usr.bin", 371163Sbill "/usr/src/games", 38*6732Smckusick "/usr/src/lib", 39*6732Smckusick "/usr/src/lib/libc/gen", 40*6732Smckusick "/usr/src/lib/libc/stdio", 41*6732Smckusick "/usr/src/lib/libc/sys", 42*6732Smckusick "/usr/src/ucb", 43*6732Smckusick "/usr/src/ucb/netser", 44*6732Smckusick "/usr/src/ucb/arpanet", 45*6732Smckusick "/usr/src/usr.lib", 46*6732Smckusick "/usr/src/local", 472371Skre "/usr/src/new", 482371Skre "/usr/src/old", 492371Skre "/usr/src/undoc", 50*6732Smckusick /* these are temporary */ 51*6732Smckusick "/usr/src/src.arpa/cmd", 52*6732Smckusick "/usr/src/src.monet/4.1", 53*6732Smckusick "/usr/src/src.monet/4.1a", 54*6732Smckusick "/usr/src/src.monet/4.1b", 551163Sbill 0 561163Sbill }; 571163Sbill 581163Sbill char sflag = 1; 591163Sbill char bflag = 1; 601163Sbill char mflag = 1; 611163Sbill char **Sflag; 621163Sbill int Scnt; 631163Sbill char **Bflag; 641163Sbill int Bcnt; 651163Sbill char **Mflag; 661163Sbill int Mcnt; 671163Sbill char uflag; 681163Sbill /* 691163Sbill * whereis name 701163Sbill * look for source, documentation and binaries 711163Sbill */ 721163Sbill main(argc, argv) 731163Sbill int argc; 741163Sbill char *argv[]; 751163Sbill { 761163Sbill 77*6732Smckusick #ifdef CORY 78*6732Smckusick if (getuid() == 0) 79*6732Smckusick nice(-20); 80*6732Smckusick if (((getuid() >> 8) & 0377) > 10) 81*6732Smckusick setuid(getuid()); 82*6732Smckusick #endif 831163Sbill argc--, argv++; 841163Sbill if (argc == 0) { 851163Sbill usage: 861163Sbill fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); 871163Sbill exit(1); 881163Sbill } 891163Sbill do 901163Sbill if (argv[0][0] == '-') { 911163Sbill register char *cp = argv[0] + 1; 921163Sbill while (*cp) switch (*cp++) { 931163Sbill 941163Sbill case 'f': 951163Sbill break; 961163Sbill 971163Sbill case 'S': 981163Sbill getlist(&argc, &argv, &Sflag, &Scnt); 991163Sbill break; 1001163Sbill 1011163Sbill case 'B': 1021163Sbill getlist(&argc, &argv, &Bflag, &Bcnt); 1031163Sbill break; 1041163Sbill 1051163Sbill case 'M': 1061163Sbill getlist(&argc, &argv, &Mflag, &Mcnt); 1071163Sbill break; 1081163Sbill 1091163Sbill case 's': 1101163Sbill zerof(); 1111163Sbill sflag++; 1121163Sbill continue; 1131163Sbill 1141163Sbill case 'u': 1151163Sbill uflag++; 1161163Sbill continue; 1171163Sbill 1181163Sbill case 'b': 1191163Sbill zerof(); 1201163Sbill bflag++; 1211163Sbill continue; 1221163Sbill 1231163Sbill case 'm': 1241163Sbill zerof(); 1251163Sbill mflag++; 1261163Sbill continue; 1271163Sbill 1281163Sbill default: 1291163Sbill goto usage; 1301163Sbill } 1311163Sbill argv++; 1321163Sbill } else 1331163Sbill lookup(*argv++); 1341163Sbill while (--argc > 0); 1351163Sbill } 1361163Sbill 1371163Sbill getlist(argcp, argvp, flagp, cntp) 1381163Sbill char ***argvp; 1391163Sbill int *argcp; 1401163Sbill char ***flagp; 1411163Sbill int *cntp; 1421163Sbill { 1431163Sbill 1441163Sbill (*argvp)++; 1451163Sbill *flagp = *argvp; 1461163Sbill *cntp = 0; 1471163Sbill for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) 1481163Sbill (*cntp)++, (*argvp)++; 1491163Sbill (*argcp)++; 1501163Sbill (*argvp)--; 1511163Sbill } 1521163Sbill 1531163Sbill 1541163Sbill zerof() 1551163Sbill { 1561163Sbill 1571163Sbill if (sflag && bflag && mflag) 1581163Sbill sflag = bflag = mflag = 0; 1591163Sbill } 1601163Sbill int count; 1611163Sbill int print; 1621163Sbill 1631163Sbill 1641163Sbill lookup(cp) 1651163Sbill register char *cp; 1661163Sbill { 1671163Sbill register char *dp; 1681163Sbill 1691163Sbill for (dp = cp; *dp; dp++) 1701163Sbill continue; 1711163Sbill for (; dp > cp; dp--) { 1721163Sbill if (*dp == '.') { 1731163Sbill *dp = 0; 1741163Sbill break; 1751163Sbill } 1761163Sbill } 1771163Sbill for (dp = cp; *dp; dp++) 1781163Sbill if (*dp == '/') 1791163Sbill cp = dp + 1; 1801163Sbill if (uflag) { 1811163Sbill print = 0; 1821163Sbill count = 0; 1831163Sbill } else 1841163Sbill print = 1; 1851163Sbill again: 1861163Sbill if (print) 1871163Sbill printf("%s:", cp); 1881163Sbill if (sflag) { 1891163Sbill looksrc(cp); 1901163Sbill if (uflag && print == 0 && count != 1) { 1911163Sbill print = 1; 1921163Sbill goto again; 1931163Sbill } 1941163Sbill } 1951163Sbill count = 0; 1961163Sbill if (bflag) { 1971163Sbill lookbin(cp); 1981163Sbill if (uflag && print == 0 && count != 1) { 1991163Sbill print = 1; 2001163Sbill goto again; 2011163Sbill } 2021163Sbill } 2031163Sbill count = 0; 2041163Sbill if (mflag) { 2051163Sbill lookman(cp); 2061163Sbill if (uflag && print == 0 && count != 1) { 2071163Sbill print = 1; 2081163Sbill goto again; 2091163Sbill } 2101163Sbill } 2111163Sbill if (print) 2121163Sbill printf("\n"); 2131163Sbill } 2141163Sbill 2151163Sbill looksrc(cp) 2161163Sbill char *cp; 2171163Sbill { 2181163Sbill if (Sflag == 0) { 2191163Sbill find(srcdirs, cp); 2201163Sbill } else 2211163Sbill findv(Sflag, Scnt, cp); 2221163Sbill } 2231163Sbill 2241163Sbill lookbin(cp) 2251163Sbill char *cp; 2261163Sbill { 2271163Sbill if (Bflag == 0) 2281163Sbill find(bindirs, cp); 2291163Sbill else 2301163Sbill findv(Bflag, Bcnt, cp); 2311163Sbill } 2321163Sbill 2331163Sbill lookman(cp) 2341163Sbill char *cp; 2351163Sbill { 2361163Sbill if (Mflag == 0) { 2371163Sbill find(mandirs, cp); 2381163Sbill } else 2391163Sbill findv(Mflag, Mcnt, cp); 2401163Sbill } 2411163Sbill 2421163Sbill findv(dirv, dirc, cp) 2431163Sbill char **dirv; 2441163Sbill int dirc; 2451163Sbill char *cp; 2461163Sbill { 2471163Sbill 2481163Sbill while (dirc > 0) 2491163Sbill findin(*dirv++, cp), dirc--; 2501163Sbill } 2511163Sbill 2521163Sbill find(dirs, cp) 2531163Sbill char **dirs; 2541163Sbill char *cp; 2551163Sbill { 2561163Sbill 2571163Sbill while (*dirs) 2581163Sbill findin(*dirs++, cp); 2591163Sbill } 2601163Sbill 2611163Sbill findin(dir, cp) 2621163Sbill char *dir, *cp; 2631163Sbill { 264*6732Smckusick DIR *dirp; 265*6732Smckusick struct direct *dp; 2661163Sbill 267*6732Smckusick dirp = opendir(dir); 268*6732Smckusick if (dirp == NULL) 2691163Sbill return; 270*6732Smckusick while ((dp = readdir(dirp)) != NULL) { 271*6732Smckusick if (itsit(cp, dp->d_name)) { 2721163Sbill count++; 2731163Sbill if (print) 274*6732Smckusick printf(" %s/%.14s", dir, dp->d_name); 2751163Sbill } 2761163Sbill } 277*6732Smckusick closedir(dirp); 2781163Sbill } 2791163Sbill 2801163Sbill itsit(cp, dp) 2811163Sbill register char *cp, *dp; 2821163Sbill { 2831163Sbill register int i = 14; 2841163Sbill 2851163Sbill if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) 2861163Sbill return (1); 2871163Sbill while (*cp && *dp && *cp == *dp) 2881163Sbill cp++, dp++, i--; 2891163Sbill if (*cp == 0 && *dp == 0) 2901163Sbill return (1); 2911163Sbill while (isdigit(*dp)) 2921163Sbill dp++; 2931163Sbill if (*cp == 0 && *dp++ == '.') { 2941163Sbill --i; 2951163Sbill while (i > 0 && *dp) 2961163Sbill if (--i, *dp++ == '.') 2971163Sbill return (*dp++ == 'C' && *dp++ == 0); 2981163Sbill return (1); 2991163Sbill } 3001163Sbill return (0); 3011163Sbill } 302