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