diff --git a/libos/include/os/Process.h b/libos/include/os/Process.h index 507e783a..bbf038fd 100644 --- a/libos/include/os/Process.h +++ b/libos/include/os/Process.h @@ -11,5 +11,6 @@ namespace os static Result fork(); static Result exec(StringView path, Slice args, bool search_in_path = true); + static Result exec(StringView path, Slice args, Slice env, bool search_in_path = true); }; } diff --git a/libos/src/Process.cpp b/libos/src/Process.cpp index 19a569c9..9ce8128f 100644 --- a/libos/src/Process.cpp +++ b/libos/src/Process.cpp @@ -24,4 +24,21 @@ namespace os return err(errno); } + + Result Process::exec(StringView path, Slice args, Slice env, bool search_in_path) + { + Vector argv; + for (const auto& arg : args) { TRY(argv.try_append(arg.chars())); } + TRY(argv.try_append(nullptr)); + + Vector envp; + for (const auto& arg : env) { TRY(envp.try_append(arg.chars())); } + TRY(envp.try_append(nullptr)); + + if (search_in_path) execvpe(path.chars(), const_cast(argv.data()), const_cast(envp.data())); + else + execve(path.chars(), const_cast(argv.data()), const_cast(envp.data())); + + return err(errno); + } }