1*13623Ssam #ifndef lint 2*13623Ssam static char *sccsid = "@(#)whereis.c 4.10 (Berkeley) 07/02/83"; 3*13623Ssam #endif 46206Sroot 56732Smckusick #include <sys/param.h> 6*13623Ssam #include <sys/dir.h> 71163Sbill #include <stdio.h> 81163Sbill #include <ctype.h> 91163Sbill 101163Sbill static char *bindirs[] = { 111163Sbill "/etc", 121163Sbill "/bin", 131163Sbill "/usr/bin", 141163Sbill "/usr/games", 152371Skre "/lib", 162371Skre "/usr/ucb", 172371Skre "/usr/lib", 182371Skre "/usr/local", 192371Skre "/usr/new", 202371Skre "/usr/old", 216732Smckusick "/usr/hosts", 2212201Ssam "/usr/include", 231163Sbill 0 241163Sbill }; 251163Sbill static char *mandirs[] = { 261163Sbill "/usr/man/man1", 271163Sbill "/usr/man/man2", 281163Sbill "/usr/man/man3", 291163Sbill "/usr/man/man4", 301163Sbill "/usr/man/man5", 311163Sbill "/usr/man/man6", 321163Sbill "/usr/man/man7", 331163Sbill "/usr/man/man8", 341163Sbill 0 351163Sbill }; 361163Sbill static char *srcdirs[] = { 376732Smckusick "/usr/src/bin", 386732Smckusick "/usr/src/usr.bin", 3910723Smckusick "/usr/src/etc", 4010723Smckusick "/usr/src/ucb", 411163Sbill "/usr/src/games", 4210723Smckusick "/usr/src/usr.lib", 436732Smckusick "/usr/src/lib", 4410723Smckusick "/usr/src/local", 4510723Smckusick "/usr/src/new", 4610723Smckusick "/usr/src/old", 4712201Ssam "/usr/src/include", 486732Smckusick "/usr/src/lib/libc/gen", 496732Smckusick "/usr/src/lib/libc/stdio", 506732Smckusick "/usr/src/lib/libc/sys", 5110723Smckusick "/usr/src/lib/libc/net/common", 5210723Smckusick "/usr/src/lib/libc/net/inet", 5310723Smckusick "/usr/src/lib/libc/net/misc", 5410723Smckusick "/usr/src/ucb/pascal", 5510723Smckusick "/usr/src/ucb/pascal/utilities", 562371Skre "/usr/src/undoc", 571163Sbill 0 581163Sbill }; 591163Sbill 601163Sbill char sflag = 1; 611163Sbill char bflag = 1; 621163Sbill char mflag = 1; 631163Sbill char **Sflag; 641163Sbill int Scnt; 651163Sbill char **Bflag; 661163Sbill int Bcnt; 671163Sbill char **Mflag; 681163Sbill int Mcnt; 691163Sbill char uflag; 701163Sbill /* 711163Sbill * whereis name 721163Sbill * look for source, documentation and binaries 731163Sbill */ 741163Sbill main(argc, argv) 751163Sbill int argc; 761163Sbill char *argv[]; 771163Sbill { 781163Sbill 791163Sbill argc--, argv++; 801163Sbill if (argc == 0) { 811163Sbill usage: 821163Sbill fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); 831163Sbill exit(1); 841163Sbill } 851163Sbill do 861163Sbill if (argv[0][0] == '-') { 871163Sbill register char *cp = argv[0] + 1; 881163Sbill while (*cp) switch (*cp++) { 891163Sbill 901163Sbill case 'f': 911163Sbill break; 921163Sbill 931163Sbill case 'S': 941163Sbill getlist(&argc, &argv, &Sflag, &Scnt); 951163Sbill break; 961163Sbill 971163Sbill case 'B': 981163Sbill getlist(&argc, &argv, &Bflag, &Bcnt); 991163Sbill break; 1001163Sbill 1011163Sbill case 'M': 1021163Sbill getlist(&argc, &argv, &Mflag, &Mcnt); 1031163Sbill break; 1041163Sbill 1051163Sbill case 's': 1061163Sbill zerof(); 1071163Sbill sflag++; 1081163Sbill continue; 1091163Sbill 1101163Sbill case 'u': 1111163Sbill uflag++; 1121163Sbill continue; 1131163Sbill 1141163Sbill case 'b': 1151163Sbill zerof(); 1161163Sbill bflag++; 1171163Sbill continue; 1181163Sbill 1191163Sbill case 'm': 1201163Sbill zerof(); 1211163Sbill mflag++; 1221163Sbill continue; 1231163Sbill 1241163Sbill default: 1251163Sbill goto usage; 1261163Sbill } 1271163Sbill argv++; 1281163Sbill } else 1291163Sbill lookup(*argv++); 1301163Sbill while (--argc > 0); 1311163Sbill } 1321163Sbill 1331163Sbill getlist(argcp, argvp, flagp, cntp) 1341163Sbill char ***argvp; 1351163Sbill int *argcp; 1361163Sbill char ***flagp; 1371163Sbill int *cntp; 1381163Sbill { 1391163Sbill 1401163Sbill (*argvp)++; 1411163Sbill *flagp = *argvp; 1421163Sbill *cntp = 0; 1431163Sbill for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) 1441163Sbill (*cntp)++, (*argvp)++; 1451163Sbill (*argcp)++; 1461163Sbill (*argvp)--; 1471163Sbill } 1481163Sbill 1491163Sbill 1501163Sbill zerof() 1511163Sbill { 1521163Sbill 1531163Sbill if (sflag && bflag && mflag) 1541163Sbill sflag = bflag = mflag = 0; 1551163Sbill } 1561163Sbill int count; 1571163Sbill int print; 1581163Sbill 1591163Sbill 1601163Sbill lookup(cp) 1611163Sbill register char *cp; 1621163Sbill { 1631163Sbill register char *dp; 1641163Sbill 1651163Sbill for (dp = cp; *dp; dp++) 1661163Sbill continue; 1671163Sbill for (; dp > cp; dp--) { 1681163Sbill if (*dp == '.') { 1691163Sbill *dp = 0; 1701163Sbill break; 1711163Sbill } 1721163Sbill } 1731163Sbill for (dp = cp; *dp; dp++) 1741163Sbill if (*dp == '/') 1751163Sbill cp = dp + 1; 1761163Sbill if (uflag) { 1771163Sbill print = 0; 1781163Sbill count = 0; 1791163Sbill } else 1801163Sbill print = 1; 1811163Sbill again: 1821163Sbill if (print) 1831163Sbill printf("%s:", cp); 1841163Sbill if (sflag) { 1851163Sbill looksrc(cp); 1861163Sbill if (uflag && print == 0 && count != 1) { 1871163Sbill print = 1; 1881163Sbill goto again; 1891163Sbill } 1901163Sbill } 1911163Sbill count = 0; 1921163Sbill if (bflag) { 1931163Sbill lookbin(cp); 1941163Sbill if (uflag && print == 0 && count != 1) { 1951163Sbill print = 1; 1961163Sbill goto again; 1971163Sbill } 1981163Sbill } 1991163Sbill count = 0; 2001163Sbill if (mflag) { 2011163Sbill lookman(cp); 2021163Sbill if (uflag && print == 0 && count != 1) { 2031163Sbill print = 1; 2041163Sbill goto again; 2051163Sbill } 2061163Sbill } 2071163Sbill if (print) 2081163Sbill printf("\n"); 2091163Sbill } 2101163Sbill 2111163Sbill looksrc(cp) 2121163Sbill char *cp; 2131163Sbill { 2141163Sbill if (Sflag == 0) { 2151163Sbill find(srcdirs, cp); 2161163Sbill } else 2171163Sbill findv(Sflag, Scnt, cp); 2181163Sbill } 2191163Sbill 2201163Sbill lookbin(cp) 2211163Sbill char *cp; 2221163Sbill { 2231163Sbill if (Bflag == 0) 2241163Sbill find(bindirs, cp); 2251163Sbill else 2261163Sbill findv(Bflag, Bcnt, cp); 2271163Sbill } 2281163Sbill 2291163Sbill lookman(cp) 2301163Sbill char *cp; 2311163Sbill { 2321163Sbill if (Mflag == 0) { 2331163Sbill find(mandirs, cp); 2341163Sbill } else 2351163Sbill findv(Mflag, Mcnt, cp); 2361163Sbill } 2371163Sbill 2381163Sbill findv(dirv, dirc, cp) 2391163Sbill char **dirv; 2401163Sbill int dirc; 2411163Sbill char *cp; 2421163Sbill { 2431163Sbill 2441163Sbill while (dirc > 0) 2451163Sbill findin(*dirv++, cp), dirc--; 2461163Sbill } 2471163Sbill 2481163Sbill find(dirs, cp) 2491163Sbill char **dirs; 2501163Sbill char *cp; 2511163Sbill { 2521163Sbill 2531163Sbill while (*dirs) 2541163Sbill findin(*dirs++, cp); 2551163Sbill } 2561163Sbill 2571163Sbill findin(dir, cp) 2581163Sbill char *dir, *cp; 2591163Sbill { 2606732Smckusick DIR *dirp; 2616732Smckusick struct direct *dp; 2621163Sbill 2636732Smckusick dirp = opendir(dir); 2646732Smckusick if (dirp == NULL) 2651163Sbill return; 2666732Smckusick while ((dp = readdir(dirp)) != NULL) { 2676732Smckusick if (itsit(cp, dp->d_name)) { 2681163Sbill count++; 2691163Sbill if (print) 27010723Smckusick printf(" %s/%s", dir, dp->d_name); 2711163Sbill } 2721163Sbill } 2736732Smckusick closedir(dirp); 2741163Sbill } 2751163Sbill 2761163Sbill itsit(cp, dp) 2771163Sbill register char *cp, *dp; 2781163Sbill { 27910723Smckusick register int i = strlen(dp); 2801163Sbill 2811163Sbill if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) 2821163Sbill return (1); 2831163Sbill while (*cp && *dp && *cp == *dp) 2841163Sbill cp++, dp++, i--; 2851163Sbill if (*cp == 0 && *dp == 0) 2861163Sbill return (1); 2871163Sbill while (isdigit(*dp)) 2881163Sbill dp++; 2891163Sbill if (*cp == 0 && *dp++ == '.') { 2901163Sbill --i; 2911163Sbill while (i > 0 && *dp) 2921163Sbill if (--i, *dp++ == '.') 2931163Sbill return (*dp++ == 'C' && *dp++ == 0); 2941163Sbill return (1); 2951163Sbill } 2961163Sbill return (0); 2971163Sbill } 298