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