OSDN Git Service

Posix 1003.13 POSIX_MULTI_PROCESS specifies that execle() should
authorEric Andersen <andersen@codepoet.org>
Wed, 18 Apr 2001 22:00:20 +0000 (22:00 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 18 Apr 2001 22:00:20 +0000 (22:00 -0000)
be there, so I just wrote it up.
 -Erik

libc/unistd/execle.c [new file with mode: 0644]

diff --git a/libc/unistd/execle.c b/libc/unistd/execle.c
new file mode 100644 (file)
index 0000000..14c7a0b
--- /dev/null
@@ -0,0 +1,53 @@
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+extern int execvep(const char *path, char *const argv[], char *const envp[]);
+
+int execle(const char *file, const char *arg, ...)
+{
+       const char *shortargv[16];
+       const char **argv;
+       const char *c;
+       int i;
+       va_list args;
+       const char *const *envp;
+
+       i = 1;
+
+       va_start(args, arg);
+
+       do {
+               c = va_arg(args, const char *);
+
+               i++;
+       } while (c);
+
+       va_end(args);
+
+       if (i <= 16)
+               argv = shortargv;
+       else {
+               argv = (const char **) alloca(sizeof(char *) * i);
+       }
+
+       argv[0] = arg;
+       i = 1;
+
+       va_start(args, arg);
+
+       do {
+               argv[i] = va_arg(args, const char *);
+       } while (argv[i++]);
+
+       envp = va_arg (args, const char *const *);
+       va_end(args);
+
+       i = execvep(file, (char *const *) argv, (char *const *) envp);
+
+       if (argv != shortargv)
+               free(argv);
+
+       return i;
+}