1254721Semaste//===-- SocketAddress.cpp ---------------------------------------*- 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#include "lldb/Host/SocketAddress.h"
11254721Semaste#include <stddef.h>
12254721Semaste
13254721Semaste// C Includes
14254721Semaste#include <assert.h>
15254721Semaste#include <string.h>
16254721Semaste
17254721Semaste// C++ Includes
18254721Semaste// Other libraries and framework includes
19254721Semaste// Project includes
20254721Semaste
21254721Semasteusing namespace lldb_private;
22254721Semaste
23254721Semaste//----------------------------------------------------------------------
24254721Semaste// SocketAddress constructor
25254721Semaste//----------------------------------------------------------------------
26254721SemasteSocketAddress::SocketAddress ()
27254721Semaste{
28254721Semaste    Clear ();
29254721Semaste}
30254721Semaste
31254721SemasteSocketAddress::SocketAddress (const struct sockaddr &s)
32254721Semaste{
33254721Semaste    m_socket_addr.sa = s;
34254721Semaste}
35254721Semaste
36254721Semaste
37254721SemasteSocketAddress::SocketAddress (const struct sockaddr_in &s)
38254721Semaste{
39254721Semaste    m_socket_addr.sa_ipv4 = s;
40254721Semaste}
41254721Semaste
42254721Semaste
43254721SemasteSocketAddress::SocketAddress (const struct sockaddr_in6 &s)
44254721Semaste{
45254721Semaste    m_socket_addr.sa_ipv6 = s;
46254721Semaste}
47254721Semaste
48254721Semaste
49254721SemasteSocketAddress::SocketAddress (const struct sockaddr_storage &s)
50254721Semaste{
51254721Semaste    m_socket_addr.sa_storage = s;
52254721Semaste}
53254721Semaste
54254721Semaste//----------------------------------------------------------------------
55254721Semaste// SocketAddress copy constructor
56254721Semaste//----------------------------------------------------------------------
57254721SemasteSocketAddress::SocketAddress (const SocketAddress& rhs) :
58254721Semaste    m_socket_addr (rhs.m_socket_addr)
59254721Semaste{
60254721Semaste}
61254721Semaste
62254721Semaste//----------------------------------------------------------------------
63254721Semaste// Destructor
64254721Semaste//----------------------------------------------------------------------
65254721SemasteSocketAddress::~SocketAddress()
66254721Semaste{
67254721Semaste}
68254721Semaste
69254721Semastevoid
70254721SemasteSocketAddress::Clear ()
71254721Semaste{
72254721Semaste    memset (&m_socket_addr, 0, sizeof(m_socket_addr));
73254721Semaste}
74254721Semaste
75254721Semastebool
76254721SemasteSocketAddress::IsValid () const
77254721Semaste{
78254721Semaste    return GetLength () != 0;
79254721Semaste}
80254721Semaste
81254721Semastestatic socklen_t
82254721SemasteGetFamilyLength (sa_family_t family)
83254721Semaste{
84254721Semaste    switch (family)
85254721Semaste    {
86254721Semaste        case AF_INET:  return sizeof(struct sockaddr_in);
87254721Semaste        case AF_INET6: return sizeof(struct sockaddr_in6);
88254721Semaste    }
89254721Semaste    assert(0 && "Unsupported address family");
90254721Semaste}
91254721Semaste
92254721Semastesocklen_t
93254721SemasteSocketAddress::GetLength () const
94254721Semaste{
95254721Semaste#if defined(__APPLE__)
96254721Semaste    return m_socket_addr.sa.sa_len;
97254721Semaste#else
98254721Semaste    return GetFamilyLength (GetFamily());
99254721Semaste#endif
100254721Semaste}
101254721Semaste
102254721Semastesocklen_t
103254721SemasteSocketAddress::GetMaxLength ()
104254721Semaste{
105254721Semaste    return sizeof (sockaddr_t);
106254721Semaste}
107254721Semaste
108254721Semastesa_family_t
109254721SemasteSocketAddress::GetFamily () const
110254721Semaste{
111254721Semaste    return m_socket_addr.sa.sa_family;
112254721Semaste}
113254721Semaste
114254721Semastevoid
115254721SemasteSocketAddress::SetFamily (sa_family_t family)
116254721Semaste{
117254721Semaste    m_socket_addr.sa.sa_family = family;
118254721Semaste#if defined(__APPLE__)
119254721Semaste    m_socket_addr.sa.sa_len = GetFamilyLength (family);
120254721Semaste#endif
121254721Semaste}
122254721Semaste
123254721Semastein_port_t
124254721SemasteSocketAddress::GetPort () const
125254721Semaste{
126254721Semaste    switch (GetFamily())
127254721Semaste    {
128254721Semaste        case AF_INET:   return m_socket_addr.sa_ipv4.sin_port;
129254721Semaste        case AF_INET6:  return m_socket_addr.sa_ipv6.sin6_port;
130254721Semaste    }
131254721Semaste    return 0;
132254721Semaste}
133254721Semaste
134254721Semastebool
135254721SemasteSocketAddress::SetPort (in_port_t port)
136254721Semaste{
137254721Semaste    switch (GetFamily())
138254721Semaste    {
139254721Semaste        case AF_INET:
140254721Semaste            m_socket_addr.sa_ipv4.sin_port = htons(port);
141254721Semaste            return true;
142254721Semaste
143254721Semaste        case AF_INET6:
144254721Semaste            m_socket_addr.sa_ipv6.sin6_port = htons(port);
145254721Semaste            return true;
146254721Semaste    }
147254721Semaste    return false;
148254721Semaste}
149254721Semaste
150254721Semaste//----------------------------------------------------------------------
151254721Semaste// SocketAddress assignment operator
152254721Semaste//----------------------------------------------------------------------
153254721Semasteconst SocketAddress&
154254721SemasteSocketAddress::operator=(const SocketAddress& rhs)
155254721Semaste{
156254721Semaste    if (this != &rhs)
157254721Semaste        m_socket_addr = rhs.m_socket_addr;
158254721Semaste    return *this;
159254721Semaste}
160254721Semaste
161254721Semasteconst SocketAddress&
162254721SemasteSocketAddress::operator=(const struct addrinfo *addr_info)
163254721Semaste{
164254721Semaste    Clear();
165254721Semaste    if (addr_info &&
166254721Semaste        addr_info->ai_addr &&
167254721Semaste        addr_info->ai_addrlen > 0&&
168254721Semaste        addr_info->ai_addrlen <= sizeof m_socket_addr)
169254721Semaste    {
170254721Semaste        ::memcpy (&m_socket_addr,
171254721Semaste                  addr_info->ai_addr,
172254721Semaste                  addr_info->ai_addrlen);
173254721Semaste    }
174254721Semaste    return *this;
175254721Semaste}
176254721Semaste
177254721Semasteconst SocketAddress&
178254721SemasteSocketAddress::operator=(const struct sockaddr &s)
179254721Semaste{
180254721Semaste    m_socket_addr.sa = s;
181254721Semaste    return *this;
182254721Semaste}
183254721Semaste
184254721Semasteconst SocketAddress&
185254721SemasteSocketAddress::operator=(const struct sockaddr_in &s)
186254721Semaste{
187254721Semaste    m_socket_addr.sa_ipv4 = s;
188254721Semaste    return *this;
189254721Semaste}
190254721Semaste
191254721Semasteconst SocketAddress&
192254721SemasteSocketAddress::operator=(const struct sockaddr_in6 &s)
193254721Semaste{
194254721Semaste    m_socket_addr.sa_ipv6 = s;
195254721Semaste    return *this;
196254721Semaste}
197254721Semaste
198254721Semasteconst SocketAddress&
199254721SemasteSocketAddress::operator=(const struct sockaddr_storage &s)
200254721Semaste{
201254721Semaste    m_socket_addr.sa_storage = s;
202254721Semaste    return *this;
203254721Semaste}
204254721Semaste
205254721Semastebool
206254721SemasteSocketAddress::SetAddress (const struct addrinfo *hints_ptr,
207254721Semaste                           const char *host,
208254721Semaste                           const char *service,
209254721Semaste                           struct addrinfo *addr_info_ptr)
210254721Semaste{
211254721Semaste    struct addrinfo *service_info_list = NULL;
212254721Semaste    int err = ::getaddrinfo (host, service, hints_ptr, &service_info_list);
213254721Semaste    if (err == 0 && service_info_list)
214254721Semaste    {
215254721Semaste        if (addr_info_ptr)
216254721Semaste            *addr_info_ptr = *service_info_list;
217254721Semaste        *this = service_info_list;
218254721Semaste    }
219254721Semaste    else
220254721Semaste        Clear();
221254721Semaste
222254721Semaste    :: freeaddrinfo (service_info_list);
223254721Semaste
224254721Semaste    const bool is_valid = IsValid();
225254721Semaste    if (!is_valid)
226254721Semaste    {
227254721Semaste        if (addr_info_ptr)
228254721Semaste            ::memset (addr_info_ptr, 0, sizeof(struct addrinfo));
229254721Semaste    }
230254721Semaste    return is_valid;
231254721Semaste}
232254721Semaste
233254721Semaste
234254721Semastebool
235254721SemasteSocketAddress::SetToLocalhost (sa_family_t family, in_port_t port)
236254721Semaste{
237254721Semaste    switch (family)
238254721Semaste    {
239254721Semaste        case AF_INET:
240254721Semaste            SetFamily (AF_INET);
241254721Semaste            if (SetPort (port))
242254721Semaste            {
243254721Semaste                m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
244254721Semaste                return true;
245254721Semaste            }
246254721Semaste            break;
247254721Semaste
248254721Semaste        case AF_INET6:
249254721Semaste            SetFamily (AF_INET6);
250254721Semaste            if (SetPort (port))
251254721Semaste            {
252254721Semaste                m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;
253254721Semaste                return true;
254254721Semaste            }
255254721Semaste            break;
256254721Semaste
257254721Semaste    }
258254721Semaste    Clear();
259254721Semaste    return false;
260254721Semaste}
261