/* * Copyright (c) 2021, Andreas Kling * Copyright (c) 2022, MacDue * Copyright (c) 2023, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Core { namespace FileAction { struct OpenFile { ByteString path; File::OpenMode mode = File::OpenMode::NotOpen; int fd = -1; mode_t permissions = 0600; }; // FIXME: Implement other file actions } struct ProcessSpawnOptions { ByteString executable; bool search_for_executable_in_path { false }; Vector const& arguments = {}; Optional working_directory = {}; Vector> const& file_actions = {}; }; class Process { AK_MAKE_NONCOPYABLE(Process); public: enum class KeepAsChild { Yes, No }; Process(Process&& other) : m_pid(exchange(other.m_pid, 0)) , m_should_disown(exchange(other.m_should_disown, false)) { } Process& operator=(Process&& other) = delete; ~Process() { (void)disown(); } static ErrorOr spawn(ProcessSpawnOptions const& options); // FIXME: Make the following 2 functions return Process instance or delete them. static ErrorOr spawn(StringView path, ReadonlySpan arguments, ByteString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); static ErrorOr spawn(StringView path, ReadonlySpan arguments, ByteString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); // FIXME: Remove this. char const* should not exist on this level of abstraction. static ErrorOr spawn(StringView path, ReadonlySpan arguments = {}, ByteString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); static ErrorOr get_name(); enum class SetThreadName { No, Yes, }; static ErrorOr set_name(StringView, SetThreadName = SetThreadName::No); static void wait_for_debugger_and_break(); static ErrorOr is_being_debugged(); pid_t pid() const { return m_pid; } ErrorOr disown(); // FIXME: Make it return an exit code. ErrorOr wait_for_termination(); private: Process(pid_t pid) : m_pid(pid) , m_should_disown(true) { } pid_t m_pid; bool m_should_disown; }; }