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