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