|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif /* not lint */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)whereis.c 5.2 (Berkeley) 12/3/87"; ! 15: #endif /* not lint */ ! 16: ! 17: #include <sys/param.h> ! 18: #include <sys/dir.h> ! 19: #include <stdio.h> ! 20: #include <ctype.h> ! 21: ! 22: static char *bindirs[] = { ! 23: "/etc", ! 24: "/bin", ! 25: "/usr/bin", ! 26: "/usr/games", ! 27: "/lib", ! 28: "/usr/ucb", ! 29: "/usr/lib", ! 30: "/usr/local", ! 31: "/usr/new", ! 32: "/usr/old", ! 33: "/usr/hosts", ! 34: "/usr/include", ! 35: 0 ! 36: }; ! 37: static char *mandirs[] = { ! 38: "/usr/man/man1", ! 39: "/usr/man/man2", ! 40: "/usr/man/man3", ! 41: "/usr/man/man4", ! 42: "/usr/man/man5", ! 43: "/usr/man/man6", ! 44: "/usr/man/man7", ! 45: "/usr/man/man8", ! 46: "/usr/man/manl", ! 47: "/usr/man/mann", ! 48: "/usr/man/mano", ! 49: 0 ! 50: }; ! 51: static char *srcdirs[] = { ! 52: "/usr/src/bin", ! 53: "/usr/src/usr.bin", ! 54: "/usr/src/etc", ! 55: "/usr/src/ucb", ! 56: "/usr/src/games", ! 57: "/usr/src/usr.lib", ! 58: "/usr/src/lib", ! 59: "/usr/src/local", ! 60: "/usr/src/new", ! 61: "/usr/src/old", ! 62: "/usr/src/include", ! 63: "/usr/src/lib/libc/gen", ! 64: "/usr/src/lib/libc/stdio", ! 65: "/usr/src/lib/libc/sys", ! 66: "/usr/src/lib/libc/net/common", ! 67: "/usr/src/lib/libc/net/inet", ! 68: "/usr/src/lib/libc/net/misc", ! 69: "/usr/src/ucb/pascal", ! 70: "/usr/src/ucb/pascal/utilities", ! 71: "/usr/src/undoc", ! 72: 0 ! 73: }; ! 74: ! 75: char sflag = 1; ! 76: char bflag = 1; ! 77: char mflag = 1; ! 78: char **Sflag; ! 79: int Scnt; ! 80: char **Bflag; ! 81: int Bcnt; ! 82: char **Mflag; ! 83: int Mcnt; ! 84: char uflag; ! 85: /* ! 86: * whereis name ! 87: * look for source, documentation and binaries ! 88: */ ! 89: main(argc, argv) ! 90: int argc; ! 91: char *argv[]; ! 92: { ! 93: ! 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: exit(0); ! 147: } ! 148: ! 149: getlist(argcp, argvp, flagp, cntp) ! 150: char ***argvp; ! 151: int *argcp; ! 152: char ***flagp; ! 153: int *cntp; ! 154: { ! 155: ! 156: (*argvp)++; ! 157: *flagp = *argvp; ! 158: *cntp = 0; ! 159: for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) ! 160: (*cntp)++, (*argvp)++; ! 161: (*argcp)++; ! 162: (*argvp)--; ! 163: } ! 164: ! 165: ! 166: zerof() ! 167: { ! 168: ! 169: if (sflag && bflag && mflag) ! 170: sflag = bflag = mflag = 0; ! 171: } ! 172: int count; ! 173: int print; ! 174: ! 175: ! 176: lookup(cp) ! 177: register char *cp; ! 178: { ! 179: register char *dp; ! 180: ! 181: for (dp = cp; *dp; dp++) ! 182: continue; ! 183: for (; dp > cp; dp--) { ! 184: if (*dp == '.') { ! 185: *dp = 0; ! 186: break; ! 187: } ! 188: } ! 189: for (dp = cp; *dp; dp++) ! 190: if (*dp == '/') ! 191: cp = dp + 1; ! 192: if (uflag) { ! 193: print = 0; ! 194: count = 0; ! 195: } else ! 196: print = 1; ! 197: again: ! 198: if (print) ! 199: printf("%s:", cp); ! 200: if (sflag) { ! 201: looksrc(cp); ! 202: if (uflag && print == 0 && count != 1) { ! 203: print = 1; ! 204: goto again; ! 205: } ! 206: } ! 207: count = 0; ! 208: if (bflag) { ! 209: lookbin(cp); ! 210: if (uflag && print == 0 && count != 1) { ! 211: print = 1; ! 212: goto again; ! 213: } ! 214: } ! 215: count = 0; ! 216: if (mflag) { ! 217: lookman(cp); ! 218: if (uflag && print == 0 && count != 1) { ! 219: print = 1; ! 220: goto again; ! 221: } ! 222: } ! 223: if (print) ! 224: printf("\n"); ! 225: } ! 226: ! 227: looksrc(cp) ! 228: char *cp; ! 229: { ! 230: if (Sflag == 0) { ! 231: find(srcdirs, cp); ! 232: } else ! 233: findv(Sflag, Scnt, cp); ! 234: } ! 235: ! 236: lookbin(cp) ! 237: char *cp; ! 238: { ! 239: if (Bflag == 0) ! 240: find(bindirs, cp); ! 241: else ! 242: findv(Bflag, Bcnt, cp); ! 243: } ! 244: ! 245: lookman(cp) ! 246: char *cp; ! 247: { ! 248: if (Mflag == 0) { ! 249: find(mandirs, cp); ! 250: } else ! 251: findv(Mflag, Mcnt, cp); ! 252: } ! 253: ! 254: findv(dirv, dirc, cp) ! 255: char **dirv; ! 256: int dirc; ! 257: char *cp; ! 258: { ! 259: ! 260: while (dirc > 0) ! 261: findin(*dirv++, cp), dirc--; ! 262: } ! 263: ! 264: find(dirs, cp) ! 265: char **dirs; ! 266: char *cp; ! 267: { ! 268: ! 269: while (*dirs) ! 270: findin(*dirs++, cp); ! 271: } ! 272: ! 273: findin(dir, cp) ! 274: char *dir, *cp; ! 275: { ! 276: DIR *dirp; ! 277: struct direct *dp; ! 278: ! 279: dirp = opendir(dir); ! 280: if (dirp == NULL) ! 281: return; ! 282: while ((dp = readdir(dirp)) != NULL) { ! 283: if (itsit(cp, dp->d_name)) { ! 284: count++; ! 285: if (print) ! 286: printf(" %s/%s", dir, dp->d_name); ! 287: } ! 288: } ! 289: closedir(dirp); ! 290: } ! 291: ! 292: itsit(cp, dp) ! 293: register char *cp, *dp; ! 294: { ! 295: register int i = strlen(dp); ! 296: ! 297: if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) ! 298: return (1); ! 299: while (*cp && *dp && *cp == *dp) ! 300: cp++, dp++, i--; ! 301: if (*cp == 0 && *dp == 0) ! 302: return (1); ! 303: while (isdigit(*dp)) ! 304: dp++; ! 305: if (*cp == 0 && *dp++ == '.') { ! 306: --i; ! 307: while (i > 0 && *dp) ! 308: if (--i, *dp++ == '.') ! 309: return (*dp++ == 'C' && *dp++ == 0); ! 310: return (1); ! 311: } ! 312: return (0); ! 313: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.