#pragma once #include "Builtin.h" #include "CommandTypes.h" #include class Execute { BAN_NON_COPYABLE(Execute); BAN_NON_MOVABLE(Execute); public: Execute() = default; BAN::ErrorOr execute_command_sync(BAN::Span arguments, int fd_in, int fd_out); BAN::ErrorOr execute_command(const SingleCommand&, int fd_in, int fd_out, bool background, pid_t pgrp = 0); BAN::ErrorOr execute_command(const PipedCommand&); BAN::ErrorOr execute_command(const CommandTree&); BAN::ErrorOr source_script(BAN::StringView path); int last_background_pid() const { return m_last_background_pid; } int last_return_value() const { return m_last_return_value; } private: struct InternalCommand { using Command = BAN::Variant; enum class Type { Builtin, External, }; struct Environment { BAN::String name; BAN::String value; }; Command command; BAN::Span arguments; BAN::Span environments; int fd_in; int fd_out; bool background; pid_t pgrp; }; struct ExecuteResult { pid_t pid; int exit_code; }; BAN::ErrorOr execute_command_no_wait(const InternalCommand& command); private: int m_last_background_pid { 0 }; int m_last_return_value { 0 }; };