#include <errno.h>
#include <limits.h>
-extern char **environ;
+extern char **__environ;
int __execvpe(const char *file, char *const argv[], char *const envp[])
{
const char *p, *z, *path = getenv("PATH");
size_t l, k;
+ int seen_eacces = 0;
errno = ENOENT;
if (!*file) return -1;
for(p=path; ; p=z) {
char b[l+k+1];
- z = strchr(p, ':');
- if (!z) z = p+strlen(p);
+ z = __strchrnul(p, ':');
if (z-p >= l) {
if (!*z++) break;
continue;
b[z-p] = '/';
memcpy(b+(z-p)+(z>p), file, k+1);
execve(b, argv, envp);
- if (errno != ENOENT) return -1;
+ switch (errno) {
+ case EACCES:
+ seen_eacces = 1;
+ case ENOENT:
+ case ENOTDIR:
+ break;
+ default:
+ return -1;
+ }
if (!*z++) break;
}
+ if (seen_eacces) errno = EACCES;
return -1;
}
int execvp(const char *file, char *const argv[])
{
- return __execvpe(file, argv, environ);
+ return __execvpe(file, argv, __environ);
}
+
+weak_alias(__execvpe, execvpe);