|
|
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.1 (Berkeley) 5/31/85"; ! 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: } ! 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: DIR *dirp; ! 276: struct direct *dp; ! 277: ! 278: dirp = opendir(dir); ! 279: if (dirp == NULL) ! 280: return; ! 281: while ((dp = readdir(dirp)) != NULL) { ! 282: if (itsit(cp, dp->d_name)) { ! 283: count++; ! 284: if (print) ! 285: printf(" %s/%s", dir, dp->d_name); ! 286: } ! 287: } ! 288: closedir(dirp); ! 289: } ! 290: ! 291: itsit(cp, dp) ! 292: register char *cp, *dp; ! 293: { ! 294: register int i = strlen(dp); ! 295: ! 296: if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) ! 297: return (1); ! 298: while (*cp && *dp && *cp == *dp) ! 299: cp++, dp++, i--; ! 300: if (*cp == 0 && *dp == 0) ! 301: return (1); ! 302: while (isdigit(*dp)) ! 303: dp++; ! 304: if (*cp == 0 && *dp++ == '.') { ! 305: --i; ! 306: while (i > 0 && *dp) ! 307: if (--i, *dp++ == '.') ! 308: return (*dp++ == 'C' && *dp++ == 0); ! 309: return (1); ! 310: } ! 311: return (0); ! 312: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.