]> git.saurik.com Git - apple/libc.git/blobdiff - gen/FreeBSD/exec.c
Libc-1439.100.3.tar.gz
[apple/libc.git] / gen / FreeBSD / exec.c
index 211eb78f2efd762e253f1722d41f046405981b3e..86cf33534f033701c5feb02fdd1ad77c093ccb07 100644 (file)
  * 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. 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.
@@ -35,7 +31,7 @@
 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.22 2003/07/01 12:30:03 bde Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.27 2009/12/05 18:55:16 ed Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
@@ -50,14 +46,19 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.22 2003/07/01 12:30:03 bde Exp $
 
 #include <stdarg.h>
 #include "un-namespace.h"
+#include "libc_private.h"
 
-extern char **environ;
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+
+int
+_execvpe(const char *name, char * const argv[], char * const envp[]);
 
 int
 execl(const char *name, const char *arg, ...)
 {
        va_list ap;
-       char **argv;
+       const char **argv;
        int n;
 
        va_start(ap, arg);
@@ -72,18 +73,19 @@ execl(const char *name, const char *arg, ...)
        }
        va_start(ap, arg);
        n = 1;
-       argv[0] = (char *)arg;
+       argv[0] = arg;
        while ((argv[n] = va_arg(ap, char *)) != NULL)
                n++;
        va_end(ap);
-       return (_execve(name, argv, environ));
+       return (_execve(name, __DECONST(char **, argv), environ));
 }
 
 int
 execle(const char *name, const char *arg, ...)
 {
        va_list ap;
-       char **argv, **envp;
+       const char **argv;
+       char **envp;
        int n;
 
        va_start(ap, arg);
@@ -98,19 +100,19 @@ execle(const char *name, const char *arg, ...)
        }
        va_start(ap, arg);
        n = 1;
-       argv[0] = (char *)arg;
+       argv[0] = arg;
        while ((argv[n] = va_arg(ap, char *)) != NULL)
                n++;
        envp = va_arg(ap, char **);
        va_end(ap);
-       return (_execve(name, argv, envp));
+       return (_execve(name, __DECONST(char **, argv), envp));
 }
 
 int
 execlp(const char *name, const char *arg, ...)
 {
        va_list ap;
-       char **argv;
+       const char **argv;
        int n;
 
        va_start(ap, arg);
@@ -125,11 +127,11 @@ execlp(const char *name, const char *arg, ...)
        }
        va_start(ap, arg);
        n = 1;
-       argv[0] = (char *)arg;
+       argv[0] = arg;
        while ((argv[n] = va_arg(ap, char *)) != NULL)
                n++;
        va_end(ap);
-       return (execvp(name, argv));
+       return (execvp(name, __DECONST(char **, argv)));
 }
 
 int
@@ -144,33 +146,25 @@ execv(name, argv)
 int
 execvp(const char *name, char * const *argv)
 {
-       const char *path;
-
-       /* Get the path we're searching. */
-       if ((path = getenv("PATH")) == NULL)
-               path = _PATH_DEFPATH;
-
-       return (execvP(name, path, argv));
+       return (_execvpe(name, argv, environ));
 }
 
-int
-execvP(name, path, argv)
-       const char *name;
-       const char *path;
-       char * const *argv;
+static int
+execvPe(const char *name, const char *path, char * const *argv,
+    char * const *envp)
 {
-       char **memp;
-       int cnt, lp, ln;
-       char *p;
+       const char **memp;
+       size_t cnt, lp, ln;
        int eacces, save_errno;
-       char *bp, *cur, buf[MAXPATHLEN];
+       char *cur, buf[MAXPATHLEN];
+       const char *p, *bp;
        struct stat sb;
 
        eacces = 0;
 
        /* If it's an absolute or relative path name, it's easy. */
        if (index(name, '/')) {
-               bp = (char *)name;
+               bp = name;
                cur = NULL;
                goto retry;
        }
@@ -217,7 +211,7 @@ execvP(name, path, argv)
                bcopy(name, buf + lp + 1, ln);
                buf[lp + ln + 1] = '\0';
 
-retry:         (void)_execve(bp, argv, environ);
+retry:         (void)_execve(bp, argv, envp);
                switch (errno) {
                case E2BIG:
                        goto done;
@@ -236,7 +230,8 @@ retry:              (void)_execve(bp, argv, environ);
                        memp[0] = "sh";
                        memp[1] = bp;
                        bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
-                       (void)_execve(_PATH_BSHELL, memp, environ);
+                       (void)_execve(_PATH_BSHELL,
+                           __DECONST(char **, memp), envp);
                        goto done;
                case ENOMEM:
                        goto done;
@@ -268,8 +263,27 @@ retry:             (void)_execve(bp, argv, environ);
        }
        if (eacces)
                errno = EACCES;
-       else
+       else if (cur)
                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));
+}