xref: /csrg-svn/lib/libc/gen/exec.c (revision 22086)
1*22086Smckusick #ifndef lint
2*22086Smckusick static char sccsid[] = "@(#)exec.c	5.1 (Berkeley) 06/05/85";
3*22086Smckusick #endif not lint
4*22086Smckusick 
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