Browse Source

Posix 1003.13 POSIX_MULTI_PROCESS specifies that execle() should
be there, so I just wrote it up.
-Erik

Eric Andersen 23 years ago
parent
commit
99a6ee4b85
1 changed files with 53 additions and 0 deletions
  1. 53 0
      libc/unistd/execle.c

+ 53 - 0
libc/unistd/execle.c

@@ -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;
+}