From: Eric Andersen Date: Wed, 18 Apr 2001 22:00:20 +0000 (-0000) Subject: Posix 1003.13 POSIX_MULTI_PROCESS specifies that execle() should X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=99a6ee4b85e3be653e2801f61d171763e1fa6015;p=uclinux-h8%2FuClibc.git Posix 1003.13 POSIX_MULTI_PROCESS specifies that execle() should be there, so I just wrote it up. -Erik --- diff --git a/libc/unistd/execle.c b/libc/unistd/execle.c new file mode 100644 index 000000000..14c7a0bfc --- /dev/null +++ b/libc/unistd/execle.c @@ -0,0 +1,53 @@ + +#include +#include +#include + +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; +}