126549Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*46572Sdonn static char sccsid[] = "@(#)exec.c 5.4 (Berkeley) 02/23/91"; 326549Sdonn #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> 10*46572Sdonn #include <stdlib.h> 11*46572Sdonn #include <string.h> 12*46572Sdonn #include <unistd.h> 131965Swnj 141965Swnj static char shell[] = "/bin/sh"; 151965Swnj 16*46572Sdonn int 171965Swnj execlp(name, argv) 18*46572Sdonn const char *name, *argv; 191965Swnj { 201965Swnj return(execvp(name, &argv)); 211965Swnj } 221965Swnj 23*46572Sdonn int 241965Swnj execvp(name, argv) 25*46572Sdonn const char *name; 26*46572Sdonn char * const *argv; 271965Swnj { 281965Swnj char *pathstr; 291965Swnj register char *cp; 301965Swnj char fname[128]; 3134089Sbostic char *newargs[256], *execat(); 321965Swnj int i; 331965Swnj register unsigned etxtbsy = 1; 341965Swnj register eacces = 0; 351965Swnj 361965Swnj if ((pathstr = getenv("PATH")) == NULL) 371965Swnj pathstr = ":/bin:/usr/bin"; 381965Swnj cp = index(name, '/')? "": pathstr; 391965Swnj 401965Swnj do { 411965Swnj cp = execat(cp, name, fname); 421965Swnj retry: 431965Swnj execv(fname, argv); 441965Swnj switch(errno) { 451965Swnj case ENOEXEC: 461965Swnj newargs[0] = "sh"; 471965Swnj newargs[1] = fname; 481965Swnj for (i=1; newargs[i+1]=argv[i]; i++) { 491965Swnj if (i>=254) { 501965Swnj errno = E2BIG; 511965Swnj return(-1); 521965Swnj } 531965Swnj } 541965Swnj execv(shell, newargs); 551965Swnj return(-1); 561965Swnj case ETXTBSY: 571965Swnj if (++etxtbsy > 5) 581965Swnj return(-1); 591965Swnj sleep(etxtbsy); 601965Swnj goto retry; 611965Swnj case EACCES: 621965Swnj eacces++; 631965Swnj break; 641965Swnj case ENOMEM: 651965Swnj case E2BIG: 661965Swnj return(-1); 671965Swnj } 681965Swnj } while (cp); 691965Swnj if (eacces) 701965Swnj errno = EACCES; 711965Swnj return(-1); 721965Swnj } 731965Swnj 741965Swnj static char * 751965Swnj execat(s1, s2, si) 761965Swnj register char *s1, *s2; 771965Swnj char *si; 781965Swnj { 791965Swnj register char *s; 801965Swnj 811965Swnj s = si; 8217259Ssam while (*s1 && *s1 != ':') 831965Swnj *s++ = *s1++; 841965Swnj if (si != s) 851965Swnj *s++ = '/'; 861965Swnj while (*s2) 871965Swnj *s++ = *s2++; 881965Swnj *s = '\0'; 891965Swnj return(*s1? ++s1: 0); 901965Swnj } 91