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.
This commit is contained in:
parent
48983a43b1
commit
071f7fd818
Notes:
sideshowbarker
2024-07-17 06:54:15 +09:00
Author: https://github.com/AtkinsSJ Commit: https://github.com/SerenityOS/serenity/commit/071f7fd818 Pull-request: https://github.com/SerenityOS/serenity/pull/22805 Reviewed-by: https://github.com/ADKaster ✅
3 changed files with 13 additions and 8 deletions
|
@ -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 {
|
||||
|
|
|
@ -94,19 +94,23 @@ ErrorOr<Process> 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<char**>(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<char**>(argv_list.get().data()), System::environment()));
|
||||
} else {
|
||||
pid = TRY(System::posix_spawn(options.executable.view(), &spawn_actions, nullptr, const_cast<char**>(argv_list.get().data()), System::environment()));
|
||||
}
|
||||
return Process { pid };
|
||||
}
|
||||
|
||||
ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<ByteString> arguments, ByteString working_directory, KeepAsChild keep_as_child)
|
||||
{
|
||||
auto process = TRY(spawn({
|
||||
.path = path,
|
||||
.executable = path,
|
||||
.arguments = Vector<ByteString> { arguments },
|
||||
.working_directory = working_directory.is_empty() ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
|
||||
}));
|
||||
|
@ -128,7 +132,7 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> argument
|
|||
backing_strings.append(argument);
|
||||
|
||||
auto process = TRY(spawn({
|
||||
.path = path,
|
||||
.executable = path,
|
||||
.arguments = backing_strings,
|
||||
.working_directory = working_directory.is_empty() ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
|
||||
}));
|
||||
|
@ -148,7 +152,7 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<char const*> argumen
|
|||
backing_strings.append(argument);
|
||||
|
||||
auto process = TRY(spawn({
|
||||
.path = path,
|
||||
.executable = path,
|
||||
.arguments = backing_strings,
|
||||
.working_directory = working_directory.is_empty() ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
|
||||
}));
|
||||
|
|
|
@ -29,7 +29,8 @@ struct OpenFile {
|
|||
}
|
||||
|
||||
struct ProcessSpawnOptions {
|
||||
ByteString path;
|
||||
ByteString executable;
|
||||
bool search_for_executable_in_path { false };
|
||||
Vector<ByteString> const& arguments = {};
|
||||
Optional<ByteString> working_directory = {};
|
||||
Vector<Variant<FileAction::OpenFile>> const& file_actions = {};
|
||||
|
|
Loading…
Add table
Reference in a new issue