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