#ifndef remote_hh_INCLUDED #define remote_hh_INCLUDED #include "env_vars.hh" #include "exception.hh" #include "utils.hh" #include "vector.hh" #include "optional.hh" #include namespace Kakoune { struct disconnected : runtime_error { using runtime_error::runtime_error; }; class FDWatcher; class UserInterface; template struct Optional; struct BufferCoord; using RemoteBuffer = Vector; // A remote client handle communication between a client running on the server // and a user interface running on the local process. class RemoteClient { public: RemoteClient(StringView session, StringView name, std::unique_ptr&& ui, int pid, const EnvVarMap& env_vars, StringView init_command, Optional init_coord, Optional stdin_fd); bool is_ui_ok() const; const Optional& exit_status() const { return m_exit_status; } private: std::unique_ptr m_ui; std::unique_ptr m_socket_watcher; RemoteBuffer m_send_buffer; Optional m_exit_status; }; void send_command(StringView session, StringView command); String get_user_name(); const String& session_directory(); String session_path(StringView session); struct Server : public Singleton { Server(String session_name, bool daemon); ~Server(); const String& session() const { return m_session; } bool rename_session(StringView name); void close_session(bool do_unlink = true); bool negotiating() const { return not m_accepters.empty(); } void daemonize() { m_is_daemon = true; } bool is_daemon() const { return m_is_daemon; } private: class Accepter; void remove_accepter(Accepter* accepter); String m_session; bool m_is_daemon; std::unique_ptr m_listener; Vector, MemoryDomain::Remote> m_accepters; }; bool check_session(StringView session); } #endif // remote_hh_INCLUDED