musl/src/process/execvp.c

56 lines
1.1 KiB
C
Raw Normal View History

2011-02-12 00:22:29 -05:00
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
2014-04-18 22:40:28 -05:00
#include "libc.h"
2011-02-12 00:22:29 -05:00
extern char **__environ;
int __execvpe(const char *file, char *const argv[], char *const envp[])
2011-02-12 00:22:29 -05:00
{
const char *p, *z, *path = getenv("PATH");
size_t l, k;
int seen_eacces = 0;
errno = ENOENT;
if (!*file) return -1;
2011-02-12 00:22:29 -05:00
if (strchr(file, '/'))
return execve(file, argv, envp);
2011-02-12 00:22:29 -05:00
if (!path) path = "/usr/local/bin:/bin:/usr/bin";
k = strnlen(file, NAME_MAX+1);
if (k > NAME_MAX) {
errno = ENAMETOOLONG;
return -1;
}
l = strnlen(path, PATH_MAX-1)+1;
2011-02-12 00:22:29 -05:00
for(p=path; ; p=z) {
char b[l+k+1];
2011-02-12 00:22:29 -05:00
z = strchr(p, ':');
if (!z) z = p+strlen(p);
if (z-p >= l) {
if (!*z++) break;
continue;
}
memcpy(b, p, z-p);
b[z-p] = '/';
memcpy(b+(z-p)+(z>p), file, k+1);
execve(b, argv, envp);
if (errno == EACCES) seen_eacces = 1;
else if (errno != ENOENT) return -1;
if (!*z++) break;
2011-02-12 00:22:29 -05:00
}
if (seen_eacces) errno = EACCES;
2011-02-12 00:22:29 -05:00
return -1;
}
int execvp(const char *file, char *const argv[])
{
return __execvpe(file, argv, __environ);
}
2014-04-18 22:40:28 -05:00
weak_alias(__execvpe, execvpe);