xref: /csrg-svn/old/whereis/whereis.c (revision 2371)
1*2371Skre static char *sccsid = "@(#)whereis.c	4.3 (Berkeley) 02/07/81";
21163Sbill #include <sys/types.h>
31163Sbill #include <stdio.h>
41163Sbill #include <ctype.h>
51163Sbill #include <sys/dir.h>
61163Sbill #include <whoami.h>
71163Sbill 
81163Sbill static char *bindirs[] = {
91163Sbill 	"/etc",
101163Sbill 	"/bin",
111163Sbill 	"/usr/bin",
121163Sbill 	"/usr/games",
13*2371Skre #ifdef CSVAX
14*2371Skre 	"/lib",
15*2371Skre 	"/usr/ucb",
16*2371Skre 	"/usr/lib",
17*2371Skre 	"/usr/local",
18*2371Skre 	"/usr/new",
19*2371Skre 	"/usr/old",
20*2371Skre #endif
211866Seric #ifdef CORY
221866Seric 	"/usr/bin/eecs",
231866Seric 	"/usr/bin/new",
241866Seric 	"/usr/bin/v7",
251866Seric 	"/usr/bin/old",
261866Seric 	"/usr/bin/UNSUPPORTED",
27*2371Skre #endif
28*2371Skre #ifdef ARPAVAX
291163Sbill 	"/lib",
301163Sbill 	"/usr/ucb",
311163Sbill 	"/usr/lib",
321163Sbill 	"/usr/local",
331163Sbill 	"/usr/new",
341163Sbill 	"/usr/old",
351163Sbill #endif
361163Sbill 	0
371163Sbill };
381163Sbill static char *mandirs[] = {
391163Sbill 	"/usr/man/man1",
401163Sbill 	"/usr/man/man2",
411163Sbill 	"/usr/man/man3",
421163Sbill 	"/usr/man/man4",
431163Sbill 	"/usr/man/man5",
441163Sbill 	"/usr/man/man6",
451163Sbill 	"/usr/man/man7",
461163Sbill 	"/usr/man/man8",
471163Sbill #ifdef CORY
481163Sbill 	"/usr/man/manu",
491163Sbill 	"/usr/man/manc",
501163Sbill 	"/usr/man/manv7",
511163Sbill 	"/usr/bin/eecs/mane",
521163Sbill #endif
531163Sbill 	0
541163Sbill };
551163Sbill static char *srcdirs[]  = {
561163Sbill 	"/usr/src/cmd",
571163Sbill 	"/usr/src/games",
581163Sbill 	"/usr/src/libc/gen",
591163Sbill 	"/usr/src/libc/stdio",
60*2371Skre #ifdef CSVAX
61*2371Skre 	"/usr/src/libc/sys",
62*2371Skre 	"/usr/src/new",
63*2371Skre 	"/usr/src/old",
64*2371Skre 	"/usr/src/local",
65*2371Skre 	"/usr/src/undoc",
66*2371Skre #endif
671163Sbill #ifdef CORY
681163Sbill 	"/usr/bin/eecs/src",
691163Sbill 	"/usr/src/cmd/v7",
701163Sbill 	"/usr/src/cmd/new",
711163Sbill 	"/usr/src/cmd/old",
721163Sbill 	"/usr/src/cmd/UNSUPPORTED",
731163Sbill #endif
74*2371Skre #ifdef	ARPAVAX
75*2371Skre 	"/ra/src/cmd",
76*2371Skre 	"/ra/src/new",
77*2371Skre 	"/ra/src/old",
78*2371Skre 	"/ra/src/libc/gen",
79*2371Skre 	"/ra/src/libc/stdio",
80*2371Skre #endif
811163Sbill 	0
821163Sbill };
831163Sbill 
841163Sbill char	sflag = 1;
851163Sbill char	bflag = 1;
861163Sbill char	mflag = 1;
871163Sbill char	**Sflag;
881163Sbill int	Scnt;
891163Sbill char	**Bflag;
901163Sbill int	Bcnt;
911163Sbill char	**Mflag;
921163Sbill int	Mcnt;
931163Sbill char	uflag;
941163Sbill /*
951163Sbill  * whereis name
961163Sbill  * look for source, documentation and binaries
971163Sbill  */
981163Sbill main(argc, argv)
991163Sbill 	int argc;
1001163Sbill 	char *argv[];
1011163Sbill {
1021163Sbill 
1031163Sbill #ifdef CORY
1041163Sbill 	if (getuid() == 0)
1051163Sbill 		nice(-20);
1061163Sbill 	if (((getuid() >> 8) & 0377) > 10)
1071163Sbill 		setuid(getuid());
1081163Sbill #endif
1091163Sbill 	argc--, argv++;
1101163Sbill 	if (argc == 0) {
1111163Sbill usage:
1121163Sbill 		fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n");
1131163Sbill 		exit(1);
1141163Sbill 	}
1151163Sbill 	do
1161163Sbill 		if (argv[0][0] == '-') {
1171163Sbill 			register char *cp = argv[0] + 1;
1181163Sbill 			while (*cp) switch (*cp++) {
1191163Sbill 
1201163Sbill 			case 'f':
1211163Sbill 				break;
1221163Sbill 
1231163Sbill 			case 'S':
1241163Sbill 				getlist(&argc, &argv, &Sflag, &Scnt);
1251163Sbill 				break;
1261163Sbill 
1271163Sbill 			case 'B':
1281163Sbill 				getlist(&argc, &argv, &Bflag, &Bcnt);
1291163Sbill 				break;
1301163Sbill 
1311163Sbill 			case 'M':
1321163Sbill 				getlist(&argc, &argv, &Mflag, &Mcnt);
1331163Sbill 				break;
1341163Sbill 
1351163Sbill 			case 's':
1361163Sbill 				zerof();
1371163Sbill 				sflag++;
1381163Sbill 				continue;
1391163Sbill 
1401163Sbill 			case 'u':
1411163Sbill 				uflag++;
1421163Sbill 				continue;
1431163Sbill 
1441163Sbill 			case 'b':
1451163Sbill 				zerof();
1461163Sbill 				bflag++;
1471163Sbill 				continue;
1481163Sbill 
1491163Sbill 			case 'm':
1501163Sbill 				zerof();
1511163Sbill 				mflag++;
1521163Sbill 				continue;
1531163Sbill 
1541163Sbill 			default:
1551163Sbill 				goto usage;
1561163Sbill 			}
1571163Sbill 			argv++;
1581163Sbill 		} else
1591163Sbill 			lookup(*argv++);
1601163Sbill 	while (--argc > 0);
1611163Sbill }
1621163Sbill 
1631163Sbill getlist(argcp, argvp, flagp, cntp)
1641163Sbill 	char ***argvp;
1651163Sbill 	int *argcp;
1661163Sbill 	char ***flagp;
1671163Sbill 	int *cntp;
1681163Sbill {
1691163Sbill 
1701163Sbill 	(*argvp)++;
1711163Sbill 	*flagp = *argvp;
1721163Sbill 	*cntp = 0;
1731163Sbill 	for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--)
1741163Sbill 		(*cntp)++, (*argvp)++;
1751163Sbill 	(*argcp)++;
1761163Sbill 	(*argvp)--;
1771163Sbill }
1781163Sbill 
1791163Sbill 
1801163Sbill zerof()
1811163Sbill {
1821163Sbill 
1831163Sbill 	if (sflag && bflag && mflag)
1841163Sbill 		sflag = bflag = mflag = 0;
1851163Sbill }
1861163Sbill int	count;
1871163Sbill int	print;
1881163Sbill 
1891163Sbill 
1901163Sbill lookup(cp)
1911163Sbill 	register char *cp;
1921163Sbill {
1931163Sbill 	register char *dp;
1941163Sbill 
1951163Sbill 	for (dp = cp; *dp; dp++)
1961163Sbill 		continue;
1971163Sbill 	for (; dp > cp; dp--) {
1981163Sbill 		if (*dp == '.') {
1991163Sbill 			*dp = 0;
2001163Sbill 			break;
2011163Sbill 		}
2021163Sbill 	}
2031163Sbill 	for (dp = cp; *dp; dp++)
2041163Sbill 		if (*dp == '/')
2051163Sbill 			cp = dp + 1;
2061163Sbill 	if (uflag) {
2071163Sbill 		print = 0;
2081163Sbill 		count = 0;
2091163Sbill 	} else
2101163Sbill 		print = 1;
2111163Sbill again:
2121163Sbill 	if (print)
2131163Sbill 		printf("%s:", cp);
2141163Sbill 	if (sflag) {
2151163Sbill 		looksrc(cp);
2161163Sbill 		if (uflag && print == 0 && count != 1) {
2171163Sbill 			print = 1;
2181163Sbill 			goto again;
2191163Sbill 		}
2201163Sbill 	}
2211163Sbill 	count = 0;
2221163Sbill 	if (bflag) {
2231163Sbill 		lookbin(cp);
2241163Sbill 		if (uflag && print == 0 && count != 1) {
2251163Sbill 			print = 1;
2261163Sbill 			goto again;
2271163Sbill 		}
2281163Sbill 	}
2291163Sbill 	count = 0;
2301163Sbill 	if (mflag) {
2311163Sbill 		lookman(cp);
2321163Sbill 		if (uflag && print == 0 && count != 1) {
2331163Sbill 			print = 1;
2341163Sbill 			goto again;
2351163Sbill 		}
2361163Sbill 	}
2371163Sbill 	if (print)
2381163Sbill 		printf("\n");
2391163Sbill }
2401163Sbill 
2411163Sbill looksrc(cp)
2421163Sbill 	char *cp;
2431163Sbill {
2441163Sbill 	if (Sflag == 0) {
2451163Sbill 		find(srcdirs, cp);
2461163Sbill 	} else
2471163Sbill 		findv(Sflag, Scnt, cp);
2481163Sbill }
2491163Sbill 
2501163Sbill lookbin(cp)
2511163Sbill 	char *cp;
2521163Sbill {
2531163Sbill 	if (Bflag == 0)
2541163Sbill 		find(bindirs, cp);
2551163Sbill 	else
2561163Sbill 		findv(Bflag, Bcnt, cp);
2571163Sbill }
2581163Sbill 
2591163Sbill lookman(cp)
2601163Sbill 	char *cp;
2611163Sbill {
2621163Sbill 	if (Mflag == 0) {
2631163Sbill 		find(mandirs, cp);
2641163Sbill 	} else
2651163Sbill 		findv(Mflag, Mcnt, cp);
2661163Sbill }
2671163Sbill 
2681163Sbill findv(dirv, dirc, cp)
2691163Sbill 	char **dirv;
2701163Sbill 	int dirc;
2711163Sbill 	char *cp;
2721163Sbill {
2731163Sbill 
2741163Sbill 	while (dirc > 0)
2751163Sbill 		findin(*dirv++, cp), dirc--;
2761163Sbill }
2771163Sbill 
2781163Sbill find(dirs, cp)
2791163Sbill 	char **dirs;
2801163Sbill 	char *cp;
2811163Sbill {
2821163Sbill 
2831163Sbill 	while (*dirs)
2841163Sbill 		findin(*dirs++, cp);
2851163Sbill }
2861163Sbill 
2871163Sbill findin(dir, cp)
2881163Sbill 	char *dir, *cp;
2891163Sbill {
2901163Sbill 	register FILE *d;
2911163Sbill 	struct direct direct;
2921163Sbill 
2931163Sbill 	d = fopen(dir, "r");
2941163Sbill 	if (d == NULL)
2951163Sbill 		return;
2961163Sbill 	while (fread(&direct, sizeof direct, 1, d) == 1) {
2971163Sbill 		if (direct.d_ino == 0)
2981163Sbill 			continue;
2991163Sbill 		if (itsit(cp, direct.d_name)) {
3001163Sbill 			count++;
3011163Sbill 			if (print)
3021163Sbill 				printf(" %s/%.14s", dir, direct.d_name);
3031163Sbill 		}
3041163Sbill 	}
3051163Sbill 	fclose(d);
3061163Sbill }
3071163Sbill 
3081163Sbill itsit(cp, dp)
3091163Sbill 	register char *cp, *dp;
3101163Sbill {
3111163Sbill 	register int i = 14;
3121163Sbill 
3131163Sbill 	if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
3141163Sbill 		return (1);
3151163Sbill 	while (*cp && *dp && *cp == *dp)
3161163Sbill 		cp++, dp++, i--;
3171163Sbill 	if (*cp == 0 && *dp == 0)
3181163Sbill 		return (1);
3191163Sbill 	while (isdigit(*dp))
3201163Sbill 		dp++;
3211163Sbill 	if (*cp == 0 && *dp++ == '.') {
3221163Sbill 		--i;
3231163Sbill 		while (i > 0 && *dp)
3241163Sbill 			if (--i, *dp++ == '.')
3251163Sbill 				return (*dp++ == 'C' && *dp++ == 0);
3261163Sbill 		return (1);
3271163Sbill 	}
3281163Sbill 	return (0);
3291163Sbill }
330