Explorar el Código

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.
Sam Atkins hace 1 año
padre
commit
071f7fd818

+ 1 - 1
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 {

+ 10 - 6
Userland/Libraries/LibCore/Process.cpp

@@ -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 },
     }));

+ 2 - 1
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<ByteString> const& arguments = {};
     Optional<ByteString> working_directory = {};
     Vector<Variant<FileAction::OpenFile>> const& file_actions = {};