]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/include/lldb/Host/SocketAddress.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / include / lldb / Host / SocketAddress.h
1 //===-- SocketAddress.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_SocketAddress_h_
11 #define liblldb_SocketAddress_h_
12
13 // C Includes
14 #include <stdint.h>
15
16 #ifdef _WIN32
17 #include "lldb/Host/windows/windows.h"
18 #include <winsock2.h>
19 #include <WS2tcpip.h>
20 typedef ADDRESS_FAMILY sa_family_t;
21 #else
22 #include <sys/socket.h>
23 #include <netdb.h>
24 #include <netinet/in.h>
25 #endif
26
27 #if defined(__FreeBSD__)
28 #include <sys/types.h>
29 #endif
30
31 // C++ Includes
32 // Other libraries and framework includes
33 // Project includes
34
35 namespace lldb_private {
36
37 class SocketAddress
38 {
39 public:
40     //------------------------------------------------------------------
41     // Constructors and Destructors
42     //------------------------------------------------------------------
43     SocketAddress ();
44     SocketAddress (const struct sockaddr &s);
45     SocketAddress (const struct sockaddr_in &s);
46     SocketAddress (const struct sockaddr_in6 &s);
47     SocketAddress (const struct sockaddr_storage &s);
48     SocketAddress (const SocketAddress& rhs);
49     ~SocketAddress ();
50
51     //------------------------------------------------------------------
52     // Operators
53     //------------------------------------------------------------------
54     const SocketAddress&
55     operator=(const SocketAddress& rhs);
56
57     const SocketAddress&
58     operator=(const struct addrinfo *addr_info);
59
60     const SocketAddress&
61     operator=(const struct sockaddr &s);
62
63     const SocketAddress&
64     operator=(const struct sockaddr_in &s);
65
66     const SocketAddress&
67     operator=(const struct sockaddr_in6 &s);
68
69     const SocketAddress&
70     operator=(const struct sockaddr_storage &s);
71     
72     //------------------------------------------------------------------
73     // Clear the contents of this socket address
74     //------------------------------------------------------------------
75     void
76     Clear ();
77
78     //------------------------------------------------------------------
79     // Get the length for the current socket address family
80     //------------------------------------------------------------------
81     socklen_t
82     GetLength () const;
83
84     //------------------------------------------------------------------
85     // Get the mex length for the the largest socket address supported.
86     //------------------------------------------------------------------
87     static socklen_t
88     GetMaxLength ();
89
90     //------------------------------------------------------------------
91     // Get the socket address family 
92     //------------------------------------------------------------------
93     sa_family_t
94     GetFamily () const;
95
96     //------------------------------------------------------------------
97     // Set the socket address family 
98     //------------------------------------------------------------------
99     void
100     SetFamily (sa_family_t family);
101
102     //------------------------------------------------------------------
103     // Get the port if the socket address for the family has a port
104     //------------------------------------------------------------------
105     uint16_t
106     GetPort () const;
107
108     //------------------------------------------------------------------
109     // Set the port if the socket address for the family has a port. 
110     // The family must be set correctly prior to calling this function.
111     //------------------------------------------------------------------
112     bool
113     SetPort (uint16_t port);
114
115     //------------------------------------------------------------------
116     // Set the socket address according to the first match from a call
117     // to getaddrinfo() (or equivalent functions for systems that don't
118     // have getaddrinfo(). If "addr_info_ptr" is not NULL, it will get
119     // filled in with the match that was used to populate this socket
120     // address.
121     //------------------------------------------------------------------
122     bool
123     getaddrinfo (const char *host,          // Hostname ("foo.bar.com" or "foo" or IP address string ("123.234.12.1" or "2001:0db8:85a3:0000:0000:8a2e:0370:7334")
124                  const char *service,       // Protocol name ("tcp", "http", etc) or a raw port number string ("81")
125                  int ai_family = PF_UNSPEC,
126                  int ai_socktype = 0,
127                  int ai_protocol = 0,
128                  int ai_flags = 0);
129
130     //------------------------------------------------------------------
131     // Quick way to set the SocketAddress to localhost given the family.
132     // Returns true if successful, false if "family" doesn't support 
133     // localhost or if "family" is not supported by this class.
134     //------------------------------------------------------------------
135     bool
136     SetToLocalhost (sa_family_t family, 
137                     uint16_t port);
138
139     bool
140     SetToAnyAddress (sa_family_t family,
141                      uint16_t port);
142
143     //------------------------------------------------------------------
144     // Returns true if there is a valid socket address in this object.
145     //------------------------------------------------------------------
146     bool
147     IsValid () const;
148
149     //------------------------------------------------------------------
150     // Direct access to all of the sockaddr structures
151     //------------------------------------------------------------------
152     struct sockaddr &
153     sockaddr ()
154     {
155         return m_socket_addr.sa;
156     }
157
158     const struct sockaddr &
159     sockaddr () const
160     {
161         return m_socket_addr.sa;
162     }
163     
164     struct sockaddr_in &
165     sockaddr_in ()
166     {
167         return m_socket_addr.sa_ipv4;
168     }
169     
170     const struct sockaddr_in &
171     sockaddr_in () const
172     {
173         return m_socket_addr.sa_ipv4;
174     }
175     
176     struct sockaddr_in6 &
177     sockaddr_in6 ()
178     {
179         return m_socket_addr.sa_ipv6;
180     }
181     
182     const struct sockaddr_in6 &
183     sockaddr_in6 () const
184     {
185         return m_socket_addr.sa_ipv6;
186     }
187     
188     struct sockaddr_storage &
189     sockaddr_storage ()
190     {
191         return m_socket_addr.sa_storage;
192     }
193
194     
195     const struct sockaddr_storage &
196     sockaddr_storage () const
197     {
198         return m_socket_addr.sa_storage;
199     }
200     
201     
202     //------------------------------------------------------------------
203     // Conversion operators to allow getting the contents of this class
204     // as a pointer to the appropriate structure. This allows an instance
205     // of this class to be used in calls that take one of the sockaddr
206     // structure variants without having to manally use the correct
207     // accessor function.
208     //------------------------------------------------------------------
209     
210     operator struct sockaddr * ()
211     {
212         return &m_socket_addr.sa;
213     }
214     
215     operator const struct sockaddr * () const
216     {
217         return &m_socket_addr.sa;
218     }
219
220     operator struct sockaddr_in * ()
221     {
222         return &m_socket_addr.sa_ipv4;
223     }
224     
225     operator const struct sockaddr_in * () const
226     {
227         return &m_socket_addr.sa_ipv4;
228     }
229
230     operator struct sockaddr_in6 * ()
231     {
232         return &m_socket_addr.sa_ipv6;
233     }
234     
235     operator const struct sockaddr_in6 * () const
236     {
237         return &m_socket_addr.sa_ipv6;
238     }
239
240     operator const struct sockaddr_storage * () const
241     {
242         return &m_socket_addr.sa_storage;
243     }
244
245     operator struct sockaddr_storage * ()
246     {
247         return &m_socket_addr.sa_storage;
248     }
249
250     
251 protected:
252     typedef union sockaddr_tag
253     {
254         struct sockaddr         sa;
255         struct sockaddr_in      sa_ipv4;
256         struct sockaddr_in6     sa_ipv6;
257         struct sockaddr_storage sa_storage;
258     } sockaddr_t;
259
260     //------------------------------------------------------------------
261     // Classes that inherit from SocketAddress can see and modify these
262     //------------------------------------------------------------------
263     sockaddr_t m_socket_addr;
264 };
265
266
267 } // namespace lldb_private
268
269
270 #endif  // liblldb_SocketAddress_h_