blob: 749a9c664c81b967a4a56a2a60fee33ce4bdc711 [file] [log] [blame]
//===-- SocketAddress.h -----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_SocketAddress_h_
#define liblldb_SocketAddress_h_
// C Includes
#include <stdint.h>
#ifdef _WIN32
#include "lldb/Host/windows/windows.h"
#include <winsock2.h>
#include <ws2tcpip.h>
typedef ADDRESS_FAMILY sa_family_t;
#else
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#endif
#if defined(__FreeBSD__)
#include <sys/types.h>
#endif
// C++ Includes
// Other libraries and framework includes
// Project includes
#include <string>
#include <vector>
namespace lldb_private {
class SocketAddress {
public:
//----------------------------------------------------------------------------
// Static method to get all address information for a host and/or service
//----------------------------------------------------------------------------
static std::vector<SocketAddress>
GetAddressInfo(const char *hostname, const char *servname, int ai_family,
int ai_socktype, int ai_protocol, int ai_flags = 0);
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
SocketAddress();
SocketAddress(const struct addrinfo *addr_info);
SocketAddress(const struct sockaddr &s);
SocketAddress(const struct sockaddr_in &s);
SocketAddress(const struct sockaddr_in6 &s);
SocketAddress(const struct sockaddr_storage &s);
SocketAddress(const SocketAddress &rhs);
~SocketAddress();
//------------------------------------------------------------------
// Operators
//------------------------------------------------------------------
const SocketAddress &operator=(const SocketAddress &rhs);
const SocketAddress &operator=(const struct addrinfo *addr_info);
const SocketAddress &operator=(const struct sockaddr &s);
const SocketAddress &operator=(const struct sockaddr_in &s);
const SocketAddress &operator=(const struct sockaddr_in6 &s);
const SocketAddress &operator=(const struct sockaddr_storage &s);
bool operator==(const SocketAddress &rhs) const;
bool operator!=(const SocketAddress &rhs) const;
//------------------------------------------------------------------
// Clear the contents of this socket address
//------------------------------------------------------------------
void Clear();
//------------------------------------------------------------------
// Get the length for the current socket address family
//------------------------------------------------------------------
socklen_t GetLength() const;
//------------------------------------------------------------------
// Get the max length for the largest socket address supported.
//------------------------------------------------------------------
static socklen_t GetMaxLength();
//------------------------------------------------------------------
// Get the socket address family
//------------------------------------------------------------------
sa_family_t GetFamily() const;
//------------------------------------------------------------------
// Set the socket address family
//------------------------------------------------------------------
void SetFamily(sa_family_t family);
//------------------------------------------------------------------
// Get the address
//------------------------------------------------------------------
std::string GetIPAddress() const;
//------------------------------------------------------------------
// Get the port if the socket address for the family has a port
//------------------------------------------------------------------
uint16_t GetPort() const;
//------------------------------------------------------------------
// Set the port if the socket address for the family has a port. The family
// must be set correctly prior to calling this function.
//------------------------------------------------------------------
bool SetPort(uint16_t port);
//------------------------------------------------------------------
// Set the socket address according to the first match from a call to
// getaddrinfo() (or equivalent functions for systems that don't have
// getaddrinfo(). If "addr_info_ptr" is not NULL, it will get filled in with
// the match that was used to populate this socket address.
//------------------------------------------------------------------
bool
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")
const char *service, // Protocol name ("tcp", "http", etc) or a
// raw port number string ("81")
int ai_family = PF_UNSPEC, int ai_socktype = 0,
int ai_protocol = 0, int ai_flags = 0);
//------------------------------------------------------------------
// Quick way to set the SocketAddress to localhost given the family. Returns
// true if successful, false if "family" doesn't support localhost or if
// "family" is not supported by this class.
//------------------------------------------------------------------
bool SetToLocalhost(sa_family_t family, uint16_t port);
bool SetToAnyAddress(sa_family_t family, uint16_t port);
//------------------------------------------------------------------
// Returns true if there is a valid socket address in this object.
//------------------------------------------------------------------
bool IsValid() const;
//------------------------------------------------------------------
// Returns true if the socket is INADDR_ANY
//------------------------------------------------------------------
bool IsAnyAddr() const;
//------------------------------------------------------------------
// Returns true if the socket is INADDR_LOOPBACK
//------------------------------------------------------------------
bool IsLocalhost() const;
//------------------------------------------------------------------
// Direct access to all of the sockaddr structures
//------------------------------------------------------------------
struct sockaddr &sockaddr() {
return m_socket_addr.sa;
}
const struct sockaddr &sockaddr() const { return m_socket_addr.sa; }
struct sockaddr_in &sockaddr_in() {
return m_socket_addr.sa_ipv4;
}
const struct sockaddr_in &sockaddr_in() const {
return m_socket_addr.sa_ipv4;
}
struct sockaddr_in6 &sockaddr_in6() {
return m_socket_addr.sa_ipv6;
}
const struct sockaddr_in6 &sockaddr_in6() const {
return m_socket_addr.sa_ipv6;
}
struct sockaddr_storage &sockaddr_storage() {
return m_socket_addr.sa_storage;
}
const struct sockaddr_storage &sockaddr_storage() const {
return m_socket_addr.sa_storage;
}
//------------------------------------------------------------------
// Conversion operators to allow getting the contents of this class as a
// pointer to the appropriate structure. This allows an instance of this
// class to be used in calls that take one of the sockaddr structure variants
// without having to manually use the correct accessor function.
//------------------------------------------------------------------
operator struct sockaddr *() { return &m_socket_addr.sa; }
operator const struct sockaddr *() const { return &m_socket_addr.sa; }
operator struct sockaddr_in *() { return &m_socket_addr.sa_ipv4; }
operator const struct sockaddr_in *() const { return &m_socket_addr.sa_ipv4; }
operator struct sockaddr_in6 *() { return &m_socket_addr.sa_ipv6; }
operator const struct sockaddr_in6 *() const {
return &m_socket_addr.sa_ipv6;
}
operator const struct sockaddr_storage *() const {
return &m_socket_addr.sa_storage;
}
operator struct sockaddr_storage *() { return &m_socket_addr.sa_storage; }
protected:
typedef union sockaddr_tag {
struct sockaddr sa;
struct sockaddr_in sa_ipv4;
struct sockaddr_in6 sa_ipv6;
struct sockaddr_storage sa_storage;
} sockaddr_t;
//------------------------------------------------------------------
// Classes that inherit from SocketAddress can see and modify these
//------------------------------------------------------------------
sockaddr_t m_socket_addr;
};
} // namespace lldb_private
#endif // liblldb_SocketAddress_h_