]>
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@pld.ORG.PL>
37 * - added Native Language Support
40 #include <sys/param.h>
50 void getlist(int *, char ***, char ***, int *);
55 void findv(char **, int, char *);
56 void find(char **, char *);
57 void findin(char *, char *);
58 int itsit(char *, char *);
60 static char *bindirs
[] = {
73 "/usr/lib/emacs/*/etc",
76 "/usr/interviews/bin/LINUX",
89 "/usr/local/games/bin",
90 "/usr/local/emacs/etc",
113 static char *mandirs
[] = {
119 "/usr/interviews/man/mann",
123 static char *srcdirs
[] = {
125 "/usr/src/lib/libc/*",
126 "/usr/src/lib/libc/net/*",
127 "/usr/src/ucb/pascal",
128 "/usr/src/ucb/pascal/utilities",
145 * look for source, documentation and binaries
148 main(int argc
, char **argv
) {
149 setlocale(LC_ALL
, "");
150 bindtextdomain(PACKAGE
, LOCALEDIR
);
157 fprintf(stderr
, _("whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"));
161 if (argv
[0][0] == '-') {
162 register char *cp
= argv
[0] + 1;
163 while (*cp
) switch (*cp
++) {
169 getlist(&argc
, &argv
, &Sflag
, &Scnt
);
173 getlist(&argc
, &argv
, &Bflag
, &Bcnt
);
177 getlist(&argc
, &argv
, &Mflag
, &Mcnt
);
210 getlist(int *argcp
, char ***argvp
, char ***flagp
, int *cntp
) {
214 for ((*argcp
)--; *argcp
> 0 && (*argvp
)[0][0] != '-'; (*argcp
)--)
215 (*cntp
)++, (*argvp
)++;
224 if (sflag
&& bflag
&& mflag
)
225 sflag
= bflag
= mflag
= 0;
235 for (dp
= cp
; *dp
; dp
++)
237 for (; dp
> cp
; dp
--) {
243 for (dp
= cp
; *dp
; dp
++)
256 if (uflag
&& print
== 0 && count
!= 1) {
264 if (uflag
&& print
== 0 && count
!= 1) {
272 if (uflag
&& print
== 0 && count
!= 1) {
286 findv(Sflag
, Scnt
, cp
);
294 findv(Bflag
, Bcnt
, cp
);
302 findv(Mflag
, Mcnt
, cp
);
306 findv(char **dirv
, int dirc
, char *cp
) {
308 findin(*dirv
++, cp
), dirc
--;
312 find(char **dirs
, char *cp
) {
318 findin(char *dir
, char *cp
) {
326 dd
= index(dir
, '*');
331 if (l
< sizeof(dirbuf
)) { /* refuse excessively long names */
332 strcpy (dirbuf
, dir
);
333 d
= index(dirbuf
, '*');
335 dirp
= opendir(dirbuf
);
338 while ((dp
= readdir(dirp
)) != NULL
) {
339 if (!strcmp(dp
->d_name
, ".") ||
340 !strcmp(dp
->d_name
, ".."))
342 if (strlen(dp
->d_name
) + l
> sizeof(dirbuf
))
344 sprintf(d
, "%s", dp
->d_name
);
345 if (stat(dirbuf
, &statbuf
))
347 if (!S_ISDIR(statbuf
.st_mode
))
360 while ((dp
= readdir(dirp
)) != NULL
) {
361 if (itsit(cp
, dp
->d_name
)) {
364 printf(" %s/%s", dir
, dp
->d_name
);
371 itsit(char *cp
, char *dp
) {
374 if (dp
[0] == 's' && dp
[1] == '.' && itsit(cp
, dp
+2))
376 if (!strcmp(dp
+i
-2, ".Z"))
378 else if (!strcmp(dp
+i
-3, ".gz"))
380 else if (!strcmp(dp
+i
-4, ".bz2"))
382 while (*cp
&& *dp
&& *cp
== *dp
)
384 if (*cp
== 0 && *dp
== 0)
388 if (*cp
== 0 && *dp
++ == '.') {
391 if (--i
, *dp
++ == '.')
392 return (*dp
++ == 'C' && *dp
++ == 0);