Research V7 development
[unix-history] / usr / src / libc / gen / execvp.c
CommitLineData
74bfa9a8
DR
1/*
2 * execlp(name, arg,...,0) (like execl, but does path search)
3 * execvp(name, argv) (like execv, but does path search)
4 */
5#include <errno.h>
6#define NULL 0
7
8static char shell[] = "/bin/sh";
9char *execat(), *getenv();
10extern errno;
11
12execlp(name, argv)
13char *name, *argv;
14{
15 return(execvp(name, &argv));
16}
17
18execvp(name, argv)
19char *name, **argv;
20{
21 char *pathstr;
22 register char *cp;
23 char fname[128];
24 char *newargs[256];
25 int i;
26 register unsigned etxtbsy = 1;
27 register eacces = 0;
28
29 if ((pathstr = getenv("PATH")) == NULL)
30 pathstr = ":/bin:/usr/bin";
31 cp = index(name, '/')? "": pathstr;
32
33 do {
34 cp = execat(cp, name, fname);
35 retry:
36 execv(fname, argv);
37 switch(errno) {
38 case ENOEXEC:
39 newargs[0] = "sh";
40 newargs[1] = fname;
41 for (i=1; newargs[i+1]=argv[i]; i++) {
42 if (i>=254) {
43 errno = E2BIG;
44 return(-1);
45 }
46 }
47 execv(shell, newargs);
48 return(-1);
49 case ETXTBSY:
50 if (++etxtbsy > 5)
51 return(-1);
52 sleep(etxtbsy);
53 goto retry;
54 case EACCES:
55 eacces++;
56 break;
57 case ENOMEM:
58 case E2BIG:
59 return(-1);
60 }
61 } while (cp);
62 if (eacces)
63 errno = EACCES;
64 return(-1);
65}
66
67static char *
68execat(s1, s2, si)
69register char *s1, *s2;
70char *si;
71{
72 register char *s;
73
74 s = si;
75 while (*s1 && *s1 != ':' && *s1 != '-')
76 *s++ = *s1++;
77 if (si != s)
78 *s++ = '/';
79 while (*s2)
80 *s++ = *s2++;
81 *s = '\0';
82 return(*s1? ++s1: 0);
83}