1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 19:07:35 +00:00

LibC: Add execvpe() and make execvp()'ed children inherit environment.

This commit is contained in:
Andreas Kling 2019-04-26 03:16:26 +02:00
parent 0a68e0046f
commit 490e89e240
3 changed files with 13 additions and 5 deletions

View file

@ -442,6 +442,8 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
// On success, the kernel stack will be lost. // On success, the kernel stack will be lost.
if (!validate_read_str(filename)) if (!validate_read_str(filename))
return -EFAULT; return -EFAULT;
if (!*filename)
return -ENOENT;
if (argv) { if (argv) {
if (!validate_read_typed(argv)) if (!validate_read_typed(argv))
return -EFAULT; return -EFAULT;

View file

@ -45,11 +45,11 @@ int execve(const char* filename, char* const argv[], char* const envp[])
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int execvp(const char* filename, char* const argv[]) int execvpe(const char* filename, char* const argv[], char* const envp[])
{ {
int rc = execve(filename, argv, nullptr); int rc = execve(filename, argv, environ);
if (rc < 0 && errno != ENOENT) { if (rc < 0 && errno != ENOENT) {
printf("execvp failed on first with %s\n", strerror(errno)); fprintf(stderr, "execvpe() failed on first with %s\n", strerror(errno));
return rc; return rc;
} }
String path = getenv("PATH"); String path = getenv("PATH");
@ -58,9 +58,9 @@ int execvp(const char* filename, char* const argv[])
auto parts = path.split(':'); auto parts = path.split(':');
for (auto& part : parts) { for (auto& part : parts) {
auto candidate = String::format("%s/%s", part.characters(), filename); auto candidate = String::format("%s/%s", part.characters(), filename);
rc = execve(candidate.characters(), argv, environ); int rc = execve(candidate.characters(), argv, environ);
if (rc < 0 && errno != ENOENT) { if (rc < 0 && errno != ENOENT) {
printf("execvp failed on attempt (%s) with %s\n", candidate.characters(), strerror(errno)); printf("execvpe() failed on attempt (%s) with %s\n", candidate.characters(), strerror(errno));
return rc; return rc;
} }
} }
@ -68,6 +68,11 @@ int execvp(const char* filename, char* const argv[])
return -1; return -1;
} }
int execvp(const char* filename, char* const argv[])
{
return execvpe(filename, argv, environ);
}
int execl(const char* filename, const char* arg0, ...) int execl(const char* filename, const char* arg0, ...)
{ {
Vector<const char*, 16> args; Vector<const char*, 16> args;

View file

@ -28,6 +28,7 @@ inline int getpagesize() { return 4096; }
pid_t fork(); pid_t fork();
int execv(const char* path, char* const argv[]); int execv(const char* path, char* const argv[]);
int execve(const char* filename, char* const argv[], char* const envp[]); int execve(const char* filename, char* const argv[], char* const envp[]);
int execvpe(const char* filename, char* const argv[], char* const envp[]);
int execvp(const char* filename, char* const argv[]); int execvp(const char* filename, char* const argv[]);
int execl(const char* filename, const char* arg, ...); int execl(const char* filename, const char* arg, ...);
void sync(); void sync();