|
|
1.1 root 1: /*
2: * libc/sys/execvpe.c
3: * Sys exec with an array of arguments and environment,
4: * searching directories specified in PATH.
5: */
6:
7: #include <errno.h>
8: #include <path.h>
9: #include <string.h>
10: #include <stdlib.h>
11:
12: #define SHELL "/bin/sh" /* not DEFSHELL, which is just "sh" */
13:
14:
15: /* execvpe(name, argv, env) */
16: int
17: execvpe(name, argv, env) char *name; char *argv[]; char **env;
18: {
19: register char *p1, *p2, *sp;
20: char fname[MAXPATH];
21: int isabs;
22:
23: if ((sp = getenv("PATH")) == NULL) /* find PATH */
24: sp = DEFPATH; /* or take default */
25: isabs = (strchr(name, PATHSEP) != NULL); /* iff name is absolute */
26: for (;;) {
27: if (isabs)
28: strcpy(fname, name); /* use given name */
29: else {
30: for (p2 = fname; *sp != '\0' && *sp != LISTSEP; )
31: *p2++ = *sp++; /* copy pathname component */
32: if (p2 != fname)
33: *p2++ = PATHSEP; /* append PATHSEP if nonempty */
34: for (p1 = name; *p1 != '\0'; )
35: *p2++ = *p1++; /* append name */
36: *p2 = '\0'; /* and NUL-terminate */
37: }
38: execve(fname, argv, env); /* go for it */
39: if (isabs && errno != ENOEXEC)
40: break; /* failed */
41: if (errno == ENOEXEC) { /* try again with sh */
42: p1 = argv[-1];
43: p2 = argv[0];
44: argv[-1] = SHELL;
45: argv[0] = fname;
46: execve(argv[-1], argv-1, env);
47: argv[-1] = p1;
48: argv[0] = p2;
49: break; /* failed */
50: }
51: if (*sp == '\0')
52: break; /* end of PATH, failed */
53: if (*sp == LISTSEP)
54: sp++;
55: }
56: return -1; /* failed */
57: }
58:
59: /* end of libc/sys/execvpe.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.