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