chiark / gitweb /
[PATCH] fix klibc's broken strlcpy/strlcat
[elogind.git] / klibc / klibc / exec_l.c
1 /*
2  * exec_l.c
3  *
4  * Common implementation of execl() execle() execlp()
5  */
6
7 #include <stdarg.h>
8 #include <alloca.h>
9 #include <unistd.h>
10
11 int NAME (const char *path, const char *arg0, ...)
12 {
13   va_list ap, cap;
14   int argc = 1, rv;
15   const char **argv, **argp;
16   const char *arg;
17 #if EXEC_E
18   char * const * envp;
19 #else
20 #define envp environ
21 #endif
22
23   va_start(ap, arg0);
24   va_copy(cap, ap);
25
26   /* Count the number of arguments */
27   do {
28     arg = va_arg(cap, const char *);
29     argc++;
30   } while ( arg );
31
32   va_end(cap);
33   
34   /* Allocate memory for the pointer array */ 
35   argp = argv = alloca(argc*sizeof(const char *));
36   if ( !argv ) {
37     va_end(ap);
38     return -1;
39   }
40
41   /* Copy the list into an array */
42   *argp++ = arg0;
43   do {
44     *argp++ = arg = va_arg(ap, const char *);
45   } while ( arg );
46
47 #if EXEC_E
48   /* execle() takes one more argument for the environment pointer */
49   envp = va_arg(ap, char * const *);
50 #endif
51
52   rv = (EXEC_P ? execvpe : execve)(path, (char * const *)argv, envp);
53
54   va_end(ap);
55
56   return rv;
57 }