1b78dcb87SJohan Karlsson /* $NetBSD: whereis.c,v 1.11 2002/06/11 06:06:21 itojun Exp $ */ 2b78dcb87SJohan Karlsson /* $FreeBSD$ */ 3b78dcb87SJohan Karlsson 4b78dcb87SJohan Karlsson /*- 5b78dcb87SJohan Karlsson * Copyright (c) 1993 6b78dcb87SJohan Karlsson * The Regents of the University of California. All rights reserved. 7b78dcb87SJohan Karlsson * 8b78dcb87SJohan Karlsson * Redistribution and use in source and binary forms, with or without 9b78dcb87SJohan Karlsson * modification, are permitted provided that the following conditions 10b78dcb87SJohan Karlsson * are met: 11b78dcb87SJohan Karlsson * 1. Redistributions of source code must retain the above copyright 12b78dcb87SJohan Karlsson * notice, this list of conditions and the following disclaimer. 13b78dcb87SJohan Karlsson * 2. Redistributions in binary form must reproduce the above copyright 14b78dcb87SJohan Karlsson * notice, this list of conditions and the following disclaimer in the 15b78dcb87SJohan Karlsson * documentation and/or other materials provided with the distribution. 16b78dcb87SJohan Karlsson * 3. All advertising materials mentioning features or use of this software 17b78dcb87SJohan Karlsson * must display the following acknowledgement: 18b78dcb87SJohan Karlsson * This product includes software developed by the University of 19b78dcb87SJohan Karlsson * California, Berkeley and its contributors. 20b78dcb87SJohan Karlsson * 4. Neither the name of the University nor the names of its contributors 21b78dcb87SJohan Karlsson * may be used to endorse or promote products derived from this software 22b78dcb87SJohan Karlsson * without specific prior written permission. 23b78dcb87SJohan Karlsson * 24b78dcb87SJohan Karlsson * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25b78dcb87SJohan Karlsson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26b78dcb87SJohan Karlsson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27b78dcb87SJohan Karlsson * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28b78dcb87SJohan Karlsson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29b78dcb87SJohan Karlsson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30b78dcb87SJohan Karlsson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31b78dcb87SJohan Karlsson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32b78dcb87SJohan Karlsson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33b78dcb87SJohan Karlsson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34b78dcb87SJohan Karlsson * SUCH DAMAGE. 35b78dcb87SJohan Karlsson */ 36b78dcb87SJohan Karlsson 37b78dcb87SJohan Karlsson #include <sys/cdefs.h> 38b78dcb87SJohan Karlsson 399d1b456eSJohan Karlsson __FBSDID("$FreeBSD$"); 409d1b456eSJohan Karlsson 41b78dcb87SJohan Karlsson #if 0 42b78dcb87SJohan Karlsson static char sccsid[] = "@(#)whereis.c 8.3 (Berkeley) 5/4/95"; 43b78dcb87SJohan Karlsson #endif 44b78dcb87SJohan Karlsson 45b78dcb87SJohan Karlsson #include <sys/param.h> 46b78dcb87SJohan Karlsson #include <sys/stat.h> 47b78dcb87SJohan Karlsson #include <sys/sysctl.h> 48b78dcb87SJohan Karlsson 49b78dcb87SJohan Karlsson #include <err.h> 50b78dcb87SJohan Karlsson #include <errno.h> 51b78dcb87SJohan Karlsson #include <stdio.h> 52b78dcb87SJohan Karlsson #include <stdlib.h> 53b78dcb87SJohan Karlsson #include <string.h> 54b78dcb87SJohan Karlsson #include <unistd.h> 55b78dcb87SJohan Karlsson 56b78dcb87SJohan Karlsson void usage __P((void)); 57b78dcb87SJohan Karlsson int main __P((int, char *[])); 58b78dcb87SJohan Karlsson 59b78dcb87SJohan Karlsson int 60b78dcb87SJohan Karlsson main(argc, argv) 61b78dcb87SJohan Karlsson int argc; 62b78dcb87SJohan Karlsson char *argv[]; 63b78dcb87SJohan Karlsson { 64b78dcb87SJohan Karlsson struct stat sb; 65b78dcb87SJohan Karlsson size_t len; 66b78dcb87SJohan Karlsson int ch, sverrno, mib[2]; 67b78dcb87SJohan Karlsson char *p, *t, *std, path[MAXPATHLEN]; 68b78dcb87SJohan Karlsson int useenvpath = 0; 69b78dcb87SJohan Karlsson 70b78dcb87SJohan Karlsson while ((ch = getopt(argc, argv, "p")) != -1) 71b78dcb87SJohan Karlsson switch (ch) { 72b78dcb87SJohan Karlsson case 'p': 73b78dcb87SJohan Karlsson useenvpath = 1; /* use environment for PATH */ 74b78dcb87SJohan Karlsson break; 75b78dcb87SJohan Karlsson 76b78dcb87SJohan Karlsson case '?': 77b78dcb87SJohan Karlsson default: 78b78dcb87SJohan Karlsson usage(); 79b78dcb87SJohan Karlsson } 80b78dcb87SJohan Karlsson argc -= optind; 81b78dcb87SJohan Karlsson argv += optind; 82b78dcb87SJohan Karlsson 83b78dcb87SJohan Karlsson if (argc == 0) 84b78dcb87SJohan Karlsson usage(); 85b78dcb87SJohan Karlsson 86b78dcb87SJohan Karlsson if (useenvpath) { 87b78dcb87SJohan Karlsson if ((std = getenv("PATH")) == NULL) 88b78dcb87SJohan Karlsson err(1, "getenv: PATH" ); 89b78dcb87SJohan Karlsson } else { 90b78dcb87SJohan Karlsson /* Retrieve the standard path. */ 91b78dcb87SJohan Karlsson mib[0] = CTL_USER; 92b78dcb87SJohan Karlsson mib[1] = USER_CS_PATH; 93b78dcb87SJohan Karlsson if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) 94b78dcb87SJohan Karlsson return (-1); 95b78dcb87SJohan Karlsson if (len == 0) 96b78dcb87SJohan Karlsson err(1, "user_cs_path: sysctl: zero length"); 97b78dcb87SJohan Karlsson if ((std = malloc(len)) == NULL) 98b78dcb87SJohan Karlsson err(1, NULL); 99b78dcb87SJohan Karlsson if (sysctl(mib, 2, std, &len, NULL, 0) == -1) { 100b78dcb87SJohan Karlsson sverrno = errno; 101b78dcb87SJohan Karlsson free(std); 102b78dcb87SJohan Karlsson errno = sverrno; 103b78dcb87SJohan Karlsson err(1, "sysctl: user_cs_path"); 104b78dcb87SJohan Karlsson } 105b78dcb87SJohan Karlsson } 106b78dcb87SJohan Karlsson 107b78dcb87SJohan Karlsson /* For each path, for each program... */ 108b78dcb87SJohan Karlsson for (; *argv; ++argv) 109b78dcb87SJohan Karlsson for (p = std;; *p++ = ':') { 110b78dcb87SJohan Karlsson t = p; 111b78dcb87SJohan Karlsson if ((p = strchr(p, ':')) != NULL) { 112b78dcb87SJohan Karlsson *p = '\0'; 113b78dcb87SJohan Karlsson if (t == p) 114b78dcb87SJohan Karlsson t = "."; 115b78dcb87SJohan Karlsson } else 116b78dcb87SJohan Karlsson if (strlen(t) == 0) 117b78dcb87SJohan Karlsson t = "."; 118b78dcb87SJohan Karlsson (void)snprintf(path, sizeof(path), "%s/%s", t, *argv); 119b78dcb87SJohan Karlsson if (!stat(path, &sb)) 120b78dcb87SJohan Karlsson (void)printf("%s\n", path); 121b78dcb87SJohan Karlsson if (p == NULL) 122b78dcb87SJohan Karlsson break; 123b78dcb87SJohan Karlsson } 124b78dcb87SJohan Karlsson 125b78dcb87SJohan Karlsson return (0); 126b78dcb87SJohan Karlsson } 127b78dcb87SJohan Karlsson 128b78dcb87SJohan Karlsson void 129b78dcb87SJohan Karlsson usage() 130b78dcb87SJohan Karlsson { 131b78dcb87SJohan Karlsson 132b78dcb87SJohan Karlsson (void)fprintf(stderr, "usage: whereis [-p] program [...]\n"); 133b78dcb87SJohan Karlsson exit (1); 134b78dcb87SJohan Karlsson } 135