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