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