summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>1998-10-14 18:53:36 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>1998-10-14 18:53:36 +0000
commitdea625c8721c5a896b6d2e8c5209fc6ef4802f01 (patch)
tree4b01db186cb625891e1db183d371a8b6343387e9
parent27f612d03f28288a629cdf1ec130d433c45cb02c (diff)
Notes
-rw-r--r--lib/libc/gen/exec.c28
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