1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <unistd.h>
20: #include <stdarg.h>
21: #include <stddef.h>
22: #include <stdlib.h>
23: #include <string.h>
24:
25: #include <stackinfo.h>
26:
27:
28:
29:
30: int
31: execl (const char *path, const char *arg, ...)
32: {
33: #define INITIAL_ARGV_MAX 1024
34: size_t argv_max = INITIAL_ARGV_MAX;
35: const char *initial_argv[INITIAL_ARGV_MAX];
36: const char **argv = initial_argv;
37: va_list args;
38:
39: argv[0] = arg;
40:
41: va_start (args, arg);
42: unsigned int i = 0;
43: while (argv[i++] != NULL)
44: {
45: if (i == argv_max)
46: {
47: argv_max *= 2;
48: const char **nptr = realloc (argv == initial_argv ? NULL : argv,
49: argv_max * sizeof (const char *));
50: if (nptr == NULL)
51: {
52: if (argv != initial_argv)
53: free (argv);
54: return -1;
55: }
56: if (argv == initial_argv)
57:
58: memcpy (nptr, argv, i * sizeof (const char *));
59:
60: argv = nptr;
61: }
62:
63: argv[i] = va_arg (args, const char *);
64: }
65: va_end (args);
66:
67: int ret = __execve (path, (char *const *) argv, __environ);
68: if (argv != initial_argv)
69: free (argv);
70:
71: return ret;
72: }
73: libc_hidden_def (execl)