1336809Sdim//===-- ConnectionFileDescriptorPosix.h -------------------------*- C++ -*-===// 2336809Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6336809Sdim// 7336809Sdim//===----------------------------------------------------------------------===// 8336809Sdim 9336809Sdim#ifndef LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 10336809Sdim#define LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 11336809Sdim 12336809Sdim#include <atomic> 13336809Sdim#include <memory> 14336809Sdim#include <mutex> 15336809Sdim 16336809Sdim#include "lldb/lldb-forward.h" 17336809Sdim 18360784Sdim#include "lldb/Host/Pipe.h" 19336809Sdim#include "lldb/Host/Socket.h" 20336809Sdim#include "lldb/Utility/Connection.h" 21336809Sdim#include "lldb/Utility/IOObject.h" 22336809Sdim 23336809Sdimnamespace lldb_private { 24360784Sdim 25360784Sdimclass Status; 26360784Sdimclass Socket; 27360784Sdimclass SocketAddress; 28360784Sdim 29336809Sdimclass ConnectionFileDescriptor : public Connection { 30353358Sdimpublic: 31336809Sdim typedef llvm::function_ref<void(llvm::StringRef local_socket_id)> 32336809Sdim socket_id_callback_type; 33336809Sdim 34336809Sdim ConnectionFileDescriptor(bool child_processes_inherit = false); 35336809Sdim 36336809Sdim ConnectionFileDescriptor(int fd, bool owns_fd); 37336809Sdim 38336809Sdim ConnectionFileDescriptor(Socket *socket); 39336809Sdim 40336809Sdim ~ConnectionFileDescriptor() override; 41336809Sdim 42336809Sdim bool IsConnected() const override; 43336809Sdim 44336809Sdim lldb::ConnectionStatus Connect(llvm::StringRef url, 45336809Sdim Status *error_ptr) override; 46336809Sdim 47336809Sdim lldb::ConnectionStatus Connect(llvm::StringRef url, 48336809Sdim socket_id_callback_type socket_id_callback, 49336809Sdim Status *error_ptr); 50336809Sdim 51336809Sdim lldb::ConnectionStatus Disconnect(Status *error_ptr) override; 52336809Sdim 53336809Sdim size_t Read(void *dst, size_t dst_len, const Timeout<std::micro> &timeout, 54336809Sdim lldb::ConnectionStatus &status, Status *error_ptr) override; 55336809Sdim 56336809Sdim size_t Write(const void *src, size_t src_len, lldb::ConnectionStatus &status, 57 Status *error_ptr) override; 58 59 std::string GetURI() override; 60 61 lldb::ConnectionStatus BytesAvailable(const Timeout<std::micro> &timeout, 62 Status *error_ptr); 63 64 bool InterruptRead() override; 65 66 lldb::IOObjectSP GetReadObject() override { return m_io_sp; } 67 68 bool GetChildProcessesInherit() const; 69 void SetChildProcessesInherit(bool child_processes_inherit); 70 71protected: 72 void OpenCommandPipe(); 73 74 void CloseCommandPipe(); 75 76 lldb::ConnectionStatus 77 AcceptSocket(Socket::SocketProtocol socket_protocol, 78 llvm::StringRef socket_name, 79 llvm::function_ref<void(Socket &)> post_listen_callback, 80 Status *error_ptr); 81 82 lldb::ConnectionStatus ConnectSocket(Socket::SocketProtocol socket_protocol, 83 llvm::StringRef socket_name, 84 Status *error_ptr); 85 86 lldb::ConnectionStatus AcceptTCP(llvm::StringRef host_and_port, 87 socket_id_callback_type socket_id_callback, 88 Status *error_ptr); 89 90 lldb::ConnectionStatus ConnectTCP(llvm::StringRef host_and_port, 91 socket_id_callback_type socket_id_callback, 92 Status *error_ptr); 93 94 lldb::ConnectionStatus ConnectUDP(llvm::StringRef args, 95 socket_id_callback_type socket_id_callback, 96 Status *error_ptr); 97 98 lldb::ConnectionStatus 99 ConnectNamedSocket(llvm::StringRef socket_name, 100 socket_id_callback_type socket_id_callback, 101 Status *error_ptr); 102 103 lldb::ConnectionStatus 104 AcceptNamedSocket(llvm::StringRef socket_name, 105 socket_id_callback_type socket_id_callback, 106 Status *error_ptr); 107 108 lldb::ConnectionStatus 109 AcceptAbstractSocket(llvm::StringRef socket_name, 110 socket_id_callback_type socket_id_callback, 111 Status *error_ptr); 112 113 lldb::ConnectionStatus 114 ConnectAbstractSocket(llvm::StringRef socket_name, 115 socket_id_callback_type socket_id_callback, 116 Status *error_ptr); 117 118 lldb::ConnectionStatus ConnectFD(llvm::StringRef args, 119 socket_id_callback_type socket_id_callback, 120 Status *error_ptr); 121 122 lldb::ConnectionStatus ConnectFile(llvm::StringRef args, 123 socket_id_callback_type socket_id_callback, 124 Status *error_ptr); 125 126 lldb::ConnectionStatus 127 ConnectSerialPort(llvm::StringRef args, 128 socket_id_callback_type socket_id_callback, 129 Status *error_ptr); 130 131 lldb::IOObjectSP m_io_sp; 132 133 Pipe m_pipe; 134 std::recursive_mutex m_mutex; 135 std::atomic<bool> m_shutting_down; // This marks that we are shutting down so 136 // if we get woken up from 137 // BytesAvailable to disconnect, we won't try to read again. 138 bool m_child_processes_inherit; 139 140 std::string m_uri; 141 142private: 143 void InitializeSocket(Socket *socket); 144 145 ConnectionFileDescriptor(const ConnectionFileDescriptor &) = delete; 146 const ConnectionFileDescriptor & 147 operator=(const ConnectionFileDescriptor &) = delete; 148}; 149 150} // namespace lldb_private 151 152#endif // LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 153