xref: /csrg-svn/old/whereis/whereis.c (revision 6732)
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