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