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