d799ddae248403fd6a41df818e7b6d957abfc60d
[musl] / src / process / execvp.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <errno.h>
5
6 extern char **__environ;
7
8 int execvp(const char *file, char *const argv[])
9 {
10         const char *p, *z, *path = getenv("PATH");
11         int l;
12
13         if (strchr(file, '/'))
14                 return execve(file, argv, __environ);
15
16         /* FIXME: integer overflows */
17         if (!path) path = "/usr/local/bin:/bin:/usr/bin";
18         l = strlen(file) + strlen(path) + 2;
19
20         for(p=path; p && *p; p=z) {
21                 char b[l];
22                 z = strchr(p, ':');
23                 if (z) {
24                         memcpy(b, p, z-p);
25                         b[z++-p] = 0;
26                 } else strcpy(b, p);
27                 strcat(b, "/");
28                 strcat(b, file);
29                 if (!access(b, X_OK))
30                         return execve(b, argv, __environ);
31         }
32         errno = ENOENT;
33         return -1;
34 }