diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 1998-10-14 18:53:36 +0000 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 1998-10-14 18:53:36 +0000 |
| commit | dea625c8721c5a896b6d2e8c5209fc6ef4802f01 (patch) | |
| tree | 4b01db186cb625891e1db183d371a8b6343387e9 | |
| parent | 27f612d03f28288a629cdf1ec130d433c45cb02c (diff) | |
Notes
| -rw-r--r-- | lib/libc/gen/exec.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/libc/gen/exec.c b/lib/libc/gen/exec.c index 3b77ee9d7c83..0770ab31e177 100644 --- a/lib/libc/gen/exec.c +++ b/lib/libc/gen/exec.c @@ -36,7 +36,7 @@ static char sccsid[] = "@(#)exec.c 8.1 (Berkeley) 6/4/93"; #endif static const char rcsid[] = - "$Id: exec.c,v 1.6 1997/10/14 07:23:16 bde Exp $"; + "$Id: exec.c,v 1.7 1997/11/20 15:09:38 bde Exp $"; #endif /* LIBC_SCCS and not lint */ #include <sys/param.h> @@ -102,21 +102,33 @@ execl(name, arg, va_alist) #endif { va_list ap; - int sverrno; char **argv; + int n; + /* The following code is ugly, but makes execl() vfork()-safe. */ + #if __STDC__ va_start(ap, arg); #else va_start(ap); #endif - if ( (argv = buildargv(ap, arg, NULL)) ) - (void)execve(name, argv, environ); + n = 0; + while (va_arg(ap, char *) != NULL) + n++ ; va_end(ap); - sverrno = errno; - free(argv); - errno = sverrno; - return (-1); + argv = (char **)alloca((n + 1) * sizeof(*argv)); + if (argv == NULL) + return (-1); +#if __STDC__ + va_start(ap, arg); +#else + va_start(ap); +#endif + n = 0; + while ((argv[n] = va_arg(ap, char *)) != NULL) + n++; + va_end(ap); + return (execve(name, argv, environ)); } int |
