initial check-in, version 0.5.0
This commit is contained in:
commit
0b44a0315b
1021 changed files with 45711 additions and 0 deletions
34
src/process/execvp.c
Normal file
34
src/process/execvp.c
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
extern char **__environ;
|
||||
|
||||
int execvp(const char *file, char *const argv[])
|
||||
{
|
||||
const char *p, *z, *path = getenv("PATH");
|
||||
int l;
|
||||
|
||||
if (strchr(file, '/'))
|
||||
return execve(file, argv, __environ);
|
||||
|
||||
/* FIXME: integer overflows */
|
||||
if (!path) path = "/usr/local/bin:/bin:/usr/bin";
|
||||
l = strlen(file) + strlen(path) + 2;
|
||||
|
||||
for(p=path; p && *p; p=z) {
|
||||
char b[l];
|
||||
z = strchr(p, ':');
|
||||
if (z) {
|
||||
memcpy(b, p, z-p);
|
||||
b[z++-p] = 0;
|
||||
} else strcpy(b, p);
|
||||
strcat(b, "/");
|
||||
strcat(b, file);
|
||||
if (!access(b, X_OK))
|
||||
return execve(b, argv, __environ);
|
||||
}
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue