Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/klibc/exec_l.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 1011 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 niro 532 /*
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     char *const *envp;
18    
19     va_start(ap, arg0);
20     va_copy(cap, ap);
21    
22     /* Count the number of arguments */
23     do {
24     arg = va_arg(cap, const char *);
25     argc++;
26     } while (arg);
27    
28     va_end(cap);
29    
30     /* Allocate memory for the pointer array */
31     argp = argv = alloca(argc * sizeof(const char *));
32     if (!argv) {
33     va_end(ap);
34     return -1;
35     }
36    
37     /* Copy the list into an array */
38     *argp++ = arg0;
39     do {
40     *argp++ = arg = va_arg(ap, const char *);
41     } while (arg);
42    
43     #if EXEC_E
44     /* execle() takes one more argument for the environment pointer */
45     envp = va_arg(ap, char *const *);
46     #else
47     envp = environ;
48     #endif
49    
50     #if EXEC_P
51     rv = execvpe(path, (char * const *)argv, envp);
52     #else
53     rv = execve(path, (char * const *)argv, envp);
54     #endif
55    
56     va_end(ap);
57    
58     return rv;
59     }