fix to do writes in memory properly
[unix-history] / usr / src / old / whereis / whereis.c
CommitLineData
0aa1b875 1static char *sccsid = "@(#)whereis.c 4.6 (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/etc",
35 "/usr/src/bin",
36 "/usr/src/usr.bin",
0e305e25 37 "/usr/src/games",
0aa1b875
KM
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",
1d70c74a
RE
47 "/usr/src/new",
48 "/usr/src/old",
1d70c74a 49 "/usr/src/undoc",
0aa1b875
KM
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",
0e305e25
BJ
55 0
56};
57
58char sflag = 1;
59char bflag = 1;
60char mflag = 1;
61char **Sflag;
62int Scnt;
63char **Bflag;
64int Bcnt;
65char **Mflag;
66int Mcnt;
67char uflag;
68/*
69 * whereis name
70 * look for source, documentation and binaries
71 */
72main(argc, argv)
73 int argc;
74 char *argv[];
75{
76
0aa1b875
KM
77#ifdef CORY
78 if (getuid() == 0)
79 nice(-20);
80 if (((getuid() >> 8) & 0377) > 10)
81 setuid(getuid());
82#endif
0e305e25
BJ
83 argc--, argv++;
84 if (argc == 0) {
85usage:
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
137getlist(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
154zerof()
155{
156
157 if (sflag && bflag && mflag)
158 sflag = bflag = mflag = 0;
159}
160int count;
161int print;
162
163
164lookup(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;
185again:
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
215looksrc(cp)
216 char *cp;
217{
218 if (Sflag == 0) {
219 find(srcdirs, cp);
220 } else
221 findv(Sflag, Scnt, cp);
222}
223
224lookbin(cp)
225 char *cp;
226{
227 if (Bflag == 0)
228 find(bindirs, cp);
229 else
230 findv(Bflag, Bcnt, cp);
231}
232
233lookman(cp)
234 char *cp;
235{
236 if (Mflag == 0) {
237 find(mandirs, cp);
238 } else
239 findv(Mflag, Mcnt, cp);
240}
241
242findv(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
252find(dirs, cp)
253 char **dirs;
254 char *cp;
255{
256
257 while (*dirs)
258 findin(*dirs++, cp);
259}
260
261findin(dir, cp)
262 char *dir, *cp;
263{
0aa1b875
KM
264 DIR *dirp;
265 struct direct *dp;
0e305e25 266
0aa1b875
KM
267 dirp = opendir(dir);
268 if (dirp == NULL)
0e305e25 269 return;
0aa1b875
KM
270 while ((dp = readdir(dirp)) != NULL) {
271 if (itsit(cp, dp->d_name)) {
0e305e25
BJ
272 count++;
273 if (print)
0aa1b875 274 printf(" %s/%.14s", dir, dp->d_name);
0e305e25
BJ
275 }
276 }
0aa1b875 277 closedir(dirp);
0e305e25
BJ
278}
279
280itsit(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}