From e654ed6415ed779842bb67daa4b82bd710471275 Mon Sep 17 00:00:00 2001 From: apio Date: Sat, 22 Apr 2023 13:54:47 +0200 Subject: [PATCH] libos: Allow passing environment to Process::exec --- libos/include/os/Process.h | 1 + libos/src/Process.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) 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); + } }