Skip to content

Commit

Permalink
[NFC] Adding a new wrapper for getaddrinfo
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Chris Bieneman committed Apr 12, 2017
1 parent efd065e commit a4f532e
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
16 changes: 16 additions & 0 deletions lldb/include/lldb/Host/SocketAddress.h
Expand Up @@ -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);
Expand All @@ -63,6 +71,9 @@ class SocketAddress {

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
//------------------------------------------------------------------
Expand Down Expand Up @@ -134,6 +145,11 @@ class SocketAddress {
//------------------------------------------------------------------
bool IsValid() const;

//------------------------------------------------------------------
// Returns true if the socket is INADDR_ANY
//------------------------------------------------------------------
bool IsAnyAddr() const;

//------------------------------------------------------------------
// Direct access to all of the sockaddr structures
//------------------------------------------------------------------
Expand Down
48 changes: 48 additions & 0 deletions lldb/source/Host/common/SocketAddress.cpp
Expand Up @@ -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
//----------------------------------------------------------------------
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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);
}

0 comments on commit a4f532e

Please sign in to comment.