|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: char copyright[] = ! 20: "@(#) Copyright (c) 1980, 1990 The Regents of the University of California.\n\ ! 21: All rights reserved.\n"; ! 22: #endif /* not lint */ ! 23: ! 24: #ifndef lint ! 25: static char sccsid[] = "@(#)whereis.c 5.4 (Berkeley) 6/29/90"; ! 26: #endif /* not lint */ ! 27: ! 28: #include <sys/param.h> ! 29: #include <sys/dir.h> ! 30: #include <stdio.h> ! 31: #include <ctype.h> ! 32: ! 33: static char *bindirs[] = { ! 34: "/bin", ! 35: "/sbin", ! 36: "/usr/ucb", ! 37: "/usr/bin", ! 38: "/usr/sbin", ! 39: "/usr/old", ! 40: "/usr/contrib", ! 41: "/usr/games", ! 42: "/usr/local", ! 43: "/usr/libexec", ! 44: "/usr/include", ! 45: "/usr/hosts", ! 46: "/usr/share", /*?*/ ! 47: "/etc", ! 48: #ifdef notdef ! 49: /* before reorg */ ! 50: "/etc", ! 51: "/bin", ! 52: "/usr/bin", ! 53: "/usr/games", ! 54: "/lib", ! 55: "/usr/ucb", ! 56: "/usr/lib", ! 57: "/usr/local", ! 58: "/usr/new", ! 59: "/usr/old", ! 60: "/usr/hosts", ! 61: "/usr/include", ! 62: #endif ! 63: 0 ! 64: }; ! 65: /* This needs to be redone - man pages live with sources */ ! 66: static char *mandirs[] = { ! 67: "/usr/man/man1", ! 68: "/usr/man/man2", ! 69: "/usr/man/man3", ! 70: "/usr/man/man4", ! 71: "/usr/man/man5", ! 72: "/usr/man/man6", ! 73: "/usr/man/man7", ! 74: "/usr/man/man8", ! 75: "/usr/man/manl", ! 76: "/usr/man/mann", ! 77: "/usr/man/mano", ! 78: 0 ! 79: }; ! 80: static char *srcdirs[] = { ! 81: "/usr/src/bin", ! 82: "/usr/src/sbin", ! 83: "/usr/src/etc", ! 84: "/usr/src/pgrm", ! 85: "/usr/src/usr.bin", ! 86: "/usr/src/usr.sbin", ! 87: "/usr/src/usr.ucb", ! 88: "/usr/src/usr.new", ! 89: "/usr/src/usr.lib", ! 90: "/usr/src/libexec", ! 91: "/usr/src/libdata", ! 92: "/usr/src/share", ! 93: "/usr/src/contrib", ! 94: "/usr/src/athena", ! 95: "/usr/src/devel", ! 96: "/usr/src/games", ! 97: "/usr/src/local", ! 98: "/usr/src/man", ! 99: "/usr/src/root", ! 100: "/usr/src/old", ! 101: "/usr/src/include", ! 102: /* still need libs */ ! 103: #ifdef notdef /* before reorg */ ! 104: "/usr/src/bin", ! 105: "/usr/src/usr.bin", ! 106: "/usr/src/etc", ! 107: "/usr/src/ucb", ! 108: "/usr/src/games", ! 109: "/usr/src/usr.lib", ! 110: "/usr/src/lib", ! 111: "/usr/src/local", ! 112: "/usr/src/new", ! 113: "/usr/src/old", ! 114: "/usr/src/include", ! 115: "/usr/src/lib/libc/gen", ! 116: "/usr/src/lib/libc/stdio", ! 117: "/usr/src/lib/libc/sys", ! 118: "/usr/src/lib/libc/net/common", ! 119: "/usr/src/lib/libc/net/inet", ! 120: "/usr/src/lib/libc/net/misc", ! 121: "/usr/src/ucb/pascal", ! 122: "/usr/src/ucb/pascal/utilities", ! 123: "/usr/src/undoc", ! 124: #endif ! 125: 0 ! 126: }; ! 127: ! 128: char sflag = 1; ! 129: char bflag = 1; ! 130: char mflag = 1; ! 131: char **Sflag; ! 132: int Scnt; ! 133: char **Bflag; ! 134: int Bcnt; ! 135: char **Mflag; ! 136: int Mcnt; ! 137: char uflag; ! 138: /* ! 139: * whereis name ! 140: * look for source, documentation and binaries ! 141: */ ! 142: main(argc, argv) ! 143: int argc; ! 144: char *argv[]; ! 145: { ! 146: ! 147: argc--, argv++; ! 148: if (argc == 0) { ! 149: usage: ! 150: fprintf(stderr, "whereis [ -sbmu ] [ -SBM dir ... -f ] name...\n"); ! 151: exit(1); ! 152: } ! 153: do ! 154: if (argv[0][0] == '-') { ! 155: register char *cp = argv[0] + 1; ! 156: while (*cp) switch (*cp++) { ! 157: ! 158: case 'f': ! 159: break; ! 160: ! 161: case 'S': ! 162: getlist(&argc, &argv, &Sflag, &Scnt); ! 163: break; ! 164: ! 165: case 'B': ! 166: getlist(&argc, &argv, &Bflag, &Bcnt); ! 167: break; ! 168: ! 169: case 'M': ! 170: getlist(&argc, &argv, &Mflag, &Mcnt); ! 171: break; ! 172: ! 173: case 's': ! 174: zerof(); ! 175: sflag++; ! 176: continue; ! 177: ! 178: case 'u': ! 179: uflag++; ! 180: continue; ! 181: ! 182: case 'b': ! 183: zerof(); ! 184: bflag++; ! 185: continue; ! 186: ! 187: case 'm': ! 188: zerof(); ! 189: mflag++; ! 190: continue; ! 191: ! 192: default: ! 193: goto usage; ! 194: } ! 195: argv++; ! 196: } else ! 197: lookup(*argv++); ! 198: while (--argc > 0); ! 199: exit(0); ! 200: } ! 201: ! 202: getlist(argcp, argvp, flagp, cntp) ! 203: char ***argvp; ! 204: int *argcp; ! 205: char ***flagp; ! 206: int *cntp; ! 207: { ! 208: ! 209: (*argvp)++; ! 210: *flagp = *argvp; ! 211: *cntp = 0; ! 212: for ((*argcp)--; *argcp > 0 && (*argvp)[0][0] != '-'; (*argcp)--) ! 213: (*cntp)++, (*argvp)++; ! 214: (*argcp)++; ! 215: (*argvp)--; ! 216: } ! 217: ! 218: ! 219: zerof() ! 220: { ! 221: ! 222: if (sflag && bflag && mflag) ! 223: sflag = bflag = mflag = 0; ! 224: } ! 225: int count; ! 226: int print; ! 227: ! 228: ! 229: lookup(cp) ! 230: register char *cp; ! 231: { ! 232: register char *dp; ! 233: ! 234: for (dp = cp; *dp; dp++) ! 235: continue; ! 236: for (; dp > cp; dp--) { ! 237: if (*dp == '.') { ! 238: *dp = 0; ! 239: break; ! 240: } ! 241: } ! 242: for (dp = cp; *dp; dp++) ! 243: if (*dp == '/') ! 244: cp = dp + 1; ! 245: if (uflag) { ! 246: print = 0; ! 247: count = 0; ! 248: } else ! 249: print = 1; ! 250: again: ! 251: if (print) ! 252: printf("%s:", cp); ! 253: if (sflag) { ! 254: looksrc(cp); ! 255: if (uflag && print == 0 && count != 1) { ! 256: print = 1; ! 257: goto again; ! 258: } ! 259: } ! 260: count = 0; ! 261: if (bflag) { ! 262: lookbin(cp); ! 263: if (uflag && print == 0 && count != 1) { ! 264: print = 1; ! 265: goto again; ! 266: } ! 267: } ! 268: count = 0; ! 269: if (mflag) { ! 270: lookman(cp); ! 271: if (uflag && print == 0 && count != 1) { ! 272: print = 1; ! 273: goto again; ! 274: } ! 275: } ! 276: if (print) ! 277: printf("\n"); ! 278: } ! 279: ! 280: looksrc(cp) ! 281: char *cp; ! 282: { ! 283: if (Sflag == 0) { ! 284: find(srcdirs, cp); ! 285: } else ! 286: findv(Sflag, Scnt, cp); ! 287: } ! 288: ! 289: lookbin(cp) ! 290: char *cp; ! 291: { ! 292: if (Bflag == 0) ! 293: find(bindirs, cp); ! 294: else ! 295: findv(Bflag, Bcnt, cp); ! 296: } ! 297: ! 298: lookman(cp) ! 299: char *cp; ! 300: { ! 301: if (Mflag == 0) { ! 302: find(mandirs, cp); ! 303: } else ! 304: findv(Mflag, Mcnt, cp); ! 305: } ! 306: ! 307: findv(dirv, dirc, cp) ! 308: char **dirv; ! 309: int dirc; ! 310: char *cp; ! 311: { ! 312: ! 313: while (dirc > 0) ! 314: findin(*dirv++, cp), dirc--; ! 315: } ! 316: ! 317: find(dirs, cp) ! 318: char **dirs; ! 319: char *cp; ! 320: { ! 321: ! 322: while (*dirs) ! 323: findin(*dirs++, cp); ! 324: } ! 325: ! 326: findin(dir, cp) ! 327: char *dir, *cp; ! 328: { ! 329: DIR *dirp; ! 330: struct direct *dp; ! 331: ! 332: dirp = opendir(dir); ! 333: if (dirp == NULL) ! 334: return; ! 335: while ((dp = readdir(dirp)) != NULL) { ! 336: if (itsit(cp, dp->d_name)) { ! 337: count++; ! 338: if (print) ! 339: printf(" %s/%s", dir, dp->d_name); ! 340: } ! 341: } ! 342: closedir(dirp); ! 343: } ! 344: ! 345: itsit(cp, dp) ! 346: register char *cp, *dp; ! 347: { ! 348: register int i = strlen(dp); ! 349: ! 350: if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2)) ! 351: return (1); ! 352: while (*cp && *dp && *cp == *dp) ! 353: cp++, dp++, i--; ! 354: if (*cp == 0 && *dp == 0) ! 355: return (1); ! 356: while (isdigit(*dp)) ! 357: dp++; ! 358: if (*cp == 0 && *dp++ == '.') { ! 359: --i; ! 360: while (i > 0 && *dp) ! 361: if (--i, *dp++ == '.') ! 362: return (*dp++ == 'C' && *dp++ == 0); ! 363: return (1); ! 364: } ! 365: return (0); ! 366: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.