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