xref: /netbsd/usr.bin/mkdep/findcc.c (revision c4a72b64)
1 /* $NetBSD: findcc.c,v 1.1 2002/06/14 23:14:18 simonb Exp $ */
2 
3 /*-
4  * Copyright (c) 1999 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Matthias Scheler.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the NetBSD
21  *	Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #include <sys/cdefs.h>
40 #if defined(__COPYRIGHT) && !defined(lint)
41 __COPYRIGHT("@(#) Copyright (c) 1999 The NetBSD Foundation, Inc.\n\
42 	All rights reserved.\n");
43 #endif /* not lint */
44 
45 #if defined(__RCSID) && !defined(lint)
46 __RCSID("$NetBSD: findcc.c,v 1.1 2002/06/14 23:14:18 simonb Exp $");
47 #endif /* not lint */
48 
49 #if HAVE_CONFIG_H
50 #include "config.h"
51 #endif
52 
53 #include <sys/param.h>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <string.h>
57 #include <unistd.h>
58 
59 #include "findcc.h"
60 
61 char *
62 findcc(progname)
63 	const char	*progname;
64 {
65 	char   *path, *dir, *next;
66 	char   buffer[MAXPATHLEN];
67 
68 	if ((next = strchr(progname, ' ')) != NULL) {
69 		*next = '\0';
70 	}
71 
72 	if (strchr(progname, '/') != NULL)
73 		return access(progname, X_OK) ? NULL : strdup(progname);
74 
75 	if (((path = getenv("PATH")) == NULL) ||
76 	    ((path = strdup(path)) == NULL))
77 		return NULL;
78 
79 	dir = path;
80 	while (dir != NULL) {
81 		if ((next = strchr(dir, ':')) != NULL)
82 			*next++ = '\0';
83 
84 		if (snprintf(buffer, sizeof(buffer),
85 		    "%s/%s", dir, progname) < sizeof(buffer)) {
86 			if (!access(buffer, X_OK)) {
87 				free(path);
88 				return strdup(buffer);
89 			}
90 		}
91 		dir = next;
92 	}
93 
94 	free(path);
95 	return NULL;
96 }
97 
98