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