1fd543bbfSdonn #if defined(LIBC_SCCS) && !defined(lint) 2*5ba59b7eSdonn static char sccsid[] = "@(#)exec.c 5.4 (Berkeley) 02/23/91"; 3fd543bbfSdonn #endif LIBC_SCCS and not lint 45f770e67Smckusick 5f8f88d12Swnj /* 6f8f88d12Swnj * execlp(name, arg,...,0) (like execl, but does path search) 7f8f88d12Swnj * execvp(name, argv) (like execv, but does path search) 8f8f88d12Swnj */ 9f8f88d12Swnj #include <errno.h> 10*5ba59b7eSdonn #include <stdlib.h> 11*5ba59b7eSdonn #include <string.h> 12*5ba59b7eSdonn #include <unistd.h> 13f8f88d12Swnj 14f8f88d12Swnj static char shell[] = "/bin/sh"; 15f8f88d12Swnj 16*5ba59b7eSdonn int 17f8f88d12Swnj execlp(name, argv) 18*5ba59b7eSdonn const char *name, *argv; 19f8f88d12Swnj { 20f8f88d12Swnj return(execvp(name, &argv)); 21f8f88d12Swnj } 22f8f88d12Swnj 23*5ba59b7eSdonn int 24f8f88d12Swnj execvp(name, argv) 25*5ba59b7eSdonn const char *name; 26*5ba59b7eSdonn char * const *argv; 27f8f88d12Swnj { 28f8f88d12Swnj char *pathstr; 29f8f88d12Swnj register char *cp; 30f8f88d12Swnj char fname[128]; 31733d03f8Sbostic char *newargs[256], *execat(); 32f8f88d12Swnj int i; 33f8f88d12Swnj register unsigned etxtbsy = 1; 34f8f88d12Swnj register eacces = 0; 35f8f88d12Swnj 36f8f88d12Swnj if ((pathstr = getenv("PATH")) == NULL) 37f8f88d12Swnj pathstr = ":/bin:/usr/bin"; 38f8f88d12Swnj cp = index(name, '/')? "": pathstr; 39f8f88d12Swnj 40f8f88d12Swnj do { 41f8f88d12Swnj cp = execat(cp, name, fname); 42f8f88d12Swnj retry: 43f8f88d12Swnj execv(fname, argv); 44f8f88d12Swnj switch(errno) { 45f8f88d12Swnj case ENOEXEC: 46f8f88d12Swnj newargs[0] = "sh"; 47f8f88d12Swnj newargs[1] = fname; 48f8f88d12Swnj for (i=1; newargs[i+1]=argv[i]; i++) { 49f8f88d12Swnj if (i>=254) { 50f8f88d12Swnj errno = E2BIG; 51f8f88d12Swnj return(-1); 52f8f88d12Swnj } 53f8f88d12Swnj } 54f8f88d12Swnj execv(shell, newargs); 55f8f88d12Swnj return(-1); 56f8f88d12Swnj case ETXTBSY: 57f8f88d12Swnj if (++etxtbsy > 5) 58f8f88d12Swnj return(-1); 59f8f88d12Swnj sleep(etxtbsy); 60f8f88d12Swnj goto retry; 61f8f88d12Swnj case EACCES: 62f8f88d12Swnj eacces++; 63f8f88d12Swnj break; 64f8f88d12Swnj case ENOMEM: 65f8f88d12Swnj case E2BIG: 66f8f88d12Swnj return(-1); 67f8f88d12Swnj } 68f8f88d12Swnj } while (cp); 69f8f88d12Swnj if (eacces) 70f8f88d12Swnj errno = EACCES; 71f8f88d12Swnj return(-1); 72f8f88d12Swnj } 73f8f88d12Swnj 74f8f88d12Swnj static char * 75f8f88d12Swnj execat(s1, s2, si) 76f8f88d12Swnj register char *s1, *s2; 77f8f88d12Swnj char *si; 78f8f88d12Swnj { 79f8f88d12Swnj register char *s; 80f8f88d12Swnj 81f8f88d12Swnj s = si; 8269032f84Ssam while (*s1 && *s1 != ':') 83f8f88d12Swnj *s++ = *s1++; 84f8f88d12Swnj if (si != s) 85f8f88d12Swnj *s++ = '/'; 86f8f88d12Swnj while (*s2) 87f8f88d12Swnj *s++ = *s2++; 88f8f88d12Swnj *s = '\0'; 89f8f88d12Swnj return(*s1? ++s1: 0); 90f8f88d12Swnj } 91