1 //===-- SocketAddress.cpp ---------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Host/SocketAddress.h"
14 #if !defined(_MSC_VER)
15 #include <arpa/inet.h>
21 // Other libraries and framework includes
24 using namespace lldb_private;
26 //----------------------------------------------------------------------
27 // SocketAddress constructor
28 //----------------------------------------------------------------------
29 SocketAddress::SocketAddress ()
34 SocketAddress::SocketAddress (const struct sockaddr &s)
40 SocketAddress::SocketAddress (const struct sockaddr_in &s)
42 m_socket_addr.sa_ipv4 = s;
46 SocketAddress::SocketAddress (const struct sockaddr_in6 &s)
48 m_socket_addr.sa_ipv6 = s;
52 SocketAddress::SocketAddress (const struct sockaddr_storage &s)
54 m_socket_addr.sa_storage = s;
57 //----------------------------------------------------------------------
58 // SocketAddress copy constructor
59 //----------------------------------------------------------------------
60 SocketAddress::SocketAddress (const SocketAddress& rhs) :
61 m_socket_addr (rhs.m_socket_addr)
65 //----------------------------------------------------------------------
67 //----------------------------------------------------------------------
68 SocketAddress::~SocketAddress()
73 SocketAddress::Clear ()
75 memset (&m_socket_addr, 0, sizeof(m_socket_addr));
79 SocketAddress::IsValid () const
81 return GetLength () != 0;
85 GetFamilyLength (sa_family_t family)
89 case AF_INET: return sizeof(struct sockaddr_in);
90 case AF_INET6: return sizeof(struct sockaddr_in6);
92 assert(0 && "Unsupported address family");
96 SocketAddress::GetLength () const
98 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
99 return m_socket_addr.sa.sa_len;
101 return GetFamilyLength (GetFamily());
106 SocketAddress::GetMaxLength ()
108 return sizeof (sockaddr_t);
112 SocketAddress::GetFamily () const
114 return m_socket_addr.sa.sa_family;
118 SocketAddress::SetFamily (sa_family_t family)
120 m_socket_addr.sa.sa_family = family;
121 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
122 m_socket_addr.sa.sa_len = GetFamilyLength (family);
127 SocketAddress::GetPort () const
131 case AF_INET: return ntohs(m_socket_addr.sa_ipv4.sin_port);
132 case AF_INET6: return ntohs(m_socket_addr.sa_ipv6.sin6_port);
138 SocketAddress::SetPort (uint16_t port)
143 m_socket_addr.sa_ipv4.sin_port = htons(port);
147 m_socket_addr.sa_ipv6.sin6_port = htons(port);
153 //----------------------------------------------------------------------
154 // SocketAddress assignment operator
155 //----------------------------------------------------------------------
157 SocketAddress::operator=(const SocketAddress& rhs)
160 m_socket_addr = rhs.m_socket_addr;
165 SocketAddress::operator=(const struct addrinfo *addr_info)
169 addr_info->ai_addr &&
170 addr_info->ai_addrlen > 0&&
171 addr_info->ai_addrlen <= sizeof m_socket_addr)
173 ::memcpy (&m_socket_addr,
175 addr_info->ai_addrlen);
181 SocketAddress::operator=(const struct sockaddr &s)
183 m_socket_addr.sa = s;
188 SocketAddress::operator=(const struct sockaddr_in &s)
190 m_socket_addr.sa_ipv4 = s;
195 SocketAddress::operator=(const struct sockaddr_in6 &s)
197 m_socket_addr.sa_ipv6 = s;
202 SocketAddress::operator=(const struct sockaddr_storage &s)
204 m_socket_addr.sa_storage = s;
209 SocketAddress::getaddrinfo (const char *host,
216 struct addrinfo hints;
217 memset(&hints, 0, sizeof(hints));
218 hints.ai_family = ai_family;
219 hints.ai_socktype = ai_socktype;
220 hints.ai_protocol = ai_protocol;
221 hints.ai_flags = ai_flags;
223 struct addrinfo *service_info_list = NULL;
224 int err = ::getaddrinfo (host, service, &hints, &service_info_list);
225 if (err == 0 && service_info_list)
226 *this = service_info_list;
230 :: freeaddrinfo (service_info_list);
236 SocketAddress::SetToLocalhost (sa_family_t family, uint16_t port)
244 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
250 SetFamily (AF_INET6);
253 m_socket_addr.sa_ipv6.sin6_addr = in6addr_loopback;
264 SocketAddress::SetToAnyAddress (sa_family_t family, uint16_t port)
272 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
278 SetFamily (AF_INET6);
281 m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;