xref: /csrg-svn/old/whereis/whereis.c (revision 1163)
1*1163Sbill static char *sccsid = "@(#)whereis.c	4.1 (Berkeley) 10/01/80";
2*1163Sbill #include <sys/types.h>
3*1163Sbill #include <stdio.h>
4*1163Sbill #include <ctype.h>
5*1163Sbill #include <sys/dir.h>
6*1163Sbill #include <whoami.h>
7*1163Sbill 
8*1163Sbill static char *bindirs[] = {
9*1163Sbill 	"/etc",
10*1163Sbill 	"/bin",
11*1163Sbill 	"/usr/bin",
12*1163Sbill 	"/usr/games",
13*1163Sbill #ifdef CSVAX
14*1163Sbill 	"/lib",
15*1163Sbill 	"/usr/ucb",
16*1163Sbill 	"/usr/lib",
17*1163Sbill 	"/usr/local",
18*1163Sbill 	"/usr/new",
19*1163Sbill 	"/usr/old",
20*1163Sbill #endif
21*1163Sbill #ifdef CORY
22*1163Sbill 	"/usr/bin/eecs",
23*1163Sbill 	"/usr/bin/new",
24*1163Sbill 	"/usr/bin/v7",
25*1163Sbill 	"/usr/bin/old",
26*1163Sbill 	"/usr/bin/UNSUPPORTED",
27*1163Sbill #endif
28*1163Sbill 	0
29*1163Sbill };
30*1163Sbill static char *mandirs[] = {
31*1163Sbill 	"/usr/man/man1",
32*1163Sbill 	"/usr/man/man2",
33*1163Sbill 	"/usr/man/man3",
34*1163Sbill 	"/usr/man/man4",
35*1163Sbill 	"/usr/man/man5",
36*1163Sbill 	"/usr/man/man6",
37*1163Sbill 	"/usr/man/man7",
38*1163Sbill 	"/usr/man/man8",
39*1163Sbill #ifdef CORY
40*1163Sbill 	"/usr/man/manu",
41*1163Sbill 	"/usr/man/manc",
42*1163Sbill 	"/usr/man/manv7",
43*1163Sbill 	"/usr/bin/eecs/mane",
44*1163Sbill #endif
45*1163Sbill 	0
46*1163Sbill };
47*1163Sbill static char *srcdirs[]  = {
48*1163Sbill 	"/usr/src/cmd",
49*1163Sbill 	"/usr/src/games",
50*1163Sbill 	"/usr/src/libc/gen",
51*1163Sbill 	"/usr/src/libc/stdio",
52*1163Sbill #ifdef CSVAX
53*1163Sbill 	"/usr/src/libc/sys",
54*1163Sbill 	"/usr/src/new",
55*1163Sbill 	"/usr/src/old",
56*1163Sbill 	"/usr/src/local",
57*1163Sbill 	"/usr/src/undoc",
58*1163Sbill #endif
59*1163Sbill #ifdef CORY
60*1163Sbill 	"/usr/bin/eecs/src",
61*1163Sbill 	"/usr/src/cmd/v7",
62*1163Sbill 	"/usr/src/cmd/new",
63*1163Sbill 	"/usr/src/cmd/old",
64*1163Sbill 	"/usr/src/cmd/UNSUPPORTED",
65*1163Sbill #endif
66*1163Sbill 	0
67*1163Sbill };
68*1163Sbill 
69*1163Sbill char	sflag = 1;
70*1163Sbill char	bflag = 1;
71*1163Sbill char	mflag = 1;
72*1163Sbill char	**Sflag;
73*1163Sbill int	Scnt;
74*1163Sbill char	**Bflag;
75*1163Sbill int	Bcnt;
76*1163Sbill char	**Mflag;
77*1163Sbill int	Mcnt;
78*1163Sbill char	uflag;
79*1163Sbill /*
80*1163Sbill  * whereis name
81*1163Sbill  * look for source, documentation and binaries
82*1163Sbill  */
83*1163Sbill main(argc, argv)
84*1163Sbill 	int argc;
85*1163Sbill 	char *argv[];
86*1163Sbill {
87*1163Sbill 
88*1163Sbill #ifdef CORY
89*1163Sbill 	if (getuid() == 0)
90*1163Sbill 		nice(-20);
91*1163Sbill 	if (((getuid() >> 8) & 0377) > 10)
92*1163Sbill 		setuid(getuid());
93*1163Sbill #endif
94*1163Sbill 	argc--, argv++;
95*1163Sbill 	if (argc == 0) {
96*1163Sbill usage:
97*1163Sbill 		fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n");
98*1163Sbill 		exit(1);
99*1163Sbill 	}
100*1163Sbill 	do
101*1163Sbill 		if (argv[0][0] == '-') {
102*1163Sbill 			register char *cp = argv[0] + 1;
103*1163Sbill 			while (*cp) switch (*cp++) {
104*1163Sbill 
105*1163Sbill 			case 'f':
106*1163Sbill 				break;
107*1163Sbill 
108*1163Sbill 			case 'S':
109*1163Sbill 				getlist(&argc, &argv, &Sflag, &Scnt);
110*1163Sbill 				break;
111*1163Sbill 
112*1163Sbill 			case 'B':
113*1163Sbill 				getlist(&argc, &argv, &Bflag, &Bcnt);
114*1163Sbill 				break;
115*1163Sbill 
116*1163Sbill 			case 'M':
117*1163Sbill 				getlist(&argc, &argv, &Mflag, &Mcnt);
118*1163Sbill 				break;
119*1163Sbill 
120*1163Sbill 			case 's':
121*1163Sbill 				zerof();
122*1163Sbill 				sflag++;
123*1163Sbill 				continue;
124*1163Sbill 
125*1163Sbill 			case 'u':
126*1163Sbill 				uflag++;
127*1163Sbill 				continue;
128*1163Sbill 
129*1163Sbill 			case 'b':
130*1163Sbill 				zerof();
131*1163Sbill 				bflag++;
132*1163Sbill 				continue;
133*1163Sbill 
134*1163Sbill 			case 'm':
135*1163Sbill 				zerof();
136*1163Sbill 				mflag++;
137*1163Sbill 				continue;
138*1163Sbill 
139*1163Sbill 			default:
140*1163Sbill 				goto usage;
141*1163Sbill 			}
142*1163Sbill 			argv++;
143*1163Sbill 		} else
144*1163Sbill 			lookup(*argv++);
145*1163Sbill 	while (--argc > 0);
146*1163Sbill }
147*1163Sbill 
148*1163Sbill getlist(argcp, argvp, flagp, cntp)
149*1163Sbill 	char ***argvp;
150*1163Sbill 	int *argcp;
151*1163Sbill 	char ***flagp;
152*1163Sbill 	int *cntp;
153*1163Sbill {
154*1163Sbill 
155*1163Sbill 	(*argvp)++;
156*1163Sbill 	*flagp = *argvp;
157*1163Sbill 	*cntp = 0;
158*1163Sbill 	for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--)
159*1163Sbill 		(*cntp)++, (*argvp)++;
160*1163Sbill 	(*argcp)++;
161*1163Sbill 	(*argvp)--;
162*1163Sbill }
163*1163Sbill 
164*1163Sbill 
165*1163Sbill zerof()
166*1163Sbill {
167*1163Sbill 
168*1163Sbill 	if (sflag && bflag && mflag)
169*1163Sbill 		sflag = bflag = mflag = 0;
170*1163Sbill }
171*1163Sbill int	count;
172*1163Sbill int	print;
173*1163Sbill 
174*1163Sbill 
175*1163Sbill lookup(cp)
176*1163Sbill 	register char *cp;
177*1163Sbill {
178*1163Sbill 	register char *dp;
179*1163Sbill 
180*1163Sbill 	for (dp = cp; *dp; dp++)
181*1163Sbill 		continue;
182*1163Sbill 	for (; dp > cp; dp--) {
183*1163Sbill 		if (*dp == '.') {
184*1163Sbill 			*dp = 0;
185*1163Sbill 			break;
186*1163Sbill 		}
187*1163Sbill 	}
188*1163Sbill 	for (dp = cp; *dp; dp++)
189*1163Sbill 		if (*dp == '/')
190*1163Sbill 			cp = dp + 1;
191*1163Sbill 	if (uflag) {
192*1163Sbill 		print = 0;
193*1163Sbill 		count = 0;
194*1163Sbill 	} else
195*1163Sbill 		print = 1;
196*1163Sbill again:
197*1163Sbill 	if (print)
198*1163Sbill 		printf("%s:", cp);
199*1163Sbill 	if (sflag) {
200*1163Sbill 		looksrc(cp);
201*1163Sbill 		if (uflag && print == 0 && count != 1) {
202*1163Sbill 			print = 1;
203*1163Sbill 			goto again;
204*1163Sbill 		}
205*1163Sbill 	}
206*1163Sbill 	count = 0;
207*1163Sbill 	if (bflag) {
208*1163Sbill 		lookbin(cp);
209*1163Sbill 		if (uflag && print == 0 && count != 1) {
210*1163Sbill 			print = 1;
211*1163Sbill 			goto again;
212*1163Sbill 		}
213*1163Sbill 	}
214*1163Sbill 	count = 0;
215*1163Sbill 	if (mflag) {
216*1163Sbill 		lookman(cp);
217*1163Sbill 		if (uflag && print == 0 && count != 1) {
218*1163Sbill 			print = 1;
219*1163Sbill 			goto again;
220*1163Sbill 		}
221*1163Sbill 	}
222*1163Sbill 	if (print)
223*1163Sbill 		printf("\n");
224*1163Sbill }
225*1163Sbill 
226*1163Sbill looksrc(cp)
227*1163Sbill 	char *cp;
228*1163Sbill {
229*1163Sbill 	if (Sflag == 0) {
230*1163Sbill 		find(srcdirs, cp);
231*1163Sbill 	} else
232*1163Sbill 		findv(Sflag, Scnt, cp);
233*1163Sbill }
234*1163Sbill 
235*1163Sbill lookbin(cp)
236*1163Sbill 	char *cp;
237*1163Sbill {
238*1163Sbill 	if (Bflag == 0)
239*1163Sbill 		find(bindirs, cp);
240*1163Sbill 	else
241*1163Sbill 		findv(Bflag, Bcnt, cp);
242*1163Sbill }
243*1163Sbill 
244*1163Sbill lookman(cp)
245*1163Sbill 	char *cp;
246*1163Sbill {
247*1163Sbill 	if (Mflag == 0) {
248*1163Sbill 		find(mandirs, cp);
249*1163Sbill 	} else
250*1163Sbill 		findv(Mflag, Mcnt, cp);
251*1163Sbill }
252*1163Sbill 
253*1163Sbill findv(dirv, dirc, cp)
254*1163Sbill 	char **dirv;
255*1163Sbill 	int dirc;
256*1163Sbill 	char *cp;
257*1163Sbill {
258*1163Sbill 
259*1163Sbill 	while (dirc > 0)
260*1163Sbill 		findin(*dirv++, cp), dirc--;
261*1163Sbill }
262*1163Sbill 
263*1163Sbill find(dirs, cp)
264*1163Sbill 	char **dirs;
265*1163Sbill 	char *cp;
266*1163Sbill {
267*1163Sbill 
268*1163Sbill 	while (*dirs)
269*1163Sbill 		findin(*dirs++, cp);
270*1163Sbill }
271*1163Sbill 
272*1163Sbill findin(dir, cp)
273*1163Sbill 	char *dir, *cp;
274*1163Sbill {
275*1163Sbill 	register FILE *d;
276*1163Sbill 	struct direct direct;
277*1163Sbill 
278*1163Sbill 	d = fopen(dir, "r");
279*1163Sbill 	if (d == NULL)
280*1163Sbill 		return;
281*1163Sbill 	while (fread(&direct, sizeof direct, 1, d) == 1) {
282*1163Sbill 		if (direct.d_ino == 0)
283*1163Sbill 			continue;
284*1163Sbill 		if (itsit(cp, direct.d_name)) {
285*1163Sbill 			count++;
286*1163Sbill 			if (print)
287*1163Sbill 				printf(" %s/%.14s", dir, direct.d_name);
288*1163Sbill 		}
289*1163Sbill 	}
290*1163Sbill 	fclose(d);
291*1163Sbill }
292*1163Sbill 
293*1163Sbill itsit(cp, dp)
294*1163Sbill 	register char *cp, *dp;
295*1163Sbill {
296*1163Sbill 	register int i = 14;
297*1163Sbill 
298*1163Sbill 	if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
299*1163Sbill 		return (1);
300*1163Sbill 	while (*cp && *dp && *cp == *dp)
301*1163Sbill 		cp++, dp++, i--;
302*1163Sbill 	if (*cp == 0 && *dp == 0)
303*1163Sbill 		return (1);
304*1163Sbill 	while (isdigit(*dp))
305*1163Sbill 		dp++;
306*1163Sbill 	if (*cp == 0 && *dp++ == '.') {
307*1163Sbill 		--i;
308*1163Sbill 		while (i > 0 && *dp)
309*1163Sbill 			if (--i, *dp++ == '.')
310*1163Sbill 				return (*dp++ == 'C' && *dp++ == 0);
311*1163Sbill 		return (1);
312*1163Sbill 	}
313*1163Sbill 	return (0);
314*1163Sbill }
315