1*10723Smckusick static char *sccsid = "@(#)whereis.c 4.8 (Berkeley) 02/03/83"; 26206Sroot 36732Smckusick #include <sys/param.h> 41163Sbill #include <stdio.h> 51163Sbill #include <ctype.h> 66732Smckusick #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", 196732Smckusick "/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[] = { 346732Smckusick "/usr/src/bin", 356732Smckusick "/usr/src/usr.bin", 36*10723Smckusick "/usr/src/etc", 37*10723Smckusick "/usr/src/ucb", 381163Sbill "/usr/src/games", 39*10723Smckusick "/usr/src/usr.lib", 406732Smckusick "/usr/src/lib", 41*10723Smckusick "/usr/src/local", 42*10723Smckusick "/usr/src/new", 43*10723Smckusick "/usr/src/old", 446732Smckusick "/usr/src/lib/libc/gen", 456732Smckusick "/usr/src/lib/libc/stdio", 466732Smckusick "/usr/src/lib/libc/sys", 47*10723Smckusick "/usr/src/lib/libc/net/common", 48*10723Smckusick "/usr/src/lib/libc/net/inet", 49*10723Smckusick "/usr/src/lib/libc/net/misc", 506732Smckusick "/usr/src/ucb/netser", 51*10723Smckusick "/usr/src/ucb/netser/misc", 526732Smckusick "/usr/src/ucb/arpanet", 53*10723Smckusick "/usr/src/ucb/pascal", 54*10723Smckusick "/usr/src/ucb/pascal/utilities", 552371Skre "/usr/src/undoc", 561163Sbill 0 571163Sbill }; 581163Sbill 591163Sbill char sflag = 1; 601163Sbill char bflag = 1; 611163Sbill char mflag = 1; 621163Sbill char **Sflag; 631163Sbill int Scnt; 641163Sbill char **Bflag; 651163Sbill int Bcnt; 661163Sbill char **Mflag; 671163Sbill int Mcnt; 681163Sbill char uflag; 691163Sbill /* 701163Sbill * whereis name 711163Sbill * look for source, documentation and binaries 721163Sbill */ 731163Sbill main(argc, argv) 741163Sbill int argc; 751163Sbill char *argv[]; 761163Sbill { 771163Sbill 786732Smckusick #ifdef CORY 796732Smckusick if (getuid() == 0) 806732Smckusick nice(-20); 816732Smckusick if (((getuid() >> 8) & 0377) > 10) 826732Smckusick setuid(getuid()); 836732Smckusick #endif 841163Sbill argc--, argv++; 851163Sbill if (argc == 0) { 861163Sbill usage: 871163Sbill fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); 881163Sbill exit(1); 891163Sbill } 901163Sbill do 911163Sbill if (argv[0][0] == '-') { 921163Sbill register char *cp = argv[0] + 1; 931163Sbill while (*cp) switch (*cp++) { 941163Sbill 951163Sbill case 'f': 961163Sbill break; 971163Sbill 981163Sbill case 'S': 991163Sbill getlist(&argc, &argv, &Sflag, &Scnt); 1001163Sbill break; 1011163Sbill 1021163Sbill case 'B': 1031163Sbill getlist(&argc, &argv, &Bflag, &Bcnt); 1041163Sbill break; 1051163Sbill 1061163Sbill case 'M': 1071163Sbill getlist(&argc, &argv, &Mflag, &Mcnt); 1081163Sbill break; 1091163Sbill 1101163Sbill case 's': 1111163Sbill zerof(); 1121163Sbill sflag++; 1131163Sbill continue; 1141163Sbill 1151163Sbill case 'u': 1161163Sbill uflag++; 1171163Sbill continue; 1181163Sbill 1191163Sbill case 'b': 1201163Sbill zerof(); 1211163Sbill bflag++; 1221163Sbill continue; 1231163Sbill 1241163Sbill case 'm': 1251163Sbill zerof(); 1261163Sbill mflag++; 1271163Sbill continue; 1281163Sbill 1291163Sbill default: 1301163Sbill goto usage; 1311163Sbill } 1321163Sbill argv++; 1331163Sbill } else 1341163Sbill lookup(*argv++); 1351163Sbill while (--argc > 0); 1361163Sbill } 1371163Sbill 1381163Sbill getlist(argcp, argvp, flagp, cntp) 1391163Sbill char ***argvp; 1401163Sbill int *argcp; 1411163Sbill char ***flagp; 1421163Sbill int *cntp; 1431163Sbill { 1441163Sbill 1451163Sbill (*argvp)++; 1461163Sbill *flagp = *argvp; 1471163Sbill *cntp = 0; 1481163Sbill for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) 1491163Sbill (*cntp)++, (*argvp)++; 1501163Sbill (*argcp)++; 1511163Sbill (*argvp)--; 1521163Sbill } 1531163Sbill 1541163Sbill 1551163Sbill zerof() 1561163Sbill { 1571163Sbill 1581163Sbill if (sflag && bflag && mflag) 1591163Sbill sflag = bflag = mflag = 0; 1601163Sbill } 1611163Sbill int count; 1621163Sbill int print; 1631163Sbill 1641163Sbill 1651163Sbill lookup(cp) 1661163Sbill register char *cp; 1671163Sbill { 1681163Sbill register char *dp; 1691163Sbill 1701163Sbill for (dp = cp; *dp; dp++) 1711163Sbill continue; 1721163Sbill for (; dp > cp; dp--) { 1731163Sbill if (*dp == '.') { 1741163Sbill *dp = 0; 1751163Sbill break; 1761163Sbill } 1771163Sbill } 1781163Sbill for (dp = cp; *dp; dp++) 1791163Sbill if (*dp == '/') 1801163Sbill cp = dp + 1; 1811163Sbill if (uflag) { 1821163Sbill print = 0; 1831163Sbill count = 0; 1841163Sbill } else 1851163Sbill print = 1; 1861163Sbill again: 1871163Sbill if (print) 1881163Sbill printf("%s:", cp); 1891163Sbill if (sflag) { 1901163Sbill looksrc(cp); 1911163Sbill if (uflag && print == 0 && count != 1) { 1921163Sbill print = 1; 1931163Sbill goto again; 1941163Sbill } 1951163Sbill } 1961163Sbill count = 0; 1971163Sbill if (bflag) { 1981163Sbill lookbin(cp); 1991163Sbill if (uflag && print == 0 && count != 1) { 2001163Sbill print = 1; 2011163Sbill goto again; 2021163Sbill } 2031163Sbill } 2041163Sbill count = 0; 2051163Sbill if (mflag) { 2061163Sbill lookman(cp); 2071163Sbill if (uflag && print == 0 && count != 1) { 2081163Sbill print = 1; 2091163Sbill goto again; 2101163Sbill } 2111163Sbill } 2121163Sbill if (print) 2131163Sbill printf("\n"); 2141163Sbill } 2151163Sbill 2161163Sbill looksrc(cp) 2171163Sbill char *cp; 2181163Sbill { 2191163Sbill if (Sflag == 0) { 2201163Sbill find(srcdirs, cp); 2211163Sbill } else 2221163Sbill findv(Sflag, Scnt, cp); 2231163Sbill } 2241163Sbill 2251163Sbill lookbin(cp) 2261163Sbill char *cp; 2271163Sbill { 2281163Sbill if (Bflag == 0) 2291163Sbill find(bindirs, cp); 2301163Sbill else 2311163Sbill findv(Bflag, Bcnt, cp); 2321163Sbill } 2331163Sbill 2341163Sbill lookman(cp) 2351163Sbill char *cp; 2361163Sbill { 2371163Sbill if (Mflag == 0) { 2381163Sbill find(mandirs, cp); 2391163Sbill } else 2401163Sbill findv(Mflag, Mcnt, cp); 2411163Sbill } 2421163Sbill 2431163Sbill findv(dirv, dirc, cp) 2441163Sbill char **dirv; 2451163Sbill int dirc; 2461163Sbill char *cp; 2471163Sbill { 2481163Sbill 2491163Sbill while (dirc > 0) 2501163Sbill findin(*dirv++, cp), dirc--; 2511163Sbill } 2521163Sbill 2531163Sbill find(dirs, cp) 2541163Sbill char **dirs; 2551163Sbill char *cp; 2561163Sbill { 2571163Sbill 2581163Sbill while (*dirs) 2591163Sbill findin(*dirs++, cp); 2601163Sbill } 2611163Sbill 2621163Sbill findin(dir, cp) 2631163Sbill char *dir, *cp; 2641163Sbill { 2656732Smckusick DIR *dirp; 2666732Smckusick struct direct *dp; 2671163Sbill 2686732Smckusick dirp = opendir(dir); 2696732Smckusick if (dirp == NULL) 2701163Sbill return; 2716732Smckusick while ((dp = readdir(dirp)) != NULL) { 2726732Smckusick if (itsit(cp, dp->d_name)) { 2731163Sbill count++; 2741163Sbill if (print) 275*10723Smckusick printf(" %s/%s", dir, dp->d_name); 2761163Sbill } 2771163Sbill } 2786732Smckusick closedir(dirp); 2791163Sbill } 2801163Sbill 2811163Sbill itsit(cp, dp) 2821163Sbill register char *cp, *dp; 2831163Sbill { 284*10723Smckusick register int i = strlen(dp); 2851163Sbill 2861163Sbill if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) 2871163Sbill return (1); 2881163Sbill while (*cp && *dp && *cp == *dp) 2891163Sbill cp++, dp++, i--; 2901163Sbill if (*cp == 0 && *dp == 0) 2911163Sbill return (1); 2921163Sbill while (isdigit(*dp)) 2931163Sbill dp++; 2941163Sbill if (*cp == 0 && *dp++ == '.') { 2951163Sbill --i; 2961163Sbill while (i > 0 && *dp) 2971163Sbill if (--i, *dp++ == '.') 2981163Sbill return (*dp++ == 'C' && *dp++ == 0); 2991163Sbill return (1); 3001163Sbill } 3011163Sbill return (0); 3021163Sbill } 303