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