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> 15254721Semaste#include <sys/socket.h> 16254721Semaste#include <netdb.h> 17254721Semaste#include <netinet/in.h> 18254721Semaste 19254721Semaste#if defined(__FreeBSD__) 20254721Semaste#include <sys/types.h> 21254721Semaste#endif 22254721Semaste 23254721Semaste// C++ Includes 24254721Semaste// Other libraries and framework includes 25254721Semaste// Project includes 26254721Semaste 27254721Semastenamespace lldb_private { 28254721Semaste 29254721Semasteclass SocketAddress 30254721Semaste{ 31254721Semastepublic: 32254721Semaste //------------------------------------------------------------------ 33254721Semaste // Constructors and Destructors 34254721Semaste //------------------------------------------------------------------ 35254721Semaste SocketAddress (); 36254721Semaste SocketAddress (const struct sockaddr &s); 37254721Semaste SocketAddress (const struct sockaddr_in &s); 38254721Semaste SocketAddress (const struct sockaddr_in6 &s); 39254721Semaste SocketAddress (const struct sockaddr_storage &s); 40254721Semaste SocketAddress (const SocketAddress& rhs); 41254721Semaste ~SocketAddress (); 42254721Semaste 43254721Semaste //------------------------------------------------------------------ 44254721Semaste // Operators 45254721Semaste //------------------------------------------------------------------ 46254721Semaste const SocketAddress& 47254721Semaste operator=(const SocketAddress& rhs); 48254721Semaste 49254721Semaste const SocketAddress& 50254721Semaste operator=(const struct addrinfo *addr_info); 51254721Semaste 52254721Semaste const SocketAddress& 53254721Semaste operator=(const struct sockaddr &s); 54254721Semaste 55254721Semaste const SocketAddress& 56254721Semaste operator=(const struct sockaddr_in &s); 57254721Semaste 58254721Semaste const SocketAddress& 59254721Semaste operator=(const struct sockaddr_in6 &s); 60254721Semaste 61254721Semaste const SocketAddress& 62254721Semaste operator=(const struct sockaddr_storage &s); 63254721Semaste 64254721Semaste //------------------------------------------------------------------ 65254721Semaste // Clear the contents of this socket address 66254721Semaste //------------------------------------------------------------------ 67254721Semaste void 68254721Semaste Clear (); 69254721Semaste 70254721Semaste //------------------------------------------------------------------ 71254721Semaste // Get the length for the current socket address family 72254721Semaste //------------------------------------------------------------------ 73254721Semaste socklen_t 74254721Semaste GetLength () const; 75254721Semaste 76254721Semaste //------------------------------------------------------------------ 77254721Semaste // Get the mex length for the the largest socket address supported. 78254721Semaste //------------------------------------------------------------------ 79254721Semaste static socklen_t 80254721Semaste GetMaxLength (); 81254721Semaste 82254721Semaste //------------------------------------------------------------------ 83254721Semaste // Get the socket address family 84254721Semaste //------------------------------------------------------------------ 85254721Semaste sa_family_t 86254721Semaste GetFamily () const; 87254721Semaste 88254721Semaste //------------------------------------------------------------------ 89254721Semaste // Set the socket address family 90254721Semaste //------------------------------------------------------------------ 91254721Semaste void 92254721Semaste SetFamily (sa_family_t family); 93254721Semaste 94254721Semaste //------------------------------------------------------------------ 95254721Semaste // Get the port if the socket address for the family has a port 96254721Semaste //------------------------------------------------------------------ 97254721Semaste in_port_t 98254721Semaste GetPort () const; 99254721Semaste 100254721Semaste //------------------------------------------------------------------ 101254721Semaste // Set the port if the socket address for the family has a port. 102254721Semaste // The family must be set correctly prior to calling this function. 103254721Semaste //------------------------------------------------------------------ 104254721Semaste bool 105254721Semaste SetPort (in_port_t port); 106254721Semaste 107254721Semaste //------------------------------------------------------------------ 108254721Semaste // Set the socket address according to the first match from a call 109254721Semaste // to getaddrinfo() (or equivalent functions for systems that don't 110254721Semaste // have getaddrinfo(). If "addr_info_ptr" is not NULL, it will get 111254721Semaste // filled in with the match that was used to populate this socket 112254721Semaste // address. 113254721Semaste //------------------------------------------------------------------ 114254721Semaste bool 115254721Semaste SetAddress (const struct addrinfo *hints_ptr, // Optional hints where the family, protocol and other things can be specified. 116254721Semaste 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") 117254721Semaste const char *service, // Protocol name ("tcp", "http", etc) or a raw port number string ("81") 118254721Semaste struct addrinfo *addr_info_ptr); // If non-NULL, this will get filled in with the match 119254721Semaste 120254721Semaste //------------------------------------------------------------------ 121254721Semaste // Quick way to set the SocketAddress to localhost given the family. 122254721Semaste // Returns true if successful, false if "family" doesn't support 123254721Semaste // localhost or if "family" is not supported by this class. 124254721Semaste //------------------------------------------------------------------ 125254721Semaste bool 126254721Semaste SetToLocalhost (sa_family_t family, 127254721Semaste in_port_t port); 128254721Semaste 129254721Semaste //------------------------------------------------------------------ 130254721Semaste // Returns true if there is a valid socket address in this object. 131254721Semaste //------------------------------------------------------------------ 132254721Semaste bool 133254721Semaste IsValid () const; 134254721Semaste 135254721Semaste //------------------------------------------------------------------ 136254721Semaste // Direct access to all of the sockaddr structures 137254721Semaste //------------------------------------------------------------------ 138254721Semaste struct sockaddr & 139254721Semaste sockaddr () 140254721Semaste { 141254721Semaste return m_socket_addr.sa; 142254721Semaste } 143254721Semaste 144254721Semaste const struct sockaddr & 145254721Semaste sockaddr () const 146254721Semaste { 147254721Semaste return m_socket_addr.sa; 148254721Semaste } 149254721Semaste 150254721Semaste struct sockaddr_in & 151254721Semaste sockaddr_in () 152254721Semaste { 153254721Semaste return m_socket_addr.sa_ipv4; 154254721Semaste } 155254721Semaste 156254721Semaste const struct sockaddr_in & 157254721Semaste sockaddr_in () const 158254721Semaste { 159254721Semaste return m_socket_addr.sa_ipv4; 160254721Semaste } 161254721Semaste 162254721Semaste struct sockaddr_in6 & 163254721Semaste sockaddr_in6 () 164254721Semaste { 165254721Semaste return m_socket_addr.sa_ipv6; 166254721Semaste } 167254721Semaste 168254721Semaste const struct sockaddr_in6 & 169254721Semaste sockaddr_in6 () const 170254721Semaste { 171254721Semaste return m_socket_addr.sa_ipv6; 172254721Semaste } 173254721Semaste 174254721Semaste struct sockaddr_storage & 175254721Semaste sockaddr_storage () 176254721Semaste { 177254721Semaste return m_socket_addr.sa_storage; 178254721Semaste } 179254721Semaste 180254721Semaste 181254721Semaste const struct sockaddr_storage & 182254721Semaste sockaddr_storage () const 183254721Semaste { 184254721Semaste return m_socket_addr.sa_storage; 185254721Semaste } 186254721Semaste 187254721Semaste 188254721Semaste //------------------------------------------------------------------ 189254721Semaste // Conversion operators to allow getting the contents of this class 190254721Semaste // as a pointer to the appropriate structure. This allows an instance 191254721Semaste // of this class to be used in calls that take one of the sockaddr 192254721Semaste // structure variants without having to manally use the correct 193254721Semaste // accessor function. 194254721Semaste //------------------------------------------------------------------ 195254721Semaste 196254721Semaste operator struct sockaddr * () 197254721Semaste { 198254721Semaste return &m_socket_addr.sa; 199254721Semaste } 200254721Semaste 201254721Semaste operator const struct sockaddr * () const 202254721Semaste { 203254721Semaste return &m_socket_addr.sa; 204254721Semaste } 205254721Semaste 206254721Semaste operator struct sockaddr_in * () 207254721Semaste { 208254721Semaste return &m_socket_addr.sa_ipv4; 209254721Semaste } 210254721Semaste 211254721Semaste operator const struct sockaddr_in * () const 212254721Semaste { 213254721Semaste return &m_socket_addr.sa_ipv4; 214254721Semaste } 215254721Semaste 216254721Semaste operator struct sockaddr_in6 * () 217254721Semaste { 218254721Semaste return &m_socket_addr.sa_ipv6; 219254721Semaste } 220254721Semaste 221254721Semaste operator const struct sockaddr_in6 * () const 222254721Semaste { 223254721Semaste return &m_socket_addr.sa_ipv6; 224254721Semaste } 225254721Semaste 226254721Semaste operator const struct sockaddr_storage * () const 227254721Semaste { 228254721Semaste return &m_socket_addr.sa_storage; 229254721Semaste } 230254721Semaste 231254721Semaste operator struct sockaddr_storage * () 232254721Semaste { 233254721Semaste return &m_socket_addr.sa_storage; 234254721Semaste } 235254721Semaste 236254721Semaste 237254721Semasteprotected: 238254721Semaste typedef union sockaddr_tag 239254721Semaste { 240254721Semaste struct sockaddr sa; 241254721Semaste struct sockaddr_in sa_ipv4; 242254721Semaste struct sockaddr_in6 sa_ipv6; 243254721Semaste struct sockaddr_storage sa_storage; 244254721Semaste } sockaddr_t; 245254721Semaste 246254721Semaste //------------------------------------------------------------------ 247254721Semaste // Classes that inherit from SocketAddress can see and modify these 248254721Semaste //------------------------------------------------------------------ 249254721Semaste sockaddr_t m_socket_addr; 250254721Semaste}; 251254721Semaste 252254721Semaste 253254721Semaste} // namespace lldb_private 254254721Semaste 255254721Semaste 256254721Semaste#endif // liblldb_SocketAddress_h_ 257