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: int
30: execle (const char *path, const char *arg, ...)
31: {
32: #define INITIAL_ARGV_MAX 1024
33: size_t argv_max = INITIAL_ARGV_MAX;
34: const char *initial_argv[INITIAL_ARGV_MAX];
35: const char **argv = initial_argv;
36: va_list args;
37: argv[0] = arg;
38:
39: va_start (args, arg);
40: unsigned int i = 0;
41: while (argv[i++] != NULL)
42: {
43: if (i == argv_max)
44: {
45: argv_max *= 2;
46: const char **nptr = realloc (argv == initial_argv ? NULL : argv,
47: argv_max * sizeof (const char *));
48: if (nptr == NULL)
49: {
50: if (argv != initial_argv)
51: free (argv);
52: return -1;
53: }
54: if (argv == initial_argv)
55:
56: memcpy (nptr, argv, i * sizeof (const char *));
57:
58: argv = nptr;
59: }
60:
61: argv[i] = va_arg (args, const char *);
62: }
63:
64: const char *const *envp = va_arg (args, const char *const *);
65: va_end (args);
66:
67: int ret = __execve (path, (char *const *) argv, (char *const *) envp);
68: if (argv != initial_argv)
69: free (argv);
70:
71: return ret;
72: }
73: libc_hidden_def (execle)