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:
8: static char shell[] = "/bin/sh";
9: char *execat(), *getenv();
10: extern errno;
11:
12: execlp(name, argv)
13: char *name, *argv;
14: {
15: return(execvp(name, &argv));
16: }
17:
18: execvp(name, argv)
19: char *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:
67: static char *
68: execat(s1, s2, si)
69: register char *s1, *s2;
70: char *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: }
Defined functions
Defined variables
shell
defined in line
8; used 1 times
Defined macros
NULL
defined in line
6; used 1 times