From 953520df491e0f83204fb2e8d9e4a9e4c7906686 Mon Sep 17 00:00:00 2001 From: cflip Date: Sat, 15 Oct 2022 19:04:18 -0600 Subject: [PATCH] LibCore: Add argument to specify working directory in Process::spawn --- Userland/Libraries/LibCore/Process.cpp | 24 ++++++++++++++++++++---- Userland/Libraries/LibCore/Process.h | 6 +++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Userland/Libraries/LibCore/Process.cpp b/Userland/Libraries/LibCore/Process.cpp index 623a71a780..5c94482d8f 100644 --- a/Userland/Libraries/LibCore/Process.cpp +++ b/Userland/Libraries/LibCore/Process.cpp @@ -22,6 +22,7 @@ namespace Core { struct ArgvList { String m_path; + String m_working_directory; Vector m_argv; ArgvList(String path, size_t size) @@ -43,25 +44,38 @@ struct ArgvList { return m_argv; } + void set_working_directory(String const& working_directory) + { + m_working_directory = working_directory; + } + ErrorOr spawn() { - auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast(get().data()), environ)); #ifdef AK_OS_SERENITY + posix_spawn_file_actions_t spawn_actions; + posix_spawn_file_actions_init(&spawn_actions); + if (!m_working_directory.is_empty()) + posix_spawn_file_actions_addchdir(&spawn_actions, m_working_directory.characters()); + + auto pid = TRY(System::posix_spawn(m_path.view(), &spawn_actions, nullptr, const_cast(get().data()), environ)); TRY(System::disown(pid)); +#else + auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast(get().data()), environ)); #endif return pid; } }; -ErrorOr Process::spawn(StringView path, Span arguments) +ErrorOr Process::spawn(StringView path, Span arguments, String working_directory) { ArgvList argv { path, arguments.size() }; for (auto const& arg : arguments) argv.append(arg.characters()); + argv.set_working_directory(working_directory); return argv.spawn(); } -ErrorOr Process::spawn(StringView path, Span arguments) +ErrorOr Process::spawn(StringView path, Span arguments, String working_directory) { Vector backing_strings; backing_strings.ensure_capacity(arguments.size()); @@ -70,14 +84,16 @@ ErrorOr Process::spawn(StringView path, Span arguments) backing_strings.append(arg); argv.append(backing_strings.last().characters()); } + argv.set_working_directory(working_directory); return argv.spawn(); } -ErrorOr Process::spawn(StringView path, Span arguments) +ErrorOr Process::spawn(StringView path, Span arguments, String working_directory) { ArgvList argv { path, arguments.size() }; for (auto arg : arguments) argv.append(arg); + argv.set_working_directory(working_directory); return argv.spawn(); } diff --git a/Userland/Libraries/LibCore/Process.h b/Userland/Libraries/LibCore/Process.h index 89f349d922..2930ff1e5c 100644 --- a/Userland/Libraries/LibCore/Process.h +++ b/Userland/Libraries/LibCore/Process.h @@ -14,9 +14,9 @@ namespace Core { class Process { public: - static ErrorOr spawn(StringView path, Span arguments); - static ErrorOr spawn(StringView path, Span arguments); - static ErrorOr spawn(StringView path, Span arguments = {}); + static ErrorOr spawn(StringView path, Span arguments, String working_directory = {}); + static ErrorOr spawn(StringView path, Span arguments, String working_directory = {}); + static ErrorOr spawn(StringView path, Span arguments = {}, String working_directory = {}); }; }