[NFC] Adding a new wrapper for getaddrinfo

Summary: This patch adds a new wrapper for getaddrinfo which returns a std::vector of SocketAddresses. While this patch doesn't add any uses of the new function, I have two separable patches that are dependent on this, so I put it in its own patch.

Reviewers: zturner

Reviewed By: zturner

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D31822

llvm-svn: 300112
This commit is contained in:
Chris Bieneman 2017-04-12 21:56:33 +00:00
parent efd065e6a0
commit a4f532e0ac
2 changed files with 64 additions and 0 deletions

View File

@ -32,15 +32,23 @@ typedef ADDRESS_FAMILY sa_family_t;
// 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);
//------------------------------------------------------------------
// 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);
@ -63,6 +71,9 @@ public:
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
//------------------------------------------------------------------
@ -134,6 +145,11 @@ public:
//------------------------------------------------------------------
bool IsValid() const;
//------------------------------------------------------------------
// Returns true if the socket is INADDR_ANY
//------------------------------------------------------------------
bool IsAnyAddr() const;
//------------------------------------------------------------------
// Direct access to all of the sockaddr structures
//------------------------------------------------------------------

View File

@ -89,6 +89,10 @@ SocketAddress::SocketAddress(const struct sockaddr_storage &s) {
m_socket_addr.sa_storage = s;
}
SocketAddress::SocketAddress(const struct addrinfo *addr_info) {
*this = addr_info;
}
//----------------------------------------------------------------------
// SocketAddress copy constructor
//----------------------------------------------------------------------
@ -244,6 +248,24 @@ bool SocketAddress::getaddrinfo(const char *host, const char *service,
return result;
}
std::vector<SocketAddress> SocketAddress::GetAddressInfo(const char *hostname,
const char *servname) {
std::vector<SocketAddress> addr_list;
struct addrinfo *service_info_list = NULL;
int err = ::getaddrinfo(hostname, servname, NULL, &service_info_list);
if (err == 0 && service_info_list) {
for (struct addrinfo *service_ptr = service_info_list; service_ptr != NULL;
service_ptr = service_ptr->ai_next) {
addr_list.emplace_back(SocketAddress(service_ptr));
}
}
if (service_info_list)
::freeaddrinfo(service_info_list);
return addr_list;
}
bool SocketAddress::SetToLocalhost(sa_family_t family, uint16_t port) {
switch (family) {
case AF_INET:
@ -287,3 +309,29 @@ bool SocketAddress::SetToAnyAddress(sa_family_t family, uint16_t port) {
Clear();
return false;
}
bool SocketAddress::IsAnyAddr() const {
return (GetFamily() == AF_INET)
? m_socket_addr.sa_ipv4.sin_addr.s_addr == htonl(INADDR_ANY)
: 0 == memcmp(&m_socket_addr.sa_ipv6.sin6_addr, &in6addr_any, 16);
}
bool SocketAddress::operator==(const SocketAddress &rhs) const {
if (GetFamily() != rhs.GetFamily())
return false;
if (GetLength() != rhs.GetLength())
return false;
switch (GetFamily()) {
case AF_INET:
return m_socket_addr.sa_ipv4.sin_addr.s_addr ==
rhs.m_socket_addr.sa_ipv4.sin_addr.s_addr;
case AF_INET6:
return 0 == memcmp(&m_socket_addr.sa_ipv6.sin6_addr,
&rhs.m_socket_addr.sa_ipv6.sin6_addr, 16);
}
return false;
}
bool SocketAddress::operator!=(const SocketAddress &rhs) const {
return !(*this == rhs);
}