/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#pragma prototyped2223#include <ast_lib.h>2425#if _lib_execvpe2627#include <ast.h>2829NoN(execvpe)3031#else3233#if defined(__EXPORT__)34__EXPORT__ int execvpe(const char*, char* const[], char* const[]);35#endif3637#include <ast.h>38#include <errno.h>3940#if defined(__EXPORT__)41#define extern __EXPORT__42#endif4344extern int45execvpe(const char* name, char* const argv[], char* const envv[])46{47register const char* path = name;48char buffer[PATH_MAX];4950if (*path != '/' && !(path = pathpath(name, NULL, PATH_REGULAR|PATH_EXECUTE, buffer, sizeof(buffer))))51path = name;52execve(path, argv, envv);53if (errno == ENOEXEC)54{55register char** newargv;56register char** ov;57register char** nv;5859for (ov = (char**)argv; *ov++;);60if (newargv = newof(0, char*, ov + 1 - (char**)argv, 0))61{62nv = newargv;63*nv++ = "sh";64*nv++ = (char*)path;65ov = (char**)argv;66while (*nv++ = *++ov);67path = pathshell();68execve(path, newargv, envv);69free(newargv);70}71else72errno = ENOMEM;73}74return -1;75}7677#endif787980