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"
16 #include <arpa/inet.h>
18 #include "lldb/Host/windows/win32.h"
24 // Other libraries and framework includes
27 // WindowsXP needs an inet_ntop implementation
30 #ifndef INET6_ADDRSTRLEN // might not be defined in older Windows SDKs
31 #define INET6_ADDRSTRLEN 46
34 // TODO: implement shortened form "::" for runs of zeros
35 const char* inet_ntop(int af, const void * src,
36 char * dst, socklen_t size)
48 const char* formatted = inet_ntoa(*static_cast<const in_addr*>(src));
49 if (formatted && strlen(formatted) < size)
51 return ::strcpy(dst, formatted);
57 char tmp[INET6_ADDRSTRLEN] = {0};
58 const uint16_t* src16 = static_cast<const uint16_t*>(src);
59 int full_size = ::snprintf(tmp, sizeof(tmp),
60 "%x:%x:%x:%x:%x:%x:%x:%x",
61 ntohs(src16[0]), ntohs(src16[1]), ntohs(src16[2]), ntohs(src16[3]),
62 ntohs(src16[4]), ntohs(src16[5]), ntohs(src16[6]), ntohs(src16[7])
64 if (full_size < static_cast<int>(size))
66 return ::strcpy(dst, tmp);
77 using namespace lldb_private;
79 //----------------------------------------------------------------------
80 // SocketAddress constructor
81 //----------------------------------------------------------------------
82 SocketAddress::SocketAddress ()
87 SocketAddress::SocketAddress (const struct sockaddr &s)
93 SocketAddress::SocketAddress (const struct sockaddr_in &s)
95 m_socket_addr.sa_ipv4 = s;
99 SocketAddress::SocketAddress (const struct sockaddr_in6 &s)
101 m_socket_addr.sa_ipv6 = s;
105 SocketAddress::SocketAddress (const struct sockaddr_storage &s)
107 m_socket_addr.sa_storage = s;
110 //----------------------------------------------------------------------
111 // SocketAddress copy constructor
112 //----------------------------------------------------------------------
113 SocketAddress::SocketAddress (const SocketAddress& rhs) :
114 m_socket_addr (rhs.m_socket_addr)
118 //----------------------------------------------------------------------
120 //----------------------------------------------------------------------
121 SocketAddress::~SocketAddress()
126 SocketAddress::Clear ()
128 memset (&m_socket_addr, 0, sizeof(m_socket_addr));
132 SocketAddress::IsValid () const
134 return GetLength () != 0;
138 GetFamilyLength (sa_family_t family)
142 case AF_INET: return sizeof(struct sockaddr_in);
143 case AF_INET6: return sizeof(struct sockaddr_in6);
145 assert(0 && "Unsupported address family");
150 SocketAddress::GetLength () const
152 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
153 return m_socket_addr.sa.sa_len;
155 return GetFamilyLength (GetFamily());
160 SocketAddress::GetMaxLength ()
162 return sizeof (sockaddr_t);
166 SocketAddress::GetFamily () const
168 return m_socket_addr.sa.sa_family;
172 SocketAddress::SetFamily (sa_family_t family)
174 m_socket_addr.sa.sa_family = family;
175 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
176 m_socket_addr.sa.sa_len = GetFamilyLength (family);
181 SocketAddress::GetIPAddress () const
183 char str[INET6_ADDRSTRLEN] = {0};
187 if (inet_ntop(GetFamily(), &m_socket_addr.sa_ipv4.sin_addr, str, sizeof(str)))
192 if (inet_ntop(GetFamily(), &m_socket_addr.sa_ipv6.sin6_addr, str, sizeof(str)))
201 SocketAddress::GetPort () const
205 case AF_INET: return ntohs(m_socket_addr.sa_ipv4.sin_port);
206 case AF_INET6: return ntohs(m_socket_addr.sa_ipv6.sin6_port);
212 SocketAddress::SetPort (uint16_t port)
217 m_socket_addr.sa_ipv4.sin_port = htons(port);
221 m_socket_addr.sa_ipv6.sin6_port = htons(port);
227 //----------------------------------------------------------------------
228 // SocketAddress assignment operator
229 //----------------------------------------------------------------------
231 SocketAddress::operator=(const SocketAddress& rhs)
234 m_socket_addr = rhs.m_socket_addr;
239 SocketAddress::operator=(const struct addrinfo *addr_info)
243 addr_info->ai_addr &&
244 addr_info->ai_addrlen > 0&&
245 addr_info->ai_addrlen <= sizeof m_socket_addr)
247 ::memcpy (&m_socket_addr,
249 addr_info->ai_addrlen);
255 SocketAddress::operator=(const struct sockaddr &s)
257 m_socket_addr.sa = s;
262 SocketAddress::operator=(const struct sockaddr_in &s)
264 m_socket_addr.sa_ipv4 = s;
269 SocketAddress::operator=(const struct sockaddr_in6 &s)
271 m_socket_addr.sa_ipv6 = s;
276 SocketAddress::operator=(const struct sockaddr_storage &s)
278 m_socket_addr.sa_storage = s;
283 SocketAddress::getaddrinfo (const char *host,
292 struct addrinfo hints;
293 memset(&hints, 0, sizeof(hints));
294 hints.ai_family = ai_family;
295 hints.ai_socktype = ai_socktype;
296 hints.ai_protocol = ai_protocol;
297 hints.ai_flags = ai_flags;
300 struct addrinfo *service_info_list = NULL;
301 int err = ::getaddrinfo (host, service, &hints, &service_info_list);
302 if (err == 0 && service_info_list)
304 *this = service_info_list;
308 if (service_info_list)
309 ::freeaddrinfo(service_info_list);
316 SocketAddress::SetToLocalhost (sa_family_t family, uint16_t port)
324 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
330 SetFamily (AF_INET6);
333 m_socket_addr.sa_ipv6.sin6_addr = in6addr_loopback;
344 SocketAddress::SetToAnyAddress (sa_family_t family, uint16_t port)
352 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
358 SetFamily (AF_INET6);
361 m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;