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
14263363Semaste#if !defined(_MSC_VER)
15263363Semaste#include <arpa/inet.h>
16263363Semaste#endif
17254721Semaste#include <assert.h>
18254721Semaste#include <string.h>
19254721Semaste
20254721Semaste// C++ Includes
21254721Semaste// Other libraries and framework includes
22254721Semaste// Project includes
23254721Semaste
24254721Semasteusing namespace lldb_private;
25254721Semaste
26254721Semaste//----------------------------------------------------------------------
27254721Semaste// SocketAddress constructor
28254721Semaste//----------------------------------------------------------------------
29254721SemasteSocketAddress::SocketAddress ()
30254721Semaste{
31254721Semaste    Clear ();
32254721Semaste}
33254721Semaste
34254721SemasteSocketAddress::SocketAddress (const struct sockaddr &s)
35254721Semaste{
36254721Semaste    m_socket_addr.sa = s;
37254721Semaste}
38254721Semaste
39254721Semaste
40254721SemasteSocketAddress::SocketAddress (const struct sockaddr_in &s)
41254721Semaste{
42254721Semaste    m_socket_addr.sa_ipv4 = s;
43254721Semaste}
44254721Semaste
45254721Semaste
46254721SemasteSocketAddress::SocketAddress (const struct sockaddr_in6 &s)
47254721Semaste{
48254721Semaste    m_socket_addr.sa_ipv6 = s;
49254721Semaste}
50254721Semaste
51254721Semaste
52254721SemasteSocketAddress::SocketAddress (const struct sockaddr_storage &s)
53254721Semaste{
54254721Semaste    m_socket_addr.sa_storage = s;
55254721Semaste}
56254721Semaste
57254721Semaste//----------------------------------------------------------------------
58254721Semaste// SocketAddress copy constructor
59254721Semaste//----------------------------------------------------------------------
60254721SemasteSocketAddress::SocketAddress (const SocketAddress& rhs) :
61254721Semaste    m_socket_addr (rhs.m_socket_addr)
62254721Semaste{
63254721Semaste}
64254721Semaste
65254721Semaste//----------------------------------------------------------------------
66254721Semaste// Destructor
67254721Semaste//----------------------------------------------------------------------
68254721SemasteSocketAddress::~SocketAddress()
69254721Semaste{
70254721Semaste}
71254721Semaste
72254721Semastevoid
73254721SemasteSocketAddress::Clear ()
74254721Semaste{
75254721Semaste    memset (&m_socket_addr, 0, sizeof(m_socket_addr));
76254721Semaste}
77254721Semaste
78254721Semastebool
79254721SemasteSocketAddress::IsValid () const
80254721Semaste{
81254721Semaste    return GetLength () != 0;
82254721Semaste}
83254721Semaste
84254721Semastestatic socklen_t
85254721SemasteGetFamilyLength (sa_family_t family)
86254721Semaste{
87254721Semaste    switch (family)
88254721Semaste    {
89254721Semaste        case AF_INET:  return sizeof(struct sockaddr_in);
90254721Semaste        case AF_INET6: return sizeof(struct sockaddr_in6);
91254721Semaste    }
92254721Semaste    assert(0 && "Unsupported address family");
93254721Semaste}
94254721Semaste
95254721Semastesocklen_t
96254721SemasteSocketAddress::GetLength () const
97254721Semaste{
98269024Semaste#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
99254721Semaste    return m_socket_addr.sa.sa_len;
100254721Semaste#else
101254721Semaste    return GetFamilyLength (GetFamily());
102254721Semaste#endif
103254721Semaste}
104254721Semaste
105254721Semastesocklen_t
106254721SemasteSocketAddress::GetMaxLength ()
107254721Semaste{
108254721Semaste    return sizeof (sockaddr_t);
109254721Semaste}
110254721Semaste
111254721Semastesa_family_t
112254721SemasteSocketAddress::GetFamily () const
113254721Semaste{
114254721Semaste    return m_socket_addr.sa.sa_family;
115254721Semaste}
116254721Semaste
117254721Semastevoid
118254721SemasteSocketAddress::SetFamily (sa_family_t family)
119254721Semaste{
120254721Semaste    m_socket_addr.sa.sa_family = family;
121269024Semaste#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
122254721Semaste    m_socket_addr.sa.sa_len = GetFamilyLength (family);
123254721Semaste#endif
124254721Semaste}
125254721Semaste
126269024Semasteuint16_t
127254721SemasteSocketAddress::GetPort () const
128254721Semaste{
129254721Semaste    switch (GetFamily())
130254721Semaste    {
131269024Semaste        case AF_INET:   return ntohs(m_socket_addr.sa_ipv4.sin_port);
132269024Semaste        case AF_INET6:  return ntohs(m_socket_addr.sa_ipv6.sin6_port);
133254721Semaste    }
134254721Semaste    return 0;
135254721Semaste}
136254721Semaste
137254721Semastebool
138269024SemasteSocketAddress::SetPort (uint16_t port)
139254721Semaste{
140254721Semaste    switch (GetFamily())
141254721Semaste    {
142254721Semaste        case AF_INET:
143254721Semaste            m_socket_addr.sa_ipv4.sin_port = htons(port);
144254721Semaste            return true;
145254721Semaste
146254721Semaste        case AF_INET6:
147254721Semaste            m_socket_addr.sa_ipv6.sin6_port = htons(port);
148254721Semaste            return true;
149254721Semaste    }
150254721Semaste    return false;
151254721Semaste}
152254721Semaste
153254721Semaste//----------------------------------------------------------------------
154254721Semaste// SocketAddress assignment operator
155254721Semaste//----------------------------------------------------------------------
156254721Semasteconst SocketAddress&
157254721SemasteSocketAddress::operator=(const SocketAddress& rhs)
158254721Semaste{
159254721Semaste    if (this != &rhs)
160254721Semaste        m_socket_addr = rhs.m_socket_addr;
161254721Semaste    return *this;
162254721Semaste}
163254721Semaste
164254721Semasteconst SocketAddress&
165254721SemasteSocketAddress::operator=(const struct addrinfo *addr_info)
166254721Semaste{
167254721Semaste    Clear();
168254721Semaste    if (addr_info &&
169254721Semaste        addr_info->ai_addr &&
170254721Semaste        addr_info->ai_addrlen > 0&&
171254721Semaste        addr_info->ai_addrlen <= sizeof m_socket_addr)
172254721Semaste    {
173254721Semaste        ::memcpy (&m_socket_addr,
174254721Semaste                  addr_info->ai_addr,
175254721Semaste                  addr_info->ai_addrlen);
176254721Semaste    }
177254721Semaste    return *this;
178254721Semaste}
179254721Semaste
180254721Semasteconst SocketAddress&
181254721SemasteSocketAddress::operator=(const struct sockaddr &s)
182254721Semaste{
183254721Semaste    m_socket_addr.sa = s;
184254721Semaste    return *this;
185254721Semaste}
186254721Semaste
187254721Semasteconst SocketAddress&
188254721SemasteSocketAddress::operator=(const struct sockaddr_in &s)
189254721Semaste{
190254721Semaste    m_socket_addr.sa_ipv4 = s;
191254721Semaste    return *this;
192254721Semaste}
193254721Semaste
194254721Semasteconst SocketAddress&
195254721SemasteSocketAddress::operator=(const struct sockaddr_in6 &s)
196254721Semaste{
197254721Semaste    m_socket_addr.sa_ipv6 = s;
198254721Semaste    return *this;
199254721Semaste}
200254721Semaste
201254721Semasteconst SocketAddress&
202254721SemasteSocketAddress::operator=(const struct sockaddr_storage &s)
203254721Semaste{
204254721Semaste    m_socket_addr.sa_storage = s;
205254721Semaste    return *this;
206254721Semaste}
207254721Semaste
208254721Semastebool
209269024SemasteSocketAddress::getaddrinfo (const char *host,
210269024Semaste                            const char *service,
211269024Semaste                            int ai_family,
212269024Semaste                            int ai_socktype,
213269024Semaste                            int ai_protocol,
214269024Semaste                            int ai_flags)
215254721Semaste{
216269024Semaste    struct addrinfo hints;
217269024Semaste    memset(&hints, 0, sizeof(hints));
218269024Semaste    hints.ai_family = ai_family;
219269024Semaste    hints.ai_socktype = ai_socktype;
220269024Semaste    hints.ai_protocol = ai_protocol;
221269024Semaste    hints.ai_flags = ai_flags;
222269024Semaste
223254721Semaste    struct addrinfo *service_info_list = NULL;
224269024Semaste    int err = ::getaddrinfo (host, service, &hints, &service_info_list);
225254721Semaste    if (err == 0 && service_info_list)
226254721Semaste        *this = service_info_list;
227254721Semaste    else
228254721Semaste        Clear();
229254721Semaste
230254721Semaste    :: freeaddrinfo (service_info_list);
231269024Semaste    return IsValid();
232254721Semaste}
233254721Semaste
234254721Semaste
235254721Semastebool
236269024SemasteSocketAddress::SetToLocalhost (sa_family_t family, uint16_t port)
237254721Semaste{
238254721Semaste    switch (family)
239254721Semaste    {
240254721Semaste        case AF_INET:
241254721Semaste            SetFamily (AF_INET);
242254721Semaste            if (SetPort (port))
243254721Semaste            {
244269024Semaste                m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
245254721Semaste                return true;
246254721Semaste            }
247254721Semaste            break;
248254721Semaste
249254721Semaste        case AF_INET6:
250254721Semaste            SetFamily (AF_INET6);
251254721Semaste            if (SetPort (port))
252254721Semaste            {
253269024Semaste                m_socket_addr.sa_ipv6.sin6_addr = in6addr_loopback;
254254721Semaste                return true;
255254721Semaste            }
256254721Semaste            break;
257254721Semaste
258254721Semaste    }
259254721Semaste    Clear();
260254721Semaste    return false;
261254721Semaste}
262269024Semaste
263269024Semastebool
264269024SemasteSocketAddress::SetToAnyAddress (sa_family_t family, uint16_t port)
265269024Semaste{
266269024Semaste    switch (family)
267269024Semaste    {
268269024Semaste        case AF_INET:
269269024Semaste            SetFamily (AF_INET);
270269024Semaste            if (SetPort (port))
271269024Semaste            {
272269024Semaste                m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
273269024Semaste                return true;
274269024Semaste            }
275269024Semaste            break;
276269024Semaste
277269024Semaste        case AF_INET6:
278269024Semaste            SetFamily (AF_INET6);
279269024Semaste            if (SetPort (port))
280269024Semaste            {
281269024Semaste                m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;
282269024Semaste                return true;
283269024Semaste            }
284269024Semaste            break;
285269024Semaste
286269024Semaste    }
287269024Semaste    Clear();
288269024Semaste    return false;
289269024Semaste}
290