]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - misc-utils/whereis.c
2 * Copyright (c) 1980 The Regents of the University of California.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 /* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
37 * - added Native Language Support
40 #include <sys/param.h>
49 void getlist(int *, char ***, char ***, int *);
54 void findv(char **, int, char *);
55 void find(char **, char *);
56 void findin(char *, char *);
57 int itsit(char *, char *);
59 static char *bindirs
[] = {
72 "/usr/lib/emacs/*/etc",
75 "/usr/interviews/bin/LINUX",
88 "/usr/local/games/bin",
89 "/usr/local/emacs/etc",
112 static char *mandirs
[] = {
117 "/usr/interviews/man/mann",
121 static char *srcdirs
[] = {
123 "/usr/src/lib/libc/*",
124 "/usr/src/lib/libc/net/*",
125 "/usr/src/ucb/pascal",
126 "/usr/src/ucb/pascal/utilities",
143 * look for source, documentation and binaries
150 setlocale(LC_ALL
, "");
151 bindtextdomain(PACKAGE
, LOCALEDIR
);
158 fprintf(stderr
, _("whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"));
162 if (argv
[0][0] == '-') {
163 register char *cp
= argv
[0] + 1;
164 while (*cp
) switch (*cp
++) {
170 getlist(&argc
, &argv
, &Sflag
, &Scnt
);
174 getlist(&argc
, &argv
, &Bflag
, &Bcnt
);
178 getlist(&argc
, &argv
, &Mflag
, &Mcnt
);
211 getlist(int *argcp
, char ***argvp
, char ***flagp
, int *cntp
) {
215 for ((*argcp
)--; *argcp
> 0 && (*argvp
)[0][0] != '-'; (*argcp
)--)
216 (*cntp
)++, (*argvp
)++;
225 if (sflag
&& bflag
&& mflag
)
226 sflag
= bflag
= mflag
= 0;
236 for (dp
= cp
; *dp
; dp
++)
238 for (; dp
> cp
; dp
--) {
244 for (dp
= cp
; *dp
; dp
++)
257 if (uflag
&& print
== 0 && count
!= 1) {
265 if (uflag
&& print
== 0 && count
!= 1) {
273 if (uflag
&& print
== 0 && count
!= 1) {
287 findv(Sflag
, Scnt
, cp
);
295 findv(Bflag
, Bcnt
, cp
);
303 findv(Mflag
, Mcnt
, cp
);
307 findv(char **dirv
, int dirc
, char *cp
) {
309 findin(*dirv
++, cp
), dirc
--;
313 find(char **dirs
, char *cp
) {
319 findin(char *dir
, char *cp
) {
327 dd
= index(dir
, '*');
332 if (l
< sizeof(dirbuf
)) { /* refuse excessively long names */
333 strcpy (dirbuf
, dir
);
334 d
= index(dirbuf
, '*');
336 dirp
= opendir(dirbuf
);
339 while ((dp
= readdir(dirp
)) != NULL
) {
340 if (!strcmp(dp
->d_name
, ".") ||
341 !strcmp(dp
->d_name
, ".."))
343 if (strlen(dp
->d_name
) + l
> sizeof(dirbuf
))
345 sprintf(d
, "%s", dp
->d_name
);
346 if (stat(dirbuf
, &statbuf
))
348 if (!S_ISDIR(statbuf
.st_mode
))
361 while ((dp
= readdir(dirp
)) != NULL
) {
362 if (itsit(cp
, dp
->d_name
)) {
365 printf(" %s/%s", dir
, dp
->d_name
);
372 itsit(char *cp
, char *dp
) {
375 if (dp
[0] == 's' && dp
[1] == '.' && itsit(cp
, dp
+2))
377 if (!strcmp(dp
+i
-2, ".Z"))
379 else if (!strcmp(dp
+i
-3, ".gz"))
381 else if (!strcmp(dp
+i
-4, ".bz2"))
383 while (*cp
&& *dp
&& *cp
== *dp
)
385 if (*cp
== 0 && *dp
== 0)
389 if (*cp
== 0 && *dp
++ == '.') {
392 if (--i
, *dp
++ == '.')
393 return (*dp
++ == 'C' && *dp
++ == 0);