3 % (c) The GRASP/AQUA Project, Glasgow University, 1995-1996
5 \subsection[posix.lc]{executeFile Runtime Support}
10 #define NON_POSIX_SOURCE
17 * We want the search semantics of execvp, but we want to provide our
18 * own environment, like execve. The following copyright applies to
19 * this code, as it is a derivative of execvp:
21 * Copyright (c) 1991 The Regents of the University of California.
22 * All rights reserved.
24 * Redistribution and use in source and binary forms, with or without
25 * modification, are permitted provided that the following conditions
27 * 1. Redistributions of source code must retain the above copyright
28 * notice, this list of conditions and the following disclaimer.
29 * 2. Redistributions in binary form must reproduce the above copyright
30 * notice, this list of conditions and the following disclaimer in the
31 * documentation and/or other materials provided with the distribution.
32 * 3. All advertising materials mentioning features or use of this software
33 * must display the following acknowledgement:
34 * This product includes software developed by the University of
35 * California, Berkeley and its contributors.
36 * 4. Neither the name of the University nor the names of its contributors
37 * may be used to endorse or promote products derived from this software
38 * without specific prior written permission.
40 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 execvpe(char *name, char **argv, char **envp)
59 char *bp, *cur, *path, *buf;
61 /* If it's an absolute or relative path name, it's easy. */
62 if (strchr(name, '/')) {
64 cur = path = buf = NULL;
68 /* Get the path we're searching. */
69 if (!(path = getenv("PATH"))) {
71 ln = confstr(_CS_PATH, NULL, 0);
72 if ((cur = path = malloc(ln + 1)) != NULL) {
74 (void) confstr (_CS_PATH, path + 1, ln);
77 if ((cur = path = malloc(1 + 1)) != NULL) {
83 cur = path = strDup(path);
85 if (path == NULL || (bp = buf = malloc(strlen(path)+strlen(name)+2)) == NULL)
91 if ((cur = strchr(cur, ':')) != NULL)
95 * It's a SHELL path -- double, leading and trailing colons mean the current
107 memcpy(buf + lp + 1, name, ln);
108 buf[lp + ln + 1] = '\0';
111 (void) execve(bp, argv, envp);
123 for (cnt = 0, ap = (char **) argv; *ap; ++ap, ++cnt)
125 if ((ap = malloc((cnt + 2) * sizeof(char *))) != NULL) {
126 memcpy(ap + 2, argv + 1, cnt * sizeof(char *));
130 (void) execve("/bin/sh", ap, envp);
137 (void) sleep(++etxtbsy);