2013-08-23 13:46:38 -04:00
//===-- ConnectionFileDescriptor.h ------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
# ifndef liblldb_ConnectionFileDescriptor_h_
# define liblldb_ConnectionFileDescriptor_h_
// C Includes
2014-02-18 11:23:10 -05:00
# ifndef _WIN32
2013-08-23 13:46:38 -04:00
# include <sys/socket.h>
# include <sys/types.h>
# include <netinet/in.h>
2013-11-06 11:48:53 -05:00
# endif
2013-08-23 13:46:38 -04:00
// C++ Includes
2013-11-06 11:48:53 -05:00
# include <memory>
2013-08-23 13:46:38 -04:00
// Other libraries and framework includes
// Project includes
# include "lldb/Core/Connection.h"
# include "lldb/Host/Mutex.h"
# include "lldb/Host/Predicate.h"
namespace lldb_private {
2013-11-06 11:48:53 -05:00
class SocketAddress ;
2013-08-23 13:46:38 -04:00
class ConnectionFileDescriptor :
public Connection
{
public :
ConnectionFileDescriptor ( ) ;
ConnectionFileDescriptor ( int fd , bool owns_fd ) ;
virtual
~ ConnectionFileDescriptor ( ) ;
virtual bool
IsConnected ( ) const ;
virtual lldb : : ConnectionStatus
Connect ( const char * s , Error * error_ptr ) ;
virtual lldb : : ConnectionStatus
Disconnect ( Error * error_ptr ) ;
virtual size_t
Read ( void * dst ,
size_t dst_len ,
uint32_t timeout_usec ,
lldb : : ConnectionStatus & status ,
Error * error_ptr ) ;
virtual size_t
Write ( const void * src ,
size_t src_len ,
lldb : : ConnectionStatus & status ,
Error * error_ptr ) ;
// If the read file descriptor is a socket, then return
// the port number that is being used by the socket.
2014-02-18 11:23:10 -05:00
uint16_t
2013-08-23 13:46:38 -04:00
GetReadPort ( ) const ;
// If the write file descriptor is a socket, then return
// the port number that is being used by the socket.
2014-02-18 11:23:10 -05:00
uint16_t
2013-08-23 13:46:38 -04:00
GetWritePort ( ) const ;
2014-02-18 11:23:10 -05:00
uint16_t
GetBoundPort ( uint32_t timeout_sec ) ;
2013-08-23 13:46:38 -04:00
protected :
2013-11-06 11:48:53 -05:00
typedef enum
{
eFDTypeFile , // Other FD requireing read/write
eFDTypeSocket , // Socket requiring send/recv
eFDTypeSocketUDP // Unconnected UDP socket requiring sendto/recvfrom
} FDType ;
2013-08-23 13:46:38 -04:00
void
OpenCommandPipe ( ) ;
void
CloseCommandPipe ( ) ;
lldb : : ConnectionStatus
BytesAvailable ( uint32_t timeout_usec , Error * error_ptr ) ;
lldb : : ConnectionStatus
2014-02-18 11:23:10 -05:00
SocketListen ( const char * host_and_port , Error * error_ptr ) ;
2013-08-23 13:46:38 -04:00
lldb : : ConnectionStatus
ConnectTCP ( const char * host_and_port , Error * error_ptr ) ;
lldb : : ConnectionStatus
ConnectUDP ( const char * args , Error * error_ptr ) ;
lldb : : ConnectionStatus
NamedSocketAccept ( const char * socket_name , Error * error_ptr ) ;
lldb : : ConnectionStatus
NamedSocketConnect ( const char * socket_name , Error * error_ptr ) ;
lldb : : ConnectionStatus
2013-11-06 11:48:53 -05:00
Close ( int & fd , FDType type , Error * error ) ;
2013-08-23 13:46:38 -04:00
int m_fd_send ;
int m_fd_recv ;
FDType m_fd_send_type ;
FDType m_fd_recv_type ;
2013-11-06 11:48:53 -05:00
std : : unique_ptr < SocketAddress > m_udp_send_sockaddr ;
2013-08-23 13:46:38 -04:00
uint32_t m_socket_timeout_usec ;
int m_pipe_read ; // A pipe that we select on the reading end of along with
int m_pipe_write ; // m_fd_recv so we can force ourselves out of the select.
2014-02-18 11:23:10 -05:00
Mutex m_mutex ;
Predicate < uint16_t > m_port_predicate ; // Used when binding to port zero to wait for the thread that creates the socket, binds and listens to resolve the port number
bool m_should_close_fd ; // True if this class should close the file descriptor when it goes away.
2013-08-23 13:46:38 -04:00
bool m_shutting_down ; // This marks that we are shutting down so if we get woken up from BytesAvailable
// to disconnect, we won't try to read again.
2014-02-18 11:23:10 -05:00
static uint16_t
2013-08-23 13:46:38 -04:00
GetSocketPort ( int fd ) ;
static int
GetSocketOption ( int fd , int level , int option_name , int & option_value ) ;
static int
SetSocketOption ( int fd , int level , int option_name , int option_value ) ;
bool
SetSocketReceiveTimeout ( uint32_t timeout_usec ) ;
private :
DISALLOW_COPY_AND_ASSIGN ( ConnectionFileDescriptor ) ;
} ;
} // namespace lldb_private
# endif // liblldb_ConnectionFileDescriptor_h_