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