1*26549Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*26549Sdonn static char sccsid[] = "@(#)exec.c 5.2 (Berkeley) 03/09/86"; 3*26549Sdonn #endif LIBC_SCCS and not lint 422086Smckusick 51965Swnj /* 61965Swnj * execlp(name, arg,...,0) (like execl, but does path search) 71965Swnj * execvp(name, argv) (like execv, but does path search) 81965Swnj */ 91965Swnj #include <errno.h> 101965Swnj #define NULL 0 111965Swnj 121965Swnj static char shell[] = "/bin/sh"; 131965Swnj char *execat(), *getenv(); 141965Swnj extern errno; 151965Swnj 161965Swnj execlp(name, argv) 171965Swnj char *name, *argv; 181965Swnj { 191965Swnj return(execvp(name, &argv)); 201965Swnj } 211965Swnj 221965Swnj execvp(name, argv) 231965Swnj char *name, **argv; 241965Swnj { 251965Swnj char *pathstr; 261965Swnj register char *cp; 271965Swnj char fname[128]; 281965Swnj char *newargs[256]; 291965Swnj int i; 301965Swnj register unsigned etxtbsy = 1; 311965Swnj register eacces = 0; 321965Swnj 331965Swnj if ((pathstr = getenv("PATH")) == NULL) 341965Swnj pathstr = ":/bin:/usr/bin"; 351965Swnj cp = index(name, '/')? "": pathstr; 361965Swnj 371965Swnj do { 381965Swnj cp = execat(cp, name, fname); 391965Swnj retry: 401965Swnj execv(fname, argv); 411965Swnj switch(errno) { 421965Swnj case ENOEXEC: 431965Swnj newargs[0] = "sh"; 441965Swnj newargs[1] = fname; 451965Swnj for (i=1; newargs[i+1]=argv[i]; i++) { 461965Swnj if (i>=254) { 471965Swnj errno = E2BIG; 481965Swnj return(-1); 491965Swnj } 501965Swnj } 511965Swnj execv(shell, newargs); 521965Swnj return(-1); 531965Swnj case ETXTBSY: 541965Swnj if (++etxtbsy > 5) 551965Swnj return(-1); 561965Swnj sleep(etxtbsy); 571965Swnj goto retry; 581965Swnj case EACCES: 591965Swnj eacces++; 601965Swnj break; 611965Swnj case ENOMEM: 621965Swnj case E2BIG: 631965Swnj return(-1); 641965Swnj } 651965Swnj } while (cp); 661965Swnj if (eacces) 671965Swnj errno = EACCES; 681965Swnj return(-1); 691965Swnj } 701965Swnj 711965Swnj static char * 721965Swnj execat(s1, s2, si) 731965Swnj register char *s1, *s2; 741965Swnj char *si; 751965Swnj { 761965Swnj register char *s; 771965Swnj 781965Swnj s = si; 7917259Ssam while (*s1 && *s1 != ':') 801965Swnj *s++ = *s1++; 811965Swnj if (si != s) 821965Swnj *s++ = '/'; 831965Swnj while (*s2) 841965Swnj *s++ = *s2++; 851965Swnj *s = '\0'; 861965Swnj return(*s1? ++s1: 0); 871965Swnj } 88