home *** CD-ROM | disk | FTP | other *** search
/ Chip 1995 March / CHIP3.mdf / slackwar / a / util / util-lin.2 / util-lin / util-linux-2.2 / misc-utils / whereis.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-22  |  8.5 KB  |  459 lines

  1. /*-
  2.  * Copyright (c) 1980 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  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.
  20.  *
  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
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. char copyright[] =
  36. "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
  37.  All rights reserved.\n";
  38. #endif /* not lint */
  39.  
  40. #ifndef lint
  41. static char sccsid[] = "@(#)whereis.c    5.5 (Berkeley) 4/18/91";
  42. #endif /* not lint */
  43.  
  44. #include <sys/param.h>
  45. #include <sys/dir.h>
  46. #include <stdio.h>
  47. #include <ctype.h>
  48.  
  49. static char *bindirs[] = {
  50. #ifdef __linux__
  51.    "/bin",
  52.    "/usr/bin",
  53.    "/etc",
  54.    "/usr/etc",
  55.    "/sbin",
  56.    "/usr/sbin",
  57.    "/usr/games",
  58.    "/usr/games/bin",
  59.    "/usr/emacs/etc",
  60.    "/usr/lib/emacs/19.22/etc",
  61.    "/usr/lib/emacs/19.23/etc",
  62.    "/usr/lib/emacs/19.24/etc",
  63.    "/usr/lib/emacs/19.25/etc",
  64.    "/usr/lib/emacs/19.26/etc",
  65.    "/usr/lib/emacs/19.27/etc",
  66.    "/usr/lib/emacs/19.28/etc",
  67.    "/usr/lib/emacs/19.29/etc",
  68.    "/usr/lib/emacs/19.30/etc",
  69.    "/usr/TeX/bin",
  70.    "/usr/tex/bin",
  71.    "/usr/interviews/bin/LINUX",
  72.    
  73.    "/usr/bin/X11",
  74.    "/usr/X11/bin",
  75.    "/usr/X11R5/bin",
  76.    "/usr/X11R6/bin",
  77.    "/usr/X386/bin",
  78.  
  79.    "/usr/local/bin",
  80.    "/usr/local/etc",
  81.    "/usr/local/sbin",
  82.    "/usr/local/games",
  83.    "/usr/local/games/bin",
  84.    "/usr/local/emacs/etc",
  85.    "/usr/local/TeX/bin",
  86.    "/usr/local/tex/bin",
  87.    "/usr/local/bin/X11",
  88.  
  89.    "/usr/contrib",
  90.    "/usr/hosts",
  91.    "/usr/include",
  92.  
  93.    "/usr/g++-include",
  94. #else
  95.     "/bin",
  96.     "/sbin",
  97.     "/usr/ucb",
  98.     "/usr/bin",
  99.     "/usr/sbin",
  100.     "/usr/old",
  101.     "/usr/contrib",
  102.     "/usr/games",
  103.     "/usr/local",
  104.     "/usr/libexec",
  105.     "/usr/include",
  106.     "/usr/hosts",
  107.     "/usr/share", /*?*/
  108.     "/etc",
  109. #ifdef notdef
  110.     /* before reorg */
  111.     "/etc",
  112.     "/bin",
  113.     "/usr/bin",
  114.     "/usr/games",
  115.     "/lib",
  116.     "/usr/ucb",
  117.     "/usr/lib",
  118.     "/usr/local",
  119.     "/usr/new",
  120.     "/usr/old",
  121.     "/usr/hosts",
  122.     "/usr/include",
  123. #endif
  124. #endif
  125.     0
  126. };
  127. /* This needs to be redone - man pages live with sources */
  128. static char *mandirs[] = {
  129.     "/usr/man/man1",
  130.     "/usr/man/man2",
  131.     "/usr/man/man3",
  132.     "/usr/man/man4",
  133.     "/usr/man/man5",
  134.     "/usr/man/man6",
  135.     "/usr/man/man7",
  136.     "/usr/man/man8",
  137. #ifdef __linux__
  138.     "/usr/man/man9",
  139. #endif
  140.     "/usr/man/manl",
  141.     "/usr/man/mann",
  142.     "/usr/man/mano",
  143. #ifdef __linux__
  144.     "/usr/X386/man/man1",
  145.     "/usr/X386/man/man2",
  146.     "/usr/X386/man/man3",
  147.     "/usr/X386/man/man4",
  148.     "/usr/X386/man/man5",
  149.     "/usr/X386/man/man6",
  150.     "/usr/X386/man/man7",
  151.     "/usr/X386/man/man8",
  152.     "/usr/X11/man/man1",
  153.     "/usr/X11/man/man2",
  154.     "/usr/X11/man/man3",
  155.     "/usr/X11/man/man4",
  156.     "/usr/X11/man/man5",
  157.     "/usr/X11/man/man6",
  158.     "/usr/X11/man/man7",
  159.     "/usr/X11/man/man8",
  160.     "/usr/TeX/man/man1",
  161.     "/usr/TeX/man/man2",
  162.     "/usr/TeX/man/man3",
  163.     "/usr/TeX/man/man4",
  164.     "/usr/TeX/man/man5",
  165.     "/usr/TeX/man/man6",
  166.     "/usr/TeX/man/man7",
  167.     "/usr/TeX/man/man8",
  168.     "/usr/interviews/man/mann",
  169. #endif
  170.     0
  171. };
  172. static char *srcdirs[]  = {
  173.     "/usr/src/bin",
  174.     "/usr/src/sbin",
  175.     "/usr/src/etc",
  176.     "/usr/src/pgrm",
  177.     "/usr/src/usr.bin",
  178.     "/usr/src/usr.sbin",
  179.     "/usr/src/usr.ucb",
  180.     "/usr/src/usr.new",
  181.     "/usr/src/usr.lib",
  182.     "/usr/src/libexec",
  183.     "/usr/src/libdata",
  184.     "/usr/src/share",
  185.     "/usr/src/contrib",
  186.     "/usr/src/athena",
  187.     "/usr/src/devel",
  188.     "/usr/src/games",
  189.     "/usr/src/local",
  190.     "/usr/src/man",
  191.     "/usr/src/root",
  192.     "/usr/src/old",
  193.     "/usr/src/include",
  194.     /* still need libs */
  195. #ifdef notdef /* before reorg */
  196.     "/usr/src/bin",
  197.     "/usr/src/usr.bin",
  198.     "/usr/src/etc",
  199.     "/usr/src/ucb",
  200.     "/usr/src/games",
  201.     "/usr/src/usr.lib",
  202.     "/usr/src/lib",
  203.     "/usr/src/local",
  204.     "/usr/src/new",
  205.     "/usr/src/old",
  206.     "/usr/src/include",
  207.     "/usr/src/lib/libc/gen",
  208.     "/usr/src/lib/libc/stdio",
  209.     "/usr/src/lib/libc/sys",
  210.     "/usr/src/lib/libc/net/common",
  211.     "/usr/src/lib/libc/net/inet",
  212.     "/usr/src/lib/libc/net/misc",
  213.     "/usr/src/ucb/pascal",
  214.     "/usr/src/ucb/pascal/utilities",
  215.     "/usr/src/undoc",
  216. #endif
  217.     0
  218. };
  219.  
  220. char    sflag = 1;
  221. char    bflag = 1;
  222. char    mflag = 1;
  223. char    **Sflag;
  224. int    Scnt;
  225. char    **Bflag;
  226. int    Bcnt;
  227. char    **Mflag;
  228. int    Mcnt;
  229. char    uflag;
  230. /*
  231.  * whereis name
  232.  * look for source, documentation and binaries
  233.  */
  234. main(argc, argv)
  235.     int argc;
  236.     char *argv[];
  237. {
  238.  
  239.     argc--, argv++;
  240.     if (argc == 0) {
  241. usage:
  242.         fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n");
  243.         exit(1);
  244.     }
  245.     do
  246.         if (argv[0][0] == '-') {
  247.             register char *cp = argv[0] + 1;
  248.             while (*cp) switch (*cp++) {
  249.  
  250.             case 'f':
  251.                 break;
  252.  
  253.             case 'S':
  254.                 getlist(&argc, &argv, &Sflag, &Scnt);
  255.                 break;
  256.  
  257.             case 'B':
  258.                 getlist(&argc, &argv, &Bflag, &Bcnt);
  259.                 break;
  260.  
  261.             case 'M':
  262.                 getlist(&argc, &argv, &Mflag, &Mcnt);
  263.                 break;
  264.  
  265.             case 's':
  266.                 zerof();
  267.                 sflag++;
  268.                 continue;
  269.  
  270.             case 'u':
  271.                 uflag++;
  272.                 continue;
  273.  
  274.             case 'b':
  275.                 zerof();
  276.                 bflag++;
  277.                 continue;
  278.  
  279.             case 'm':
  280.                 zerof();
  281.                 mflag++;
  282.                 continue;
  283.  
  284.             default:
  285.                 goto usage;
  286.             }
  287.             argv++;
  288.         } else
  289.             lookup(*argv++);
  290.     while (--argc > 0);
  291.     exit(0);
  292. }
  293.  
  294. getlist(argcp, argvp, flagp, cntp)
  295.     char ***argvp;
  296.     int *argcp;
  297.     char ***flagp;
  298.     int *cntp;
  299. {
  300.  
  301.     (*argvp)++;
  302.     *flagp = *argvp;
  303.     *cntp = 0;
  304.     for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--)
  305.         (*cntp)++, (*argvp)++;
  306.     (*argcp)++;
  307.     (*argvp)--;
  308. }
  309.  
  310.  
  311. zerof()
  312. {
  313.  
  314.     if (sflag && bflag && mflag)
  315.         sflag = bflag = mflag = 0;
  316. }
  317. int    count;
  318. int    print;
  319.  
  320.  
  321. lookup(cp)
  322.     register char *cp;
  323. {
  324.     register char *dp;
  325.  
  326.     for (dp = cp; *dp; dp++)
  327.         continue;
  328.     for (; dp > cp; dp--) {
  329.         if (*dp == '.') {
  330.             *dp = 0;
  331.             break;
  332.         }
  333.     }
  334.     for (dp = cp; *dp; dp++)
  335.         if (*dp == '/')
  336.             cp = dp + 1;
  337.     if (uflag) {
  338.         print = 0;
  339.         count = 0;
  340.     } else
  341.         print = 1;
  342. again:
  343.     if (print)
  344.         printf("%s:", cp);
  345.     if (sflag) {
  346.         looksrc(cp);
  347.         if (uflag && print == 0 && count != 1) {
  348.             print = 1;
  349.             goto again;
  350.         }
  351.     }
  352.     count = 0;
  353.     if (bflag) {
  354.         lookbin(cp);
  355.         if (uflag && print == 0 && count != 1) {
  356.             print = 1;
  357.             goto again;
  358.         }
  359.     }
  360.     count = 0;
  361.     if (mflag) {
  362.         lookman(cp);
  363.         if (uflag && print == 0 && count != 1) {
  364.             print = 1;
  365.             goto again;
  366.         }
  367.     }
  368.     if (print)
  369.         printf("\n");
  370. }
  371.  
  372. looksrc(cp)
  373.     char *cp;
  374. {
  375.     if (Sflag == 0) {
  376.         find(srcdirs, cp);
  377.     } else
  378.         findv(Sflag, Scnt, cp);
  379. }
  380.  
  381. lookbin(cp)
  382.     char *cp;
  383. {
  384.     if (Bflag == 0)
  385.         find(bindirs, cp);
  386.     else
  387.         findv(Bflag, Bcnt, cp);
  388. }
  389.  
  390. lookman(cp)
  391.     char *cp;
  392. {
  393.     if (Mflag == 0) {
  394.         find(mandirs, cp);
  395.     } else
  396.         findv(Mflag, Mcnt, cp);
  397. }
  398.  
  399. findv(dirv, dirc, cp)
  400.     char **dirv;
  401.     int dirc;
  402.     char *cp;
  403. {
  404.  
  405.     while (dirc > 0)
  406.         findin(*dirv++, cp), dirc--;
  407. }
  408.  
  409. find(dirs, cp)
  410.     char **dirs;
  411.     char *cp;
  412. {
  413.  
  414.     while (*dirs)
  415.         findin(*dirs++, cp);
  416. }
  417.  
  418. findin(dir, cp)
  419.     char *dir, *cp;
  420. {
  421.     DIR *dirp;
  422.     struct direct *dp;
  423.  
  424.     dirp = opendir(dir);
  425.     if (dirp == NULL)
  426.         return;
  427.     while ((dp = readdir(dirp)) != NULL) {
  428.         if (itsit(cp, dp->d_name)) {
  429.             count++;
  430.             if (print)
  431.                 printf(" %s/%s", dir, dp->d_name);
  432.         }
  433.     }
  434.     closedir(dirp);
  435. }
  436.  
  437. itsit(cp, dp)
  438.     register char *cp, *dp;
  439. {
  440.     register int i = strlen(dp);
  441.  
  442.     if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
  443.         return (1);
  444.     while (*cp && *dp && *cp == *dp)
  445.         cp++, dp++, i--;
  446.     if (*cp == 0 && *dp == 0)
  447.         return (1);
  448.     while (isdigit(*dp))
  449.         dp++;
  450.     if (*cp == 0 && *dp++ == '.') {
  451.         --i;
  452.         while (i > 0 && *dp)
  453.             if (--i, *dp++ == '.')
  454.                 return (*dp++ == 'C' && *dp++ == 0);
  455.         return (1);
  456.     }
  457.     return (0);
  458. }
  459.