xref: /original-bsd/lib/libc/gen/exec.c (revision 5ba59b7e)
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