1254721Semaste//===-- SocketAddress.h -----------------------------------------*- 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#ifndef liblldb_SocketAddress_h_ 11254721Semaste#define liblldb_SocketAddress_h_ 12254721Semaste 13254721Semaste// C Includes 14254721Semaste#include <stdint.h> 15263363Semaste 16263363Semaste#ifdef _WIN32 17263363Semaste#include "lldb/Host/windows/windows.h" 18263363Semaste#include <winsock2.h> 19263363Semaste#include <WS2tcpip.h> 20263363Semastetypedef ADDRESS_FAMILY sa_family_t; 21263363Semaste#else 22254721Semaste#include <sys/socket.h> 23254721Semaste#include <netdb.h> 24254721Semaste#include <netinet/in.h> 25263363Semaste#endif 26254721Semaste 27254721Semaste#if defined(__FreeBSD__) 28254721Semaste#include <sys/types.h> 29254721Semaste#endif 30254721Semaste 31254721Semaste// C++ Includes 32254721Semaste// Other libraries and framework includes 33254721Semaste// Project includes 34254721Semaste 35254721Semastenamespace lldb_private { 36254721Semaste 37254721Semasteclass SocketAddress 38254721Semaste{ 39254721Semastepublic: 40254721Semaste //------------------------------------------------------------------ 41254721Semaste // Constructors and Destructors 42254721Semaste //------------------------------------------------------------------ 43254721Semaste SocketAddress (); 44254721Semaste SocketAddress (const struct sockaddr &s); 45254721Semaste SocketAddress (const struct sockaddr_in &s); 46254721Semaste SocketAddress (const struct sockaddr_in6 &s); 47254721Semaste SocketAddress (const struct sockaddr_storage &s); 48254721Semaste SocketAddress (const SocketAddress& rhs); 49254721Semaste ~SocketAddress (); 50254721Semaste 51254721Semaste //------------------------------------------------------------------ 52254721Semaste // Operators 53254721Semaste //------------------------------------------------------------------ 54254721Semaste const SocketAddress& 55254721Semaste operator=(const SocketAddress& rhs); 56254721Semaste 57254721Semaste const SocketAddress& 58254721Semaste operator=(const struct addrinfo *addr_info); 59254721Semaste 60254721Semaste const SocketAddress& 61254721Semaste operator=(const struct sockaddr &s); 62254721Semaste 63254721Semaste const SocketAddress& 64254721Semaste operator=(const struct sockaddr_in &s); 65254721Semaste 66254721Semaste const SocketAddress& 67254721Semaste operator=(const struct sockaddr_in6 &s); 68254721Semaste 69254721Semaste const SocketAddress& 70254721Semaste operator=(const struct sockaddr_storage &s); 71254721Semaste 72254721Semaste //------------------------------------------------------------------ 73254721Semaste // Clear the contents of this socket address 74254721Semaste //------------------------------------------------------------------ 75254721Semaste void 76254721Semaste Clear (); 77254721Semaste 78254721Semaste //------------------------------------------------------------------ 79254721Semaste // Get the length for the current socket address family 80254721Semaste //------------------------------------------------------------------ 81254721Semaste socklen_t 82254721Semaste GetLength () const; 83254721Semaste 84254721Semaste //------------------------------------------------------------------ 85254721Semaste // Get the mex length for the the largest socket address supported. 86254721Semaste //------------------------------------------------------------------ 87254721Semaste static socklen_t 88254721Semaste GetMaxLength (); 89254721Semaste 90254721Semaste //------------------------------------------------------------------ 91254721Semaste // Get the socket address family 92254721Semaste //------------------------------------------------------------------ 93254721Semaste sa_family_t 94254721Semaste GetFamily () const; 95254721Semaste 96254721Semaste //------------------------------------------------------------------ 97254721Semaste // Set the socket address family 98254721Semaste //------------------------------------------------------------------ 99254721Semaste void 100254721Semaste SetFamily (sa_family_t family); 101254721Semaste 102254721Semaste //------------------------------------------------------------------ 103254721Semaste // Get the port if the socket address for the family has a port 104254721Semaste //------------------------------------------------------------------ 105269024Semaste uint16_t 106254721Semaste GetPort () const; 107254721Semaste 108254721Semaste //------------------------------------------------------------------ 109254721Semaste // Set the port if the socket address for the family has a port. 110254721Semaste // The family must be set correctly prior to calling this function. 111254721Semaste //------------------------------------------------------------------ 112254721Semaste bool 113269024Semaste SetPort (uint16_t port); 114254721Semaste 115254721Semaste //------------------------------------------------------------------ 116254721Semaste // Set the socket address according to the first match from a call 117254721Semaste // to getaddrinfo() (or equivalent functions for systems that don't 118254721Semaste // have getaddrinfo(). If "addr_info_ptr" is not NULL, it will get 119254721Semaste // filled in with the match that was used to populate this socket 120254721Semaste // address. 121254721Semaste //------------------------------------------------------------------ 122254721Semaste bool 123269024Semaste getaddrinfo (const char *host, // Hostname ("foo.bar.com" or "foo" or IP address string ("123.234.12.1" or "2001:0db8:85a3:0000:0000:8a2e:0370:7334") 124269024Semaste const char *service, // Protocol name ("tcp", "http", etc) or a raw port number string ("81") 125269024Semaste int ai_family = PF_UNSPEC, 126269024Semaste int ai_socktype = 0, 127269024Semaste int ai_protocol = 0, 128269024Semaste int ai_flags = 0); 129254721Semaste 130254721Semaste //------------------------------------------------------------------ 131254721Semaste // Quick way to set the SocketAddress to localhost given the family. 132254721Semaste // Returns true if successful, false if "family" doesn't support 133254721Semaste // localhost or if "family" is not supported by this class. 134254721Semaste //------------------------------------------------------------------ 135254721Semaste bool 136254721Semaste SetToLocalhost (sa_family_t family, 137269024Semaste uint16_t port); 138254721Semaste 139269024Semaste bool 140269024Semaste SetToAnyAddress (sa_family_t family, 141269024Semaste uint16_t port); 142269024Semaste 143254721Semaste //------------------------------------------------------------------ 144254721Semaste // Returns true if there is a valid socket address in this object. 145254721Semaste //------------------------------------------------------------------ 146254721Semaste bool 147254721Semaste IsValid () const; 148254721Semaste 149254721Semaste //------------------------------------------------------------------ 150254721Semaste // Direct access to all of the sockaddr structures 151254721Semaste //------------------------------------------------------------------ 152254721Semaste struct sockaddr & 153254721Semaste sockaddr () 154254721Semaste { 155254721Semaste return m_socket_addr.sa; 156254721Semaste } 157254721Semaste 158254721Semaste const struct sockaddr & 159254721Semaste sockaddr () const 160254721Semaste { 161254721Semaste return m_socket_addr.sa; 162254721Semaste } 163254721Semaste 164254721Semaste struct sockaddr_in & 165254721Semaste sockaddr_in () 166254721Semaste { 167254721Semaste return m_socket_addr.sa_ipv4; 168254721Semaste } 169254721Semaste 170254721Semaste const struct sockaddr_in & 171254721Semaste sockaddr_in () const 172254721Semaste { 173254721Semaste return m_socket_addr.sa_ipv4; 174254721Semaste } 175254721Semaste 176254721Semaste struct sockaddr_in6 & 177254721Semaste sockaddr_in6 () 178254721Semaste { 179254721Semaste return m_socket_addr.sa_ipv6; 180254721Semaste } 181254721Semaste 182254721Semaste const struct sockaddr_in6 & 183254721Semaste sockaddr_in6 () const 184254721Semaste { 185254721Semaste return m_socket_addr.sa_ipv6; 186254721Semaste } 187254721Semaste 188254721Semaste struct sockaddr_storage & 189254721Semaste sockaddr_storage () 190254721Semaste { 191254721Semaste return m_socket_addr.sa_storage; 192254721Semaste } 193254721Semaste 194254721Semaste 195254721Semaste const struct sockaddr_storage & 196254721Semaste sockaddr_storage () const 197254721Semaste { 198254721Semaste return m_socket_addr.sa_storage; 199254721Semaste } 200254721Semaste 201254721Semaste 202254721Semaste //------------------------------------------------------------------ 203254721Semaste // Conversion operators to allow getting the contents of this class 204254721Semaste // as a pointer to the appropriate structure. This allows an instance 205254721Semaste // of this class to be used in calls that take one of the sockaddr 206254721Semaste // structure variants without having to manally use the correct 207254721Semaste // accessor function. 208254721Semaste //------------------------------------------------------------------ 209254721Semaste 210254721Semaste operator struct sockaddr * () 211254721Semaste { 212254721Semaste return &m_socket_addr.sa; 213254721Semaste } 214254721Semaste 215254721Semaste operator const struct sockaddr * () const 216254721Semaste { 217254721Semaste return &m_socket_addr.sa; 218254721Semaste } 219254721Semaste 220254721Semaste operator struct sockaddr_in * () 221254721Semaste { 222254721Semaste return &m_socket_addr.sa_ipv4; 223254721Semaste } 224254721Semaste 225254721Semaste operator const struct sockaddr_in * () const 226254721Semaste { 227254721Semaste return &m_socket_addr.sa_ipv4; 228254721Semaste } 229254721Semaste 230254721Semaste operator struct sockaddr_in6 * () 231254721Semaste { 232254721Semaste return &m_socket_addr.sa_ipv6; 233254721Semaste } 234254721Semaste 235254721Semaste operator const struct sockaddr_in6 * () const 236254721Semaste { 237254721Semaste return &m_socket_addr.sa_ipv6; 238254721Semaste } 239254721Semaste 240254721Semaste operator const struct sockaddr_storage * () const 241254721Semaste { 242254721Semaste return &m_socket_addr.sa_storage; 243254721Semaste } 244254721Semaste 245254721Semaste operator struct sockaddr_storage * () 246254721Semaste { 247254721Semaste return &m_socket_addr.sa_storage; 248254721Semaste } 249254721Semaste 250254721Semaste 251254721Semasteprotected: 252254721Semaste typedef union sockaddr_tag 253254721Semaste { 254254721Semaste struct sockaddr sa; 255254721Semaste struct sockaddr_in sa_ipv4; 256254721Semaste struct sockaddr_in6 sa_ipv6; 257254721Semaste struct sockaddr_storage sa_storage; 258254721Semaste } sockaddr_t; 259254721Semaste 260254721Semaste //------------------------------------------------------------------ 261254721Semaste // Classes that inherit from SocketAddress can see and modify these 262254721Semaste //------------------------------------------------------------------ 263254721Semaste sockaddr_t m_socket_addr; 264254721Semaste}; 265254721Semaste 266254721Semaste 267254721Semaste} // namespace lldb_private 268254721Semaste 269254721Semaste 270254721Semaste#endif // liblldb_SocketAddress_h_ 271