113623Ssam #ifndef lint 2*16077Sralph static char *sccsid = "@(#)whereis.c 4.11 (Berkeley) 02/22/84"; 313623Ssam #endif 46206Sroot 56732Smckusick #include <sys/param.h> 613623Ssam #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", 34*16077Sralph "/usr/man/manl", 35*16077Sralph "/usr/man/mann", 36*16077Sralph "/usr/man/mano", 371163Sbill 0 381163Sbill }; 391163Sbill static char *srcdirs[] = { 406732Smckusick "/usr/src/bin", 416732Smckusick "/usr/src/usr.bin", 4210723Smckusick "/usr/src/etc", 4310723Smckusick "/usr/src/ucb", 441163Sbill "/usr/src/games", 4510723Smckusick "/usr/src/usr.lib", 466732Smckusick "/usr/src/lib", 4710723Smckusick "/usr/src/local", 4810723Smckusick "/usr/src/new", 4910723Smckusick "/usr/src/old", 5012201Ssam "/usr/src/include", 516732Smckusick "/usr/src/lib/libc/gen", 526732Smckusick "/usr/src/lib/libc/stdio", 536732Smckusick "/usr/src/lib/libc/sys", 5410723Smckusick "/usr/src/lib/libc/net/common", 5510723Smckusick "/usr/src/lib/libc/net/inet", 5610723Smckusick "/usr/src/lib/libc/net/misc", 5710723Smckusick "/usr/src/ucb/pascal", 5810723Smckusick "/usr/src/ucb/pascal/utilities", 592371Skre "/usr/src/undoc", 601163Sbill 0 611163Sbill }; 621163Sbill 631163Sbill char sflag = 1; 641163Sbill char bflag = 1; 651163Sbill char mflag = 1; 661163Sbill char **Sflag; 671163Sbill int Scnt; 681163Sbill char **Bflag; 691163Sbill int Bcnt; 701163Sbill char **Mflag; 711163Sbill int Mcnt; 721163Sbill char uflag; 731163Sbill /* 741163Sbill * whereis name 751163Sbill * look for source, documentation and binaries 761163Sbill */ 771163Sbill main(argc, argv) 781163Sbill int argc; 791163Sbill char *argv[]; 801163Sbill { 811163Sbill 821163Sbill argc--, argv++; 831163Sbill if (argc == 0) { 841163Sbill usage: 851163Sbill fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); 861163Sbill exit(1); 871163Sbill } 881163Sbill do 891163Sbill if (argv[0][0] == '-') { 901163Sbill register char *cp = argv[0] + 1; 911163Sbill while (*cp) switch (*cp++) { 921163Sbill 931163Sbill case 'f': 941163Sbill break; 951163Sbill 961163Sbill case 'S': 971163Sbill getlist(&argc, &argv, &Sflag, &Scnt); 981163Sbill break; 991163Sbill 1001163Sbill case 'B': 1011163Sbill getlist(&argc, &argv, &Bflag, &Bcnt); 1021163Sbill break; 1031163Sbill 1041163Sbill case 'M': 1051163Sbill getlist(&argc, &argv, &Mflag, &Mcnt); 1061163Sbill break; 1071163Sbill 1081163Sbill case 's': 1091163Sbill zerof(); 1101163Sbill sflag++; 1111163Sbill continue; 1121163Sbill 1131163Sbill case 'u': 1141163Sbill uflag++; 1151163Sbill continue; 1161163Sbill 1171163Sbill case 'b': 1181163Sbill zerof(); 1191163Sbill bflag++; 1201163Sbill continue; 1211163Sbill 1221163Sbill case 'm': 1231163Sbill zerof(); 1241163Sbill mflag++; 1251163Sbill continue; 1261163Sbill 1271163Sbill default: 1281163Sbill goto usage; 1291163Sbill } 1301163Sbill argv++; 1311163Sbill } else 1321163Sbill lookup(*argv++); 1331163Sbill while (--argc > 0); 1341163Sbill } 1351163Sbill 1361163Sbill getlist(argcp, argvp, flagp, cntp) 1371163Sbill char ***argvp; 1381163Sbill int *argcp; 1391163Sbill char ***flagp; 1401163Sbill int *cntp; 1411163Sbill { 1421163Sbill 1431163Sbill (*argvp)++; 1441163Sbill *flagp = *argvp; 1451163Sbill *cntp = 0; 1461163Sbill for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) 1471163Sbill (*cntp)++, (*argvp)++; 1481163Sbill (*argcp)++; 1491163Sbill (*argvp)--; 1501163Sbill } 1511163Sbill 1521163Sbill 1531163Sbill zerof() 1541163Sbill { 1551163Sbill 1561163Sbill if (sflag && bflag && mflag) 1571163Sbill sflag = bflag = mflag = 0; 1581163Sbill } 1591163Sbill int count; 1601163Sbill int print; 1611163Sbill 1621163Sbill 1631163Sbill lookup(cp) 1641163Sbill register char *cp; 1651163Sbill { 1661163Sbill register char *dp; 1671163Sbill 1681163Sbill for (dp = cp; *dp; dp++) 1691163Sbill continue; 1701163Sbill for (; dp > cp; dp--) { 1711163Sbill if (*dp == '.') { 1721163Sbill *dp = 0; 1731163Sbill break; 1741163Sbill } 1751163Sbill } 1761163Sbill for (dp = cp; *dp; dp++) 1771163Sbill if (*dp == '/') 1781163Sbill cp = dp + 1; 1791163Sbill if (uflag) { 1801163Sbill print = 0; 1811163Sbill count = 0; 1821163Sbill } else 1831163Sbill print = 1; 1841163Sbill again: 1851163Sbill if (print) 1861163Sbill printf("%s:", cp); 1871163Sbill if (sflag) { 1881163Sbill looksrc(cp); 1891163Sbill if (uflag && print == 0 && count != 1) { 1901163Sbill print = 1; 1911163Sbill goto again; 1921163Sbill } 1931163Sbill } 1941163Sbill count = 0; 1951163Sbill if (bflag) { 1961163Sbill lookbin(cp); 1971163Sbill if (uflag && print == 0 && count != 1) { 1981163Sbill print = 1; 1991163Sbill goto again; 2001163Sbill } 2011163Sbill } 2021163Sbill count = 0; 2031163Sbill if (mflag) { 2041163Sbill lookman(cp); 2051163Sbill if (uflag && print == 0 && count != 1) { 2061163Sbill print = 1; 2071163Sbill goto again; 2081163Sbill } 2091163Sbill } 2101163Sbill if (print) 2111163Sbill printf("\n"); 2121163Sbill } 2131163Sbill 2141163Sbill looksrc(cp) 2151163Sbill char *cp; 2161163Sbill { 2171163Sbill if (Sflag == 0) { 2181163Sbill find(srcdirs, cp); 2191163Sbill } else 2201163Sbill findv(Sflag, Scnt, cp); 2211163Sbill } 2221163Sbill 2231163Sbill lookbin(cp) 2241163Sbill char *cp; 2251163Sbill { 2261163Sbill if (Bflag == 0) 2271163Sbill find(bindirs, cp); 2281163Sbill else 2291163Sbill findv(Bflag, Bcnt, cp); 2301163Sbill } 2311163Sbill 2321163Sbill lookman(cp) 2331163Sbill char *cp; 2341163Sbill { 2351163Sbill if (Mflag == 0) { 2361163Sbill find(mandirs, cp); 2371163Sbill } else 2381163Sbill findv(Mflag, Mcnt, cp); 2391163Sbill } 2401163Sbill 2411163Sbill findv(dirv, dirc, cp) 2421163Sbill char **dirv; 2431163Sbill int dirc; 2441163Sbill char *cp; 2451163Sbill { 2461163Sbill 2471163Sbill while (dirc > 0) 2481163Sbill findin(*dirv++, cp), dirc--; 2491163Sbill } 2501163Sbill 2511163Sbill find(dirs, cp) 2521163Sbill char **dirs; 2531163Sbill char *cp; 2541163Sbill { 2551163Sbill 2561163Sbill while (*dirs) 2571163Sbill findin(*dirs++, cp); 2581163Sbill } 2591163Sbill 2601163Sbill findin(dir, cp) 2611163Sbill char *dir, *cp; 2621163Sbill { 2636732Smckusick DIR *dirp; 2646732Smckusick struct direct *dp; 2651163Sbill 2666732Smckusick dirp = opendir(dir); 2676732Smckusick if (dirp == NULL) 2681163Sbill return; 2696732Smckusick while ((dp = readdir(dirp)) != NULL) { 2706732Smckusick if (itsit(cp, dp->d_name)) { 2711163Sbill count++; 2721163Sbill if (print) 27310723Smckusick printf(" %s/%s", dir, dp->d_name); 2741163Sbill } 2751163Sbill } 2766732Smckusick closedir(dirp); 2771163Sbill } 2781163Sbill 2791163Sbill itsit(cp, dp) 2801163Sbill register char *cp, *dp; 2811163Sbill { 28210723Smckusick register int i = strlen(dp); 2831163Sbill 2841163Sbill if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) 2851163Sbill return (1); 2861163Sbill while (*cp && *dp && *cp == *dp) 2871163Sbill cp++, dp++, i--; 2881163Sbill if (*cp == 0 && *dp == 0) 2891163Sbill return (1); 2901163Sbill while (isdigit(*dp)) 2911163Sbill dp++; 2921163Sbill if (*cp == 0 && *dp++ == '.') { 2931163Sbill --i; 2941163Sbill while (i > 0 && *dp) 2951163Sbill if (--i, *dp++ == '.') 2961163Sbill return (*dp++ == 'C' && *dp++ == 0); 2971163Sbill return (1); 2981163Sbill } 2991163Sbill return (0); 3001163Sbill } 301