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