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>
15263363Semaste
16263363Semaste#ifdef _WIN32
17263363Semaste#include "lldb/Host/windows/windows.h"
18263363Semaste#include <winsock2.h>
19263363Semaste#include <WS2tcpip.h>
20263363Semastetypedef ADDRESS_FAMILY sa_family_t;
21263363Semaste#else
22254721Semaste#include <sys/socket.h>
23254721Semaste#include <netdb.h>
24254721Semaste#include <netinet/in.h>
25263363Semaste#endif
26254721Semaste
27254721Semaste#if defined(__FreeBSD__)
28254721Semaste#include <sys/types.h>
29254721Semaste#endif
30254721Semaste
31254721Semaste// C++ Includes
32254721Semaste// Other libraries and framework includes
33254721Semaste// Project includes
34254721Semaste
35254721Semastenamespace lldb_private {
36254721Semaste
37254721Semasteclass SocketAddress
38254721Semaste{
39254721Semastepublic:
40254721Semaste    //------------------------------------------------------------------
41254721Semaste    // Constructors and Destructors
42254721Semaste    //------------------------------------------------------------------
43254721Semaste    SocketAddress ();
44254721Semaste    SocketAddress (const struct sockaddr &s);
45254721Semaste    SocketAddress (const struct sockaddr_in &s);
46254721Semaste    SocketAddress (const struct sockaddr_in6 &s);
47254721Semaste    SocketAddress (const struct sockaddr_storage &s);
48254721Semaste    SocketAddress (const SocketAddress& rhs);
49254721Semaste    ~SocketAddress ();
50254721Semaste
51254721Semaste    //------------------------------------------------------------------
52254721Semaste    // Operators
53254721Semaste    //------------------------------------------------------------------
54254721Semaste    const SocketAddress&
55254721Semaste    operator=(const SocketAddress& rhs);
56254721Semaste
57254721Semaste    const SocketAddress&
58254721Semaste    operator=(const struct addrinfo *addr_info);
59254721Semaste
60254721Semaste    const SocketAddress&
61254721Semaste    operator=(const struct sockaddr &s);
62254721Semaste
63254721Semaste    const SocketAddress&
64254721Semaste    operator=(const struct sockaddr_in &s);
65254721Semaste
66254721Semaste    const SocketAddress&
67254721Semaste    operator=(const struct sockaddr_in6 &s);
68254721Semaste
69254721Semaste    const SocketAddress&
70254721Semaste    operator=(const struct sockaddr_storage &s);
71254721Semaste
72254721Semaste    //------------------------------------------------------------------
73254721Semaste    // Clear the contents of this socket address
74254721Semaste    //------------------------------------------------------------------
75254721Semaste    void
76254721Semaste    Clear ();
77254721Semaste
78254721Semaste    //------------------------------------------------------------------
79254721Semaste    // Get the length for the current socket address family
80254721Semaste    //------------------------------------------------------------------
81254721Semaste    socklen_t
82254721Semaste    GetLength () const;
83254721Semaste
84254721Semaste    //------------------------------------------------------------------
85254721Semaste    // Get the mex length for the the largest socket address supported.
86254721Semaste    //------------------------------------------------------------------
87254721Semaste    static socklen_t
88254721Semaste    GetMaxLength ();
89254721Semaste
90254721Semaste    //------------------------------------------------------------------
91254721Semaste    // Get the socket address family
92254721Semaste    //------------------------------------------------------------------
93254721Semaste    sa_family_t
94254721Semaste    GetFamily () const;
95254721Semaste
96254721Semaste    //------------------------------------------------------------------
97254721Semaste    // Set the socket address family
98254721Semaste    //------------------------------------------------------------------
99254721Semaste    void
100254721Semaste    SetFamily (sa_family_t family);
101254721Semaste
102254721Semaste    //------------------------------------------------------------------
103254721Semaste    // Get the port if the socket address for the family has a port
104254721Semaste    //------------------------------------------------------------------
105269024Semaste    uint16_t
106254721Semaste    GetPort () const;
107254721Semaste
108254721Semaste    //------------------------------------------------------------------
109254721Semaste    // Set the port if the socket address for the family has a port.
110254721Semaste    // The family must be set correctly prior to calling this function.
111254721Semaste    //------------------------------------------------------------------
112254721Semaste    bool
113269024Semaste    SetPort (uint16_t port);
114254721Semaste
115254721Semaste    //------------------------------------------------------------------
116254721Semaste    // Set the socket address according to the first match from a call
117254721Semaste    // to getaddrinfo() (or equivalent functions for systems that don't
118254721Semaste    // have getaddrinfo(). If "addr_info_ptr" is not NULL, it will get
119254721Semaste    // filled in with the match that was used to populate this socket
120254721Semaste    // address.
121254721Semaste    //------------------------------------------------------------------
122254721Semaste    bool
123269024Semaste    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")
124269024Semaste                 const char *service,       // Protocol name ("tcp", "http", etc) or a raw port number string ("81")
125269024Semaste                 int ai_family = PF_UNSPEC,
126269024Semaste                 int ai_socktype = 0,
127269024Semaste                 int ai_protocol = 0,
128269024Semaste                 int ai_flags = 0);
129254721Semaste
130254721Semaste    //------------------------------------------------------------------
131254721Semaste    // Quick way to set the SocketAddress to localhost given the family.
132254721Semaste    // Returns true if successful, false if "family" doesn't support
133254721Semaste    // localhost or if "family" is not supported by this class.
134254721Semaste    //------------------------------------------------------------------
135254721Semaste    bool
136254721Semaste    SetToLocalhost (sa_family_t family,
137269024Semaste                    uint16_t port);
138254721Semaste
139269024Semaste    bool
140269024Semaste    SetToAnyAddress (sa_family_t family,
141269024Semaste                     uint16_t port);
142269024Semaste
143254721Semaste    //------------------------------------------------------------------
144254721Semaste    // Returns true if there is a valid socket address in this object.
145254721Semaste    //------------------------------------------------------------------
146254721Semaste    bool
147254721Semaste    IsValid () const;
148254721Semaste
149254721Semaste    //------------------------------------------------------------------
150254721Semaste    // Direct access to all of the sockaddr structures
151254721Semaste    //------------------------------------------------------------------
152254721Semaste    struct sockaddr &
153254721Semaste    sockaddr ()
154254721Semaste    {
155254721Semaste        return m_socket_addr.sa;
156254721Semaste    }
157254721Semaste
158254721Semaste    const struct sockaddr &
159254721Semaste    sockaddr () const
160254721Semaste    {
161254721Semaste        return m_socket_addr.sa;
162254721Semaste    }
163254721Semaste
164254721Semaste    struct sockaddr_in &
165254721Semaste    sockaddr_in ()
166254721Semaste    {
167254721Semaste        return m_socket_addr.sa_ipv4;
168254721Semaste    }
169254721Semaste
170254721Semaste    const struct sockaddr_in &
171254721Semaste    sockaddr_in () const
172254721Semaste    {
173254721Semaste        return m_socket_addr.sa_ipv4;
174254721Semaste    }
175254721Semaste
176254721Semaste    struct sockaddr_in6 &
177254721Semaste    sockaddr_in6 ()
178254721Semaste    {
179254721Semaste        return m_socket_addr.sa_ipv6;
180254721Semaste    }
181254721Semaste
182254721Semaste    const struct sockaddr_in6 &
183254721Semaste    sockaddr_in6 () const
184254721Semaste    {
185254721Semaste        return m_socket_addr.sa_ipv6;
186254721Semaste    }
187254721Semaste
188254721Semaste    struct sockaddr_storage &
189254721Semaste    sockaddr_storage ()
190254721Semaste    {
191254721Semaste        return m_socket_addr.sa_storage;
192254721Semaste    }
193254721Semaste
194254721Semaste
195254721Semaste    const struct sockaddr_storage &
196254721Semaste    sockaddr_storage () const
197254721Semaste    {
198254721Semaste        return m_socket_addr.sa_storage;
199254721Semaste    }
200254721Semaste
201254721Semaste
202254721Semaste    //------------------------------------------------------------------
203254721Semaste    // Conversion operators to allow getting the contents of this class
204254721Semaste    // as a pointer to the appropriate structure. This allows an instance
205254721Semaste    // of this class to be used in calls that take one of the sockaddr
206254721Semaste    // structure variants without having to manally use the correct
207254721Semaste    // accessor function.
208254721Semaste    //------------------------------------------------------------------
209254721Semaste
210254721Semaste    operator struct sockaddr * ()
211254721Semaste    {
212254721Semaste        return &m_socket_addr.sa;
213254721Semaste    }
214254721Semaste
215254721Semaste    operator const struct sockaddr * () const
216254721Semaste    {
217254721Semaste        return &m_socket_addr.sa;
218254721Semaste    }
219254721Semaste
220254721Semaste    operator struct sockaddr_in * ()
221254721Semaste    {
222254721Semaste        return &m_socket_addr.sa_ipv4;
223254721Semaste    }
224254721Semaste
225254721Semaste    operator const struct sockaddr_in * () const
226254721Semaste    {
227254721Semaste        return &m_socket_addr.sa_ipv4;
228254721Semaste    }
229254721Semaste
230254721Semaste    operator struct sockaddr_in6 * ()
231254721Semaste    {
232254721Semaste        return &m_socket_addr.sa_ipv6;
233254721Semaste    }
234254721Semaste
235254721Semaste    operator const struct sockaddr_in6 * () const
236254721Semaste    {
237254721Semaste        return &m_socket_addr.sa_ipv6;
238254721Semaste    }
239254721Semaste
240254721Semaste    operator const struct sockaddr_storage * () const
241254721Semaste    {
242254721Semaste        return &m_socket_addr.sa_storage;
243254721Semaste    }
244254721Semaste
245254721Semaste    operator struct sockaddr_storage * ()
246254721Semaste    {
247254721Semaste        return &m_socket_addr.sa_storage;
248254721Semaste    }
249254721Semaste
250254721Semaste
251254721Semasteprotected:
252254721Semaste    typedef union sockaddr_tag
253254721Semaste    {
254254721Semaste        struct sockaddr         sa;
255254721Semaste        struct sockaddr_in      sa_ipv4;
256254721Semaste        struct sockaddr_in6     sa_ipv6;
257254721Semaste        struct sockaddr_storage sa_storage;
258254721Semaste    } sockaddr_t;
259254721Semaste
260254721Semaste    //------------------------------------------------------------------
261254721Semaste    // Classes that inherit from SocketAddress can see and modify these
262254721Semaste    //------------------------------------------------------------------
263254721Semaste    sockaddr_t m_socket_addr;
264254721Semaste};
265254721Semaste
266254721Semaste
267254721Semaste} // namespace lldb_private
268254721Semaste
269254721Semaste
270254721Semaste#endif  // liblldb_SocketAddress_h_
271