|
|
1.1 ! root 1: #if defined(LIBC_SCCS) && !defined(lint) ! 2: static char sccsid[] = "@(#)execvp.c 5.3 (Berkeley) 4/24/88"; ! 3: #endif LIBC_SCCS and not lint ! 4: ! 5: /* ! 6: * execlp(name, arg,...,0) (like execl, but does path search) ! 7: * execvp(name, argv) (like execv, but does path search) ! 8: */ ! 9: #include <errno.h> ! 10: #define NULL 0 ! 11: ! 12: static char shell[] = "/bin/sh"; ! 13: char *getenv(); ! 14: extern errno; ! 15: ! 16: execlp(name, argv) ! 17: char *name, *argv; ! 18: { ! 19: return(execvp(name, &argv)); ! 20: } ! 21: ! 22: execvp(name, argv) ! 23: char *name, **argv; ! 24: { ! 25: char *pathstr; ! 26: register char *cp; ! 27: char fname[128]; ! 28: char *newargs[256], *execat(); ! 29: int i; ! 30: register unsigned etxtbsy = 1; ! 31: register eacces = 0; ! 32: ! 33: if ((pathstr = getenv("PATH")) == NULL) ! 34: pathstr = ":/bin:/usr/bin"; ! 35: cp = index(name, '/')? "": pathstr; ! 36: ! 37: do { ! 38: cp = execat(cp, name, fname); ! 39: retry: ! 40: execv(fname, argv); ! 41: switch(errno) { ! 42: case ENOEXEC: ! 43: newargs[0] = "sh"; ! 44: newargs[1] = fname; ! 45: for (i=1; newargs[i+1]=argv[i]; i++) { ! 46: if (i>=254) { ! 47: errno = E2BIG; ! 48: return(-1); ! 49: } ! 50: } ! 51: execv(shell, newargs); ! 52: return(-1); ! 53: case ETXTBSY: ! 54: if (++etxtbsy > 5) ! 55: return(-1); ! 56: sleep(etxtbsy); ! 57: goto retry; ! 58: case EACCES: ! 59: eacces++; ! 60: break; ! 61: case ENOMEM: ! 62: case E2BIG: ! 63: return(-1); ! 64: } ! 65: } while (cp); ! 66: if (eacces) ! 67: errno = EACCES; ! 68: return(-1); ! 69: } ! 70: ! 71: static char * ! 72: execat(s1, s2, si) ! 73: register char *s1, *s2; ! 74: char *si; ! 75: { ! 76: register char *s; ! 77: ! 78: s = si; ! 79: while (*s1 && *s1 != ':') ! 80: *s++ = *s1++; ! 81: if (si != s) ! 82: *s++ = '/'; ! 83: while (*s2) ! 84: *s++ = *s2++; ! 85: *s = '\0'; ! 86: return(*s1? ++s1: 0); ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.