1 //===-- ConnectionFileDescriptor.h ------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_ConnectionFileDescriptor_h_ 11 #define liblldb_ConnectionFileDescriptor_h_ 12 13 // C Includes 14 #include <sys/socket.h> 15 #include <sys/types.h> 16 #include <netinet/in.h> 17 18 // C++ Includes 19 // Other libraries and framework includes 20 // Project includes 21 #include "lldb/Core/Connection.h" 22 #include "lldb/Host/Mutex.h" 23 #include "lldb/Host/Predicate.h" 24 #include "lldb/Host/SocketAddress.h" 25 26 namespace lldb_private { 27 28 class ConnectionFileDescriptor : 29 public Connection 30 { 31 public: 32 33 ConnectionFileDescriptor (); 34 35 ConnectionFileDescriptor (int fd, bool owns_fd); 36 37 virtual 38 ~ConnectionFileDescriptor (); 39 40 virtual bool 41 IsConnected () const; 42 43 virtual lldb::ConnectionStatus 44 Connect (const char *s, Error *error_ptr); 45 46 virtual lldb::ConnectionStatus 47 Disconnect (Error *error_ptr); 48 49 virtual size_t 50 Read (void *dst, 51 size_t dst_len, 52 uint32_t timeout_usec, 53 lldb::ConnectionStatus &status, 54 Error *error_ptr); 55 56 virtual size_t 57 Write (const void *src, 58 size_t src_len, 59 lldb::ConnectionStatus &status, 60 Error *error_ptr); 61 62 // If the read file descriptor is a socket, then return 63 // the port number that is being used by the socket. 64 in_port_t 65 GetReadPort () const; 66 67 // If the write file descriptor is a socket, then return 68 // the port number that is being used by the socket. 69 in_port_t 70 GetWritePort () const; 71 72 protected: 73 74 void 75 OpenCommandPipe (); 76 77 void 78 CloseCommandPipe (); 79 80 lldb::ConnectionStatus 81 BytesAvailable (uint32_t timeout_usec, Error *error_ptr); 82 83 lldb::ConnectionStatus 84 SocketListen (uint16_t listen_port_num, Error *error_ptr); 85 86 lldb::ConnectionStatus 87 ConnectTCP (const char *host_and_port, Error *error_ptr); 88 89 lldb::ConnectionStatus 90 ConnectUDP (const char *args, Error *error_ptr); 91 92 lldb::ConnectionStatus 93 NamedSocketAccept (const char *socket_name, Error *error_ptr); 94 95 lldb::ConnectionStatus 96 NamedSocketConnect (const char *socket_name, Error *error_ptr); 97 98 lldb::ConnectionStatus 99 Close (int& fd, Error *error); 100 101 typedef enum 102 { 103 eFDTypeFile, // Other FD requireing read/write 104 eFDTypeSocket, // Socket requiring send/recv 105 eFDTypeSocketUDP // Unconnected UDP socket requiring sendto/recvfrom 106 } FDType; 107 108 int m_fd_send; 109 int m_fd_recv; 110 FDType m_fd_send_type; 111 FDType m_fd_recv_type; 112 SocketAddress m_udp_send_sockaddr; 113 bool m_should_close_fd; // True if this class should close the file descriptor when it goes away. 114 uint32_t m_socket_timeout_usec; 115 int m_pipe_read; // A pipe that we select on the reading end of along with 116 int m_pipe_write; // m_fd_recv so we can force ourselves out of the select. 117 Mutex m_mutex; 118 bool m_shutting_down; // This marks that we are shutting down so if we get woken up from BytesAvailable 119 // to disconnect, we won't try to read again. 120 121 static in_port_t 122 GetSocketPort (int fd); 123 124 static int 125 GetSocketOption(int fd, int level, int option_name, int &option_value); 126 127 static int 128 SetSocketOption(int fd, int level, int option_name, int option_value); 129 130 bool 131 SetSocketReceiveTimeout (uint32_t timeout_usec); 132 133 private: 134 DISALLOW_COPY_AND_ASSIGN (ConnectionFileDescriptor); 135 }; 136 137 } // namespace lldb_private 138 139 #endif // liblldb_ConnectionFileDescriptor_h_ 140