Loading...
--- Libc/Libc-1725.40.4/gen/FreeBSD/exec.c
+++ Libc/Libc-498/gen/FreeBSD/exec.c
@@ -1,6 +1,4 @@
/*-
- * SPDX-License-Identifier: BSD-3-Clause
- *
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
@@ -12,7 +10,11 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -33,10 +35,11 @@
static char sccsid[] = "@(#)exec.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.27 2009/12/05 18:55:16 ed Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.22 2003/07/01 12:30:03 bde Exp $");
#include "namespace.h"
#include <sys/param.h>
+#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
@@ -47,22 +50,14 @@
#include <stdarg.h>
#include "un-namespace.h"
-#include "libc_private.h"
-
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
-
-static const char execvPe_err_preamble[] = "execvP: ";
-static const char execvPe_err_trailer[] = ": path too long\n";
-
-int
-_execvpe(const char *name, char * const argv[], char * const envp[]);
+
+extern char **environ;
int
execl(const char *name, const char *arg, ...)
{
va_list ap;
- const char **argv;
+ char **argv;
int n;
va_start(ap, arg);
@@ -77,19 +72,18 @@
}
va_start(ap, arg);
n = 1;
- argv[0] = arg;
+ argv[0] = (char *)arg;
while ((argv[n] = va_arg(ap, char *)) != NULL)
n++;
va_end(ap);
- return (_execve(name, __DECONST(char **, argv), environ));
+ return (_execve(name, argv, environ));
}
int
execle(const char *name, const char *arg, ...)
{
va_list ap;
- const char **argv;
- char **envp;
+ char **argv, **envp;
int n;
va_start(ap, arg);
@@ -104,19 +98,19 @@
}
va_start(ap, arg);
n = 1;
- argv[0] = arg;
+ argv[0] = (char *)arg;
while ((argv[n] = va_arg(ap, char *)) != NULL)
n++;
envp = va_arg(ap, char **);
va_end(ap);
- return (_execve(name, __DECONST(char **, argv), envp));
+ return (_execve(name, argv, envp));
}
int
execlp(const char *name, const char *arg, ...)
{
va_list ap;
- const char **argv;
+ char **argv;
int n;
va_start(ap, arg);
@@ -131,15 +125,17 @@
}
va_start(ap, arg);
n = 1;
- argv[0] = arg;
+ argv[0] = (char *)arg;
while ((argv[n] = va_arg(ap, char *)) != NULL)
n++;
va_end(ap);
- return (execvp(name, __DECONST(char **, argv)));
-}
-
-int
-execv(const char *name, char * const *argv)
+ return (execvp(name, argv));
+}
+
+int
+execv(name, argv)
+ const char *name;
+ char * const *argv;
{
(void)_execve(name, argv, environ);
return (-1);
@@ -148,30 +144,34 @@
int
execvp(const char *name, char * const *argv)
{
- return (_execvpe(name, argv, environ));
-}
-
-static int
-execvPe(const char *name, const char *path, char * const *argv,
- char * const *envp)
-{
- const char **memp;
- size_t cnt, lp, ln;
+ const char *path;
+
+ /* Get the path we're searching. */
+ if ((path = getenv("PATH")) == NULL)
+ path = _PATH_DEFPATH;
+
+ return (execvP(name, path, argv));
+}
+
+int
+execvP(name, path, argv)
+ const char *name;
+ const char *path;
+ char * const *argv;
+{
+ char **memp;
+ int cnt, lp, ln;
+ char *p;
int eacces, save_errno;
- char buf[MAXPATHLEN];
- const char *bp, *np, *op, *p;
+ char *bp, *cur, buf[MAXPATHLEN];
struct stat sb;
eacces = 0;
/* If it's an absolute or relative path name, it's easy. */
- if (strchr(name, '/')) {
- bp = name;
-#ifdef __APPLE__
- /* Used to differentiate PATH search vs. not afterwards. */
- path = NULL;
-#endif
- op = NULL;
+ if (index(name, '/')) {
+ bp = (char *)name;
+ cur = NULL;
goto retry;
}
bp = buf;
@@ -182,30 +182,23 @@
return (-1);
}
- op = path;
- ln = strlen(name);
- while (op != NULL) {
- np = strchrnul(op, ':');
-
+ cur = alloca(strlen(path) + 1);
+ if (cur == NULL) {
+ errno = ENOMEM;
+ return (-1);
+ }
+ strcpy(cur, path);
+ while ((p = strsep(&cur, ":")) != NULL) {
/*
* It's a SHELL path -- double, leading and trailing colons
* mean the current directory.
*/
- if (np == op) {
- /* Empty component. */
+ if (*p == '\0') {
p = ".";
lp = 1;
- } else {
- /* Non-empty component. */
- p = op;
- lp = np - op;
- }
-
- /* Advance to the next component or terminate after this. */
- if (*np == '\0')
- op = NULL;
- else
- op = np + 1;
+ } else
+ lp = strlen(p);
+ ln = strlen(name);
/*
* If the path is too long complain. This is a possible
@@ -213,11 +206,10 @@
* the user may execute the wrong program.
*/
if (lp + ln + 2 > sizeof(buf)) {
- (void)_write(STDERR_FILENO, execvPe_err_preamble,
- sizeof(execvPe_err_preamble) - 1);
+ (void)_write(STDERR_FILENO, "execvP: ", 8);
(void)_write(STDERR_FILENO, p, lp);
- (void)_write(STDERR_FILENO, execvPe_err_trailer,
- sizeof(execvPe_err_trailer) - 1);
+ (void)_write(STDERR_FILENO, ": path too long\n",
+ 16);
continue;
}
bcopy(p, buf, lp);
@@ -225,7 +217,7 @@
bcopy(name, buf + lp + 1, ln);
buf[lp + ln + 1] = '\0';
-retry: (void)_execve(bp, argv, envp);
+retry: (void)_execve(bp, argv, environ);
switch (errno) {
case E2BIG:
goto done;
@@ -236,30 +228,15 @@
case ENOEXEC:
for (cnt = 0; argv[cnt]; ++cnt)
;
-
- /*
- * cnt may be 0 above; always allocate at least
- * 3 entries so that we can at least fit "sh", bp, and
- * the NULL terminator. We can rely on cnt to take into
- * account the NULL terminator in all other scenarios,
- * as we drop argv[0].
- */
- memp = alloca(MAX(3, cnt + 2) * sizeof(char *));
+ memp = alloca((cnt + 2) * sizeof(char *));
if (memp == NULL) {
/* errno = ENOMEM; XXX override ENOEXEC? */
goto done;
}
- if (cnt > 0) {
- memp[0] = argv[0];
- memp[1] = bp;
- bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
- } else {
- memp[0] = "sh";
- memp[1] = bp;
- memp[2] = NULL;
- }
- (void)_execve(_PATH_BSHELL,
- __DECONST(char **, memp), envp);
+ memp[0] = "sh";
+ memp[1] = bp;
+ bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
+ (void)_execve(_PATH_BSHELL, memp, environ);
goto done;
case ENOMEM:
goto done;
@@ -289,40 +266,10 @@
goto done;
}
}
-
if (eacces)
errno = EACCES;
-#ifdef __APPLE__
- /*
- * Preserve errno from execve(2) if it wasn't a PATH search, or
- * if it was a PATH search and we bailed out early. Note that every
- * branch in the loop jumps to the `done` label to preserve errno, so
- * this is more of a defensive check.
- */
- else if (path != NULL && op == NULL)
-#else
else
-#endif
errno = ENOENT;
- /* else use existing errno from _execve */
done:
return (-1);
}
-
-int
-execvP(const char *name, const char *path, char * const argv[])
-{
- return execvPe(name, path, argv, environ);
-}
-
-__private_extern__ int
-_execvpe(const char *name, char * const argv[], char * const envp[])
-{
- const char *path;
-
- /* Get the path we're searching. */
- if ((path = getenv("PATH")) == NULL)
- path = _PATH_DEFPATH;
-
- return (execvPe(name, path, argv, envp));
-}