xref: /csrg-svn/old/whereis/whereis.c (revision 48331)
1*48331Sbostic /*-
2*48331Sbostic  * Copyright (c) 1980 The Regents of the University of California.
340378Sbostic  * All rights reserved.
440378Sbostic  *
5*48331Sbostic  * %sccs.include.redist.c%
621590Sdist  */
721590Sdist 
813623Ssam #ifndef lint
921590Sdist char copyright[] =
10*48331Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
1121590Sdist  All rights reserved.\n";
1232752Sbostic #endif /* not lint */
136206Sroot 
1421590Sdist #ifndef lint
15*48331Sbostic static char sccsid[] = "@(#)whereis.c	5.5 (Berkeley) 04/18/91";
1632752Sbostic #endif /* not lint */
1721590Sdist 
186732Smckusick #include <sys/param.h>
1913623Ssam #include <sys/dir.h>
201163Sbill #include <stdio.h>
211163Sbill #include <ctype.h>
221163Sbill 
231163Sbill static char *bindirs[] = {
2444591Smarc 	"/bin",
2544591Smarc 	"/sbin",
2644591Smarc 	"/usr/ucb",
2744591Smarc 	"/usr/bin",
2844591Smarc 	"/usr/sbin",
2944591Smarc 	"/usr/old",
3044591Smarc 	"/usr/contrib",
3144591Smarc 	"/usr/games",
3244591Smarc 	"/usr/local",
3344591Smarc 	"/usr/libexec",
3444591Smarc 	"/usr/include",
3544591Smarc 	"/usr/hosts",
3644591Smarc 	"/usr/share", /*?*/
371163Sbill 	"/etc",
3844591Smarc #ifdef notdef
3944591Smarc 	/* before reorg */
4044591Smarc 	"/etc",
411163Sbill 	"/bin",
421163Sbill 	"/usr/bin",
431163Sbill 	"/usr/games",
442371Skre 	"/lib",
452371Skre 	"/usr/ucb",
462371Skre 	"/usr/lib",
472371Skre 	"/usr/local",
482371Skre 	"/usr/new",
492371Skre 	"/usr/old",
506732Smckusick 	"/usr/hosts",
5112201Ssam 	"/usr/include",
5244591Smarc #endif
531163Sbill 	0
541163Sbill };
5544591Smarc /* This needs to be redone - man pages live with sources */
561163Sbill static char *mandirs[] = {
571163Sbill 	"/usr/man/man1",
581163Sbill 	"/usr/man/man2",
591163Sbill 	"/usr/man/man3",
601163Sbill 	"/usr/man/man4",
611163Sbill 	"/usr/man/man5",
621163Sbill 	"/usr/man/man6",
631163Sbill 	"/usr/man/man7",
641163Sbill 	"/usr/man/man8",
6516077Sralph 	"/usr/man/manl",
6616077Sralph 	"/usr/man/mann",
6716077Sralph 	"/usr/man/mano",
681163Sbill 	0
691163Sbill };
701163Sbill static char *srcdirs[]  = {
716732Smckusick 	"/usr/src/bin",
7244591Smarc 	"/usr/src/sbin",
7344591Smarc 	"/usr/src/etc",
7444591Smarc 	"/usr/src/pgrm",
756732Smckusick 	"/usr/src/usr.bin",
7644591Smarc 	"/usr/src/usr.sbin",
7744591Smarc 	"/usr/src/usr.ucb",
7844591Smarc 	"/usr/src/usr.new",
7944591Smarc 	"/usr/src/usr.lib",
8044591Smarc 	"/usr/src/libexec",
8144591Smarc 	"/usr/src/libdata",
8244591Smarc 	"/usr/src/share",
8344591Smarc 	"/usr/src/contrib",
8444591Smarc 	"/usr/src/athena",
8544591Smarc 	"/usr/src/devel",
8644591Smarc 	"/usr/src/games",
8744591Smarc 	"/usr/src/local",
8844591Smarc 	"/usr/src/man",
8944591Smarc 	"/usr/src/root",
9044591Smarc 	"/usr/src/old",
9144591Smarc 	"/usr/src/include",
9244591Smarc 	/* still need libs */
9344591Smarc #ifdef notdef /* before reorg */
9444591Smarc 	"/usr/src/bin",
9544591Smarc 	"/usr/src/usr.bin",
9610723Smckusick 	"/usr/src/etc",
9710723Smckusick 	"/usr/src/ucb",
981163Sbill 	"/usr/src/games",
9910723Smckusick 	"/usr/src/usr.lib",
1006732Smckusick 	"/usr/src/lib",
10110723Smckusick 	"/usr/src/local",
10210723Smckusick 	"/usr/src/new",
10310723Smckusick 	"/usr/src/old",
10412201Ssam 	"/usr/src/include",
1056732Smckusick 	"/usr/src/lib/libc/gen",
1066732Smckusick 	"/usr/src/lib/libc/stdio",
1076732Smckusick 	"/usr/src/lib/libc/sys",
10810723Smckusick 	"/usr/src/lib/libc/net/common",
10910723Smckusick 	"/usr/src/lib/libc/net/inet",
11010723Smckusick 	"/usr/src/lib/libc/net/misc",
11110723Smckusick 	"/usr/src/ucb/pascal",
11210723Smckusick 	"/usr/src/ucb/pascal/utilities",
1132371Skre 	"/usr/src/undoc",
11444591Smarc #endif
1151163Sbill 	0
1161163Sbill };
1171163Sbill 
1181163Sbill char	sflag = 1;
1191163Sbill char	bflag = 1;
1201163Sbill char	mflag = 1;
1211163Sbill char	**Sflag;
1221163Sbill int	Scnt;
1231163Sbill char	**Bflag;
1241163Sbill int	Bcnt;
1251163Sbill char	**Mflag;
1261163Sbill int	Mcnt;
1271163Sbill char	uflag;
1281163Sbill /*
1291163Sbill  * whereis name
1301163Sbill  * look for source, documentation and binaries
1311163Sbill  */
main(argc,argv)1321163Sbill main(argc, argv)
1331163Sbill 	int argc;
1341163Sbill 	char *argv[];
1351163Sbill {
1361163Sbill 
1371163Sbill 	argc--, argv++;
1381163Sbill 	if (argc == 0) {
1391163Sbill usage:
1401163Sbill 		fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n");
1411163Sbill 		exit(1);
1421163Sbill 	}
1431163Sbill 	do
1441163Sbill 		if (argv[0][0] == '-') {
1451163Sbill 			register char *cp = argv[0] + 1;
1461163Sbill 			while (*cp) switch (*cp++) {
1471163Sbill 
1481163Sbill 			case 'f':
1491163Sbill 				break;
1501163Sbill 
1511163Sbill 			case 'S':
1521163Sbill 				getlist(&argc, &argv, &Sflag, &Scnt);
1531163Sbill 				break;
1541163Sbill 
1551163Sbill 			case 'B':
1561163Sbill 				getlist(&argc, &argv, &Bflag, &Bcnt);
1571163Sbill 				break;
1581163Sbill 
1591163Sbill 			case 'M':
1601163Sbill 				getlist(&argc, &argv, &Mflag, &Mcnt);
1611163Sbill 				break;
1621163Sbill 
1631163Sbill 			case 's':
1641163Sbill 				zerof();
1651163Sbill 				sflag++;
1661163Sbill 				continue;
1671163Sbill 
1681163Sbill 			case 'u':
1691163Sbill 				uflag++;
1701163Sbill 				continue;
1711163Sbill 
1721163Sbill 			case 'b':
1731163Sbill 				zerof();
1741163Sbill 				bflag++;
1751163Sbill 				continue;
1761163Sbill 
1771163Sbill 			case 'm':
1781163Sbill 				zerof();
1791163Sbill 				mflag++;
1801163Sbill 				continue;
1811163Sbill 
1821163Sbill 			default:
1831163Sbill 				goto usage;
1841163Sbill 			}
1851163Sbill 			argv++;
1861163Sbill 		} else
1871163Sbill 			lookup(*argv++);
1881163Sbill 	while (--argc > 0);
18932752Sbostic 	exit(0);
1901163Sbill }
1911163Sbill 
getlist(argcp,argvp,flagp,cntp)1921163Sbill getlist(argcp, argvp, flagp, cntp)
1931163Sbill 	char ***argvp;
1941163Sbill 	int *argcp;
1951163Sbill 	char ***flagp;
1961163Sbill 	int *cntp;
1971163Sbill {
1981163Sbill 
1991163Sbill 	(*argvp)++;
2001163Sbill 	*flagp = *argvp;
2011163Sbill 	*cntp = 0;
2021163Sbill 	for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--)
2031163Sbill 		(*cntp)++, (*argvp)++;
2041163Sbill 	(*argcp)++;
2051163Sbill 	(*argvp)--;
2061163Sbill }
2071163Sbill 
2081163Sbill 
zerof()2091163Sbill zerof()
2101163Sbill {
2111163Sbill 
2121163Sbill 	if (sflag && bflag && mflag)
2131163Sbill 		sflag = bflag = mflag = 0;
2141163Sbill }
2151163Sbill int	count;
2161163Sbill int	print;
2171163Sbill 
2181163Sbill 
lookup(cp)2191163Sbill lookup(cp)
2201163Sbill 	register char *cp;
2211163Sbill {
2221163Sbill 	register char *dp;
2231163Sbill 
2241163Sbill 	for (dp = cp; *dp; dp++)
2251163Sbill 		continue;
2261163Sbill 	for (; dp > cp; dp--) {
2271163Sbill 		if (*dp == '.') {
2281163Sbill 			*dp = 0;
2291163Sbill 			break;
2301163Sbill 		}
2311163Sbill 	}
2321163Sbill 	for (dp = cp; *dp; dp++)
2331163Sbill 		if (*dp == '/')
2341163Sbill 			cp = dp + 1;
2351163Sbill 	if (uflag) {
2361163Sbill 		print = 0;
2371163Sbill 		count = 0;
2381163Sbill 	} else
2391163Sbill 		print = 1;
2401163Sbill again:
2411163Sbill 	if (print)
2421163Sbill 		printf("%s:", cp);
2431163Sbill 	if (sflag) {
2441163Sbill 		looksrc(cp);
2451163Sbill 		if (uflag && print == 0 && count != 1) {
2461163Sbill 			print = 1;
2471163Sbill 			goto again;
2481163Sbill 		}
2491163Sbill 	}
2501163Sbill 	count = 0;
2511163Sbill 	if (bflag) {
2521163Sbill 		lookbin(cp);
2531163Sbill 		if (uflag && print == 0 && count != 1) {
2541163Sbill 			print = 1;
2551163Sbill 			goto again;
2561163Sbill 		}
2571163Sbill 	}
2581163Sbill 	count = 0;
2591163Sbill 	if (mflag) {
2601163Sbill 		lookman(cp);
2611163Sbill 		if (uflag && print == 0 && count != 1) {
2621163Sbill 			print = 1;
2631163Sbill 			goto again;
2641163Sbill 		}
2651163Sbill 	}
2661163Sbill 	if (print)
2671163Sbill 		printf("\n");
2681163Sbill }
2691163Sbill 
looksrc(cp)2701163Sbill looksrc(cp)
2711163Sbill 	char *cp;
2721163Sbill {
2731163Sbill 	if (Sflag == 0) {
2741163Sbill 		find(srcdirs, cp);
2751163Sbill 	} else
2761163Sbill 		findv(Sflag, Scnt, cp);
2771163Sbill }
2781163Sbill 
lookbin(cp)2791163Sbill lookbin(cp)
2801163Sbill 	char *cp;
2811163Sbill {
2821163Sbill 	if (Bflag == 0)
2831163Sbill 		find(bindirs, cp);
2841163Sbill 	else
2851163Sbill 		findv(Bflag, Bcnt, cp);
2861163Sbill }
2871163Sbill 
lookman(cp)2881163Sbill lookman(cp)
2891163Sbill 	char *cp;
2901163Sbill {
2911163Sbill 	if (Mflag == 0) {
2921163Sbill 		find(mandirs, cp);
2931163Sbill 	} else
2941163Sbill 		findv(Mflag, Mcnt, cp);
2951163Sbill }
2961163Sbill 
findv(dirv,dirc,cp)2971163Sbill findv(dirv, dirc, cp)
2981163Sbill 	char **dirv;
2991163Sbill 	int dirc;
3001163Sbill 	char *cp;
3011163Sbill {
3021163Sbill 
3031163Sbill 	while (dirc > 0)
3041163Sbill 		findin(*dirv++, cp), dirc--;
3051163Sbill }
3061163Sbill 
find(dirs,cp)3071163Sbill find(dirs, cp)
3081163Sbill 	char **dirs;
3091163Sbill 	char *cp;
3101163Sbill {
3111163Sbill 
3121163Sbill 	while (*dirs)
3131163Sbill 		findin(*dirs++, cp);
3141163Sbill }
3151163Sbill 
findin(dir,cp)3161163Sbill findin(dir, cp)
3171163Sbill 	char *dir, *cp;
3181163Sbill {
3196732Smckusick 	DIR *dirp;
3206732Smckusick 	struct direct *dp;
3211163Sbill 
3226732Smckusick 	dirp = opendir(dir);
3236732Smckusick 	if (dirp == NULL)
3241163Sbill 		return;
3256732Smckusick 	while ((dp = readdir(dirp)) != NULL) {
3266732Smckusick 		if (itsit(cp, dp->d_name)) {
3271163Sbill 			count++;
3281163Sbill 			if (print)
32910723Smckusick 				printf(" %s/%s", dir, dp->d_name);
3301163Sbill 		}
3311163Sbill 	}
3326732Smckusick 	closedir(dirp);
3331163Sbill }
3341163Sbill 
itsit(cp,dp)3351163Sbill itsit(cp, dp)
3361163Sbill 	register char *cp, *dp;
3371163Sbill {
33810723Smckusick 	register int i = strlen(dp);
3391163Sbill 
3401163Sbill 	if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
3411163Sbill 		return (1);
3421163Sbill 	while (*cp && *dp && *cp == *dp)
3431163Sbill 		cp++, dp++, i--;
3441163Sbill 	if (*cp == 0 && *dp == 0)
3451163Sbill 		return (1);
3461163Sbill 	while (isdigit(*dp))
3471163Sbill 		dp++;
3481163Sbill 	if (*cp == 0 && *dp++ == '.') {
3491163Sbill 		--i;
3501163Sbill 		while (i > 0 && *dp)
3511163Sbill 			if (--i, *dp++ == '.')
3521163Sbill 				return (*dp++ == 'C' && *dp++ == 0);
3531163Sbill 		return (1);
3541163Sbill 	}
3551163Sbill 	return (0);
3561163Sbill }
357