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"
18 // Other libraries and framework includes
21 using namespace lldb_private;
23 //----------------------------------------------------------------------
24 // SocketAddress constructor
25 //----------------------------------------------------------------------
26 SocketAddress::SocketAddress ()
31 SocketAddress::SocketAddress (const struct sockaddr &s)
37 SocketAddress::SocketAddress (const struct sockaddr_in &s)
39 m_socket_addr.sa_ipv4 = s;
43 SocketAddress::SocketAddress (const struct sockaddr_in6 &s)
45 m_socket_addr.sa_ipv6 = s;
49 SocketAddress::SocketAddress (const struct sockaddr_storage &s)
51 m_socket_addr.sa_storage = s;
54 //----------------------------------------------------------------------
55 // SocketAddress copy constructor
56 //----------------------------------------------------------------------
57 SocketAddress::SocketAddress (const SocketAddress& rhs) :
58 m_socket_addr (rhs.m_socket_addr)
62 //----------------------------------------------------------------------
64 //----------------------------------------------------------------------
65 SocketAddress::~SocketAddress()
70 SocketAddress::Clear ()
72 memset (&m_socket_addr, 0, sizeof(m_socket_addr));
76 SocketAddress::IsValid () const
78 return GetLength () != 0;
82 GetFamilyLength (sa_family_t family)
86 case AF_INET: return sizeof(struct sockaddr_in);
87 case AF_INET6: return sizeof(struct sockaddr_in6);
89 assert(0 && "Unsupported address family");
93 SocketAddress::GetLength () const
95 #if defined(__APPLE__)
96 return m_socket_addr.sa.sa_len;
98 return GetFamilyLength (GetFamily());
103 SocketAddress::GetMaxLength ()
105 return sizeof (sockaddr_t);
109 SocketAddress::GetFamily () const
111 return m_socket_addr.sa.sa_family;
115 SocketAddress::SetFamily (sa_family_t family)
117 m_socket_addr.sa.sa_family = family;
118 #if defined(__APPLE__)
119 m_socket_addr.sa.sa_len = GetFamilyLength (family);
124 SocketAddress::GetPort () const
128 case AF_INET: return m_socket_addr.sa_ipv4.sin_port;
129 case AF_INET6: return m_socket_addr.sa_ipv6.sin6_port;
135 SocketAddress::SetPort (in_port_t port)
140 m_socket_addr.sa_ipv4.sin_port = htons(port);
144 m_socket_addr.sa_ipv6.sin6_port = htons(port);
150 //----------------------------------------------------------------------
151 // SocketAddress assignment operator
152 //----------------------------------------------------------------------
154 SocketAddress::operator=(const SocketAddress& rhs)
157 m_socket_addr = rhs.m_socket_addr;
162 SocketAddress::operator=(const struct addrinfo *addr_info)
166 addr_info->ai_addr &&
167 addr_info->ai_addrlen > 0&&
168 addr_info->ai_addrlen <= sizeof m_socket_addr)
170 ::memcpy (&m_socket_addr,
172 addr_info->ai_addrlen);
178 SocketAddress::operator=(const struct sockaddr &s)
180 m_socket_addr.sa = s;
185 SocketAddress::operator=(const struct sockaddr_in &s)
187 m_socket_addr.sa_ipv4 = s;
192 SocketAddress::operator=(const struct sockaddr_in6 &s)
194 m_socket_addr.sa_ipv6 = s;
199 SocketAddress::operator=(const struct sockaddr_storage &s)
201 m_socket_addr.sa_storage = s;
206 SocketAddress::SetAddress (const struct addrinfo *hints_ptr,
209 struct addrinfo *addr_info_ptr)
211 struct addrinfo *service_info_list = NULL;
212 int err = ::getaddrinfo (host, service, hints_ptr, &service_info_list);
213 if (err == 0 && service_info_list)
216 *addr_info_ptr = *service_info_list;
217 *this = service_info_list;
222 :: freeaddrinfo (service_info_list);
224 const bool is_valid = IsValid();
228 ::memset (addr_info_ptr, 0, sizeof(struct addrinfo));
235 SocketAddress::SetToLocalhost (sa_family_t family, in_port_t port)
243 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
249 SetFamily (AF_INET6);
252 m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;