1254721Semaste//===-- SocketAddress.h -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_SocketAddress_h_
11254721Semaste#define liblldb_SocketAddress_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste#include <stdint.h>
15254721Semaste#include <sys/socket.h>
16254721Semaste#include <netdb.h>
17254721Semaste#include <netinet/in.h>
18254721Semaste
19254721Semaste#if defined(__FreeBSD__)
20254721Semaste#include <sys/types.h>
21254721Semaste#endif
22254721Semaste
23254721Semaste// C++ Includes
24254721Semaste// Other libraries and framework includes
25254721Semaste// Project includes
26254721Semaste
27254721Semastenamespace lldb_private {
28254721Semaste
29254721Semasteclass SocketAddress
30254721Semaste{
31254721Semastepublic:
32254721Semaste    //------------------------------------------------------------------
33254721Semaste    // Constructors and Destructors
34254721Semaste    //------------------------------------------------------------------
35254721Semaste    SocketAddress ();
36254721Semaste    SocketAddress (const struct sockaddr &s);
37254721Semaste    SocketAddress (const struct sockaddr_in &s);
38254721Semaste    SocketAddress (const struct sockaddr_in6 &s);
39254721Semaste    SocketAddress (const struct sockaddr_storage &s);
40254721Semaste    SocketAddress (const SocketAddress& rhs);
41254721Semaste    ~SocketAddress ();
42254721Semaste
43254721Semaste    //------------------------------------------------------------------
44254721Semaste    // Operators
45254721Semaste    //------------------------------------------------------------------
46254721Semaste    const SocketAddress&
47254721Semaste    operator=(const SocketAddress& rhs);
48254721Semaste
49254721Semaste    const SocketAddress&
50254721Semaste    operator=(const struct addrinfo *addr_info);
51254721Semaste
52254721Semaste    const SocketAddress&
53254721Semaste    operator=(const struct sockaddr &s);
54254721Semaste
55254721Semaste    const SocketAddress&
56254721Semaste    operator=(const struct sockaddr_in &s);
57254721Semaste
58254721Semaste    const SocketAddress&
59254721Semaste    operator=(const struct sockaddr_in6 &s);
60254721Semaste
61254721Semaste    const SocketAddress&
62254721Semaste    operator=(const struct sockaddr_storage &s);
63254721Semaste
64254721Semaste    //------------------------------------------------------------------
65254721Semaste    // Clear the contents of this socket address
66254721Semaste    //------------------------------------------------------------------
67254721Semaste    void
68254721Semaste    Clear ();
69254721Semaste
70254721Semaste    //------------------------------------------------------------------
71254721Semaste    // Get the length for the current socket address family
72254721Semaste    //------------------------------------------------------------------
73254721Semaste    socklen_t
74254721Semaste    GetLength () const;
75254721Semaste
76254721Semaste    //------------------------------------------------------------------
77254721Semaste    // Get the mex length for the the largest socket address supported.
78254721Semaste    //------------------------------------------------------------------
79254721Semaste    static socklen_t
80254721Semaste    GetMaxLength ();
81254721Semaste
82254721Semaste    //------------------------------------------------------------------
83254721Semaste    // Get the socket address family
84254721Semaste    //------------------------------------------------------------------
85254721Semaste    sa_family_t
86254721Semaste    GetFamily () const;
87254721Semaste
88254721Semaste    //------------------------------------------------------------------
89254721Semaste    // Set the socket address family
90254721Semaste    //------------------------------------------------------------------
91254721Semaste    void
92254721Semaste    SetFamily (sa_family_t family);
93254721Semaste
94254721Semaste    //------------------------------------------------------------------
95254721Semaste    // Get the port if the socket address for the family has a port
96254721Semaste    //------------------------------------------------------------------
97254721Semaste    in_port_t
98254721Semaste    GetPort () const;
99254721Semaste
100254721Semaste    //------------------------------------------------------------------
101254721Semaste    // Set the port if the socket address for the family has a port.
102254721Semaste    // The family must be set correctly prior to calling this function.
103254721Semaste    //------------------------------------------------------------------
104254721Semaste    bool
105254721Semaste    SetPort (in_port_t port);
106254721Semaste
107254721Semaste    //------------------------------------------------------------------
108254721Semaste    // Set the socket address according to the first match from a call
109254721Semaste    // to getaddrinfo() (or equivalent functions for systems that don't
110254721Semaste    // have getaddrinfo(). If "addr_info_ptr" is not NULL, it will get
111254721Semaste    // filled in with the match that was used to populate this socket
112254721Semaste    // address.
113254721Semaste    //------------------------------------------------------------------
114254721Semaste    bool
115254721Semaste    SetAddress (const struct addrinfo *hints_ptr,   // Optional hints where the family, protocol and other things can be specified.
116254721Semaste                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")
117254721Semaste                const char *service,                // Protocol name ("tcp", "http", etc) or a raw port number string ("81")
118254721Semaste                struct addrinfo *addr_info_ptr);    // If non-NULL, this will get filled in with the match
119254721Semaste
120254721Semaste    //------------------------------------------------------------------
121254721Semaste    // Quick way to set the SocketAddress to localhost given the family.
122254721Semaste    // Returns true if successful, false if "family" doesn't support
123254721Semaste    // localhost or if "family" is not supported by this class.
124254721Semaste    //------------------------------------------------------------------
125254721Semaste    bool
126254721Semaste    SetToLocalhost (sa_family_t family,
127254721Semaste                    in_port_t port);
128254721Semaste
129254721Semaste    //------------------------------------------------------------------
130254721Semaste    // Returns true if there is a valid socket address in this object.
131254721Semaste    //------------------------------------------------------------------
132254721Semaste    bool
133254721Semaste    IsValid () const;
134254721Semaste
135254721Semaste    //------------------------------------------------------------------
136254721Semaste    // Direct access to all of the sockaddr structures
137254721Semaste    //------------------------------------------------------------------
138254721Semaste    struct sockaddr &
139254721Semaste    sockaddr ()
140254721Semaste    {
141254721Semaste        return m_socket_addr.sa;
142254721Semaste    }
143254721Semaste
144254721Semaste    const struct sockaddr &
145254721Semaste    sockaddr () const
146254721Semaste    {
147254721Semaste        return m_socket_addr.sa;
148254721Semaste    }
149254721Semaste
150254721Semaste    struct sockaddr_in &
151254721Semaste    sockaddr_in ()
152254721Semaste    {
153254721Semaste        return m_socket_addr.sa_ipv4;
154254721Semaste    }
155254721Semaste
156254721Semaste    const struct sockaddr_in &
157254721Semaste    sockaddr_in () const
158254721Semaste    {
159254721Semaste        return m_socket_addr.sa_ipv4;
160254721Semaste    }
161254721Semaste
162254721Semaste    struct sockaddr_in6 &
163254721Semaste    sockaddr_in6 ()
164254721Semaste    {
165254721Semaste        return m_socket_addr.sa_ipv6;
166254721Semaste    }
167254721Semaste
168254721Semaste    const struct sockaddr_in6 &
169254721Semaste    sockaddr_in6 () const
170254721Semaste    {
171254721Semaste        return m_socket_addr.sa_ipv6;
172254721Semaste    }
173254721Semaste
174254721Semaste    struct sockaddr_storage &
175254721Semaste    sockaddr_storage ()
176254721Semaste    {
177254721Semaste        return m_socket_addr.sa_storage;
178254721Semaste    }
179254721Semaste
180254721Semaste
181254721Semaste    const struct sockaddr_storage &
182254721Semaste    sockaddr_storage () const
183254721Semaste    {
184254721Semaste        return m_socket_addr.sa_storage;
185254721Semaste    }
186254721Semaste
187254721Semaste
188254721Semaste    //------------------------------------------------------------------
189254721Semaste    // Conversion operators to allow getting the contents of this class
190254721Semaste    // as a pointer to the appropriate structure. This allows an instance
191254721Semaste    // of this class to be used in calls that take one of the sockaddr
192254721Semaste    // structure variants without having to manally use the correct
193254721Semaste    // accessor function.
194254721Semaste    //------------------------------------------------------------------
195254721Semaste
196254721Semaste    operator struct sockaddr * ()
197254721Semaste    {
198254721Semaste        return &m_socket_addr.sa;
199254721Semaste    }
200254721Semaste
201254721Semaste    operator const struct sockaddr * () const
202254721Semaste    {
203254721Semaste        return &m_socket_addr.sa;
204254721Semaste    }
205254721Semaste
206254721Semaste    operator struct sockaddr_in * ()
207254721Semaste    {
208254721Semaste        return &m_socket_addr.sa_ipv4;
209254721Semaste    }
210254721Semaste
211254721Semaste    operator const struct sockaddr_in * () const
212254721Semaste    {
213254721Semaste        return &m_socket_addr.sa_ipv4;
214254721Semaste    }
215254721Semaste
216254721Semaste    operator struct sockaddr_in6 * ()
217254721Semaste    {
218254721Semaste        return &m_socket_addr.sa_ipv6;
219254721Semaste    }
220254721Semaste
221254721Semaste    operator const struct sockaddr_in6 * () const
222254721Semaste    {
223254721Semaste        return &m_socket_addr.sa_ipv6;
224254721Semaste    }
225254721Semaste
226254721Semaste    operator const struct sockaddr_storage * () const
227254721Semaste    {
228254721Semaste        return &m_socket_addr.sa_storage;
229254721Semaste    }
230254721Semaste
231254721Semaste    operator struct sockaddr_storage * ()
232254721Semaste    {
233254721Semaste        return &m_socket_addr.sa_storage;
234254721Semaste    }
235254721Semaste
236254721Semaste
237254721Semasteprotected:
238254721Semaste    typedef union sockaddr_tag
239254721Semaste    {
240254721Semaste        struct sockaddr         sa;
241254721Semaste        struct sockaddr_in      sa_ipv4;
242254721Semaste        struct sockaddr_in6     sa_ipv6;
243254721Semaste        struct sockaddr_storage sa_storage;
244254721Semaste    } sockaddr_t;
245254721Semaste
246254721Semaste    //------------------------------------------------------------------
247254721Semaste    // Classes that inherit from SocketAddress can see and modify these
248254721Semaste    //------------------------------------------------------------------
249254721Semaste    sockaddr_t m_socket_addr;
250254721Semaste};
251254721Semaste
252254721Semaste
253254721Semaste} // namespace lldb_private
254254721Semaste
255254721Semaste
256254721Semaste#endif  // liblldb_SocketAddress_h_
257