From 071f7fd81803622989c27d7ba69e4b8355d8b642 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 16 Jan 2024 13:42:30 +0000 Subject: [PATCH] LibCore+JSSpecCompiler: Add option for Process::spawn() to use spawnp() Add a boolean to ProcessSpawnOptions, `search_for_executable_in_path`, which when true, calls into posix_spawnp() instead of posix_spawn(). This defaults to false to maintain the existing behavior. The `path` field is renamed to `executable` because having two fields refer to "path" and mean different things seemed unnecessarily confusing. --- Tests/JSSpecCompiler/test-runner.cpp | 2 +- Userland/Libraries/LibCore/Process.cpp | 16 ++++++++++------ Userland/Libraries/LibCore/Process.h | 3 ++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Tests/JSSpecCompiler/test-runner.cpp b/Tests/JSSpecCompiler/test-runner.cpp index eaedb29d4c..4a0d653577 100644 --- a/Tests/JSSpecCompiler/test-runner.cpp +++ b/Tests/JSSpecCompiler/test-runner.cpp @@ -152,7 +152,7 @@ TEST_CASE(test_regression) auto path_to_expectation = LexicalPath::join(path_to_tests_directory.string(), ByteString::formatted("{}.expectation", source)); auto process = MUST(Core::Process::spawn({ - .path = path_to_compiler_binary.string(), + .executable = path_to_compiler_binary.string(), .arguments = build_command_line_arguments(path_to_test, test_description), .file_actions = { Core::FileAction::OpenFile { diff --git a/Userland/Libraries/LibCore/Process.cpp b/Userland/Libraries/LibCore/Process.cpp index 472167f677..9ad3b50231 100644 --- a/Userland/Libraries/LibCore/Process.cpp +++ b/Userland/Libraries/LibCore/Process.cpp @@ -94,19 +94,23 @@ ErrorOr Process::spawn(ProcessSpawnOptions const& options) #undef CHECK - ArgvList argv_list(options.path, options.arguments.size()); + ArgvList argv_list(options.executable, options.arguments.size()); for (auto const& argument : options.arguments) argv_list.append(argument.characters()); - auto pid = TRY(System::posix_spawn(options.path.view(), &spawn_actions, nullptr, const_cast(argv_list.get().data()), System::environment())); - + pid_t pid; + if (options.search_for_executable_in_path) { + pid = TRY(System::posix_spawnp(options.executable.view(), &spawn_actions, nullptr, const_cast(argv_list.get().data()), System::environment())); + } else { + pid = TRY(System::posix_spawn(options.executable.view(), &spawn_actions, nullptr, const_cast(argv_list.get().data()), System::environment())); + } return Process { pid }; } ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, ByteString working_directory, KeepAsChild keep_as_child) { auto process = TRY(spawn({ - .path = path, + .executable = path, .arguments = Vector { arguments }, .working_directory = working_directory.is_empty() ? Optional {} : Optional { working_directory }, })); @@ -128,7 +132,7 @@ ErrorOr Process::spawn(StringView path, ReadonlySpan argument backing_strings.append(argument); auto process = TRY(spawn({ - .path = path, + .executable = path, .arguments = backing_strings, .working_directory = working_directory.is_empty() ? Optional {} : Optional { working_directory }, })); @@ -148,7 +152,7 @@ ErrorOr Process::spawn(StringView path, ReadonlySpan argumen backing_strings.append(argument); auto process = TRY(spawn({ - .path = path, + .executable = path, .arguments = backing_strings, .working_directory = working_directory.is_empty() ? Optional {} : Optional { working_directory }, })); diff --git a/Userland/Libraries/LibCore/Process.h b/Userland/Libraries/LibCore/Process.h index d50fb856d4..ba7bef16d6 100644 --- a/Userland/Libraries/LibCore/Process.h +++ b/Userland/Libraries/LibCore/Process.h @@ -29,7 +29,8 @@ struct OpenFile { } struct ProcessSpawnOptions { - ByteString path; + ByteString executable; + bool search_for_executable_in_path { false }; Vector const& arguments = {}; Optional working_directory = {}; Vector> const& file_actions = {};