xref: /csrg-svn/lib/libc/gen/exec.c (revision 46572)
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