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