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