]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/llvm/tools/lldb/include/lldb/Core/ConnectionFileDescriptor.h
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / contrib / llvm / tools / lldb / include / lldb / Core / ConnectionFileDescriptor.h
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_