14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #pragma prototyped 234887Schin 244887Schin #include <ast_lib.h> 254887Schin 264887Schin #if _lib_execvpe 274887Schin 284887Schin #include <ast.h> 294887Schin 304887Schin NoN(execvpe) 314887Schin 324887Schin #else 334887Schin 344887Schin #if defined(__EXPORT__) 354887Schin __EXPORT__ int execvpe(const char*, char* const[], char* const[]); 364887Schin #endif 374887Schin 384887Schin #include <ast.h> 394887Schin #include <errno.h> 404887Schin 414887Schin #if defined(__EXPORT__) 424887Schin #define extern __EXPORT__ 434887Schin #endif 444887Schin 454887Schin extern int 464887Schin execvpe(const char* name, char* const argv[], char* const envv[]) 474887Schin { 484887Schin register const char* path = name; 494887Schin char buffer[PATH_MAX]; 504887Schin 514887Schin if (*path != '/' && !(path = pathpath(buffer, name, NULL, PATH_REGULAR|PATH_EXECUTE))) 524887Schin path = name; 534887Schin execve(path, argv, envv); 544887Schin if (errno == ENOEXEC) 554887Schin { 564887Schin register char** newargv; 574887Schin register char** ov; 584887Schin register char** nv; 594887Schin 604887Schin for (ov = (char**)argv; *ov++;); 614887Schin if (newargv = newof(0, char*, ov + 1 - (char**)argv, 0)) 624887Schin { 634887Schin nv = newargv; 644887Schin *nv++ = "sh"; 654887Schin *nv++ = (char*)path; 664887Schin ov = (char**)argv; 674887Schin while (*nv++ = *++ov); 684887Schin path = pathshell(); 694887Schin execve(path, newargv, envv); 704887Schin free(newargv); 714887Schin } 724887Schin else 734887Schin errno = ENOMEM; 744887Schin } 754887Schin return -1; 764887Schin } 774887Schin 784887Schin #endif 79