/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2009 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped #include #if _lib_execvpe #include NoN(execvpe) #else #if defined(__EXPORT__) __EXPORT__ int execvpe(const char*, char* const[], char* const[]); #endif #include #include #if defined(__EXPORT__) #define extern __EXPORT__ #endif extern int execvpe(const char* name, char* const argv[], char* const envv[]) { register const char* path = name; char buffer[PATH_MAX]; if (*path != '/' && !(path = pathpath(buffer, name, NULL, PATH_REGULAR|PATH_EXECUTE))) path = name; execve(path, argv, envv); if (errno == ENOEXEC) { register char** newargv; register char** ov; register char** nv; for (ov = (char**)argv; *ov++;); if (newargv = newof(0, char*, ov + 1 - (char**)argv, 0)) { nv = newargv; *nv++ = "sh"; *nv++ = (char*)path; ov = (char**)argv; while (*nv++ = *++ov); path = pathshell(); execve(path, newargv, envv); free(newargv); } else errno = ENOMEM; } return -1; } #endif