|
|
|
@ -14,42 +14,6 @@
|
|
|
|
|
#define inet_aton(x, y) inet_pton(AF_INET, x, y)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
llarp::Addr::operator const sockaddr*() const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET)
|
|
|
|
|
return (const sockaddr*)&_addr4;
|
|
|
|
|
else
|
|
|
|
|
return (const sockaddr*)&_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp::Addr::operator sockaddr*() const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET)
|
|
|
|
|
return (sockaddr*)&_addr4;
|
|
|
|
|
else
|
|
|
|
|
return (sockaddr*)&_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp::Addr::operator<(const Addr& other) const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET && other.af() == AF_INET)
|
|
|
|
|
return port() < other.port() || addr4()->s_addr < other.addr4()->s_addr;
|
|
|
|
|
else
|
|
|
|
|
return port() < other.port() || *addr6() < *other.addr6()
|
|
|
|
|
|| af() < other.af();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp::Addr::operator==(const Addr& other) const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET && other.af() == AF_INET)
|
|
|
|
|
return port() == other.port() && addr4()->s_addr == other.addr4()->s_addr;
|
|
|
|
|
else
|
|
|
|
|
return af() == other.af() && memcmp(addr6(), other.addr6(), 16) == 0
|
|
|
|
|
&& port() == other.port();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
|
{
|
|
|
|
|
Addr::Addr()
|
|
|
|
@ -112,9 +76,8 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
Addr::Addr(string_view addr_str, string_view port_str)
|
|
|
|
|
{
|
|
|
|
|
this->from_char_array(llarp::string_view_string(addr_str).c_str());
|
|
|
|
|
this->port(
|
|
|
|
|
std::strtoul(llarp::string_view_string(port_str).c_str(), nullptr, 10));
|
|
|
|
|
this->from_char_array(string_view_string(addr_str).c_str());
|
|
|
|
|
this->port(std::strtoul(string_view_string(port_str).c_str(), nullptr, 10));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -129,16 +92,16 @@ namespace llarp
|
|
|
|
|
char buf[6];
|
|
|
|
|
snprintf(buf, 6, "%s", pPosition + 1);
|
|
|
|
|
uint16_t port = std::atoi(buf);
|
|
|
|
|
llarp::LogDebug("Setting port ", std::to_string(port));
|
|
|
|
|
LogDebug("Setting port ", std::to_string(port));
|
|
|
|
|
this->port(port);
|
|
|
|
|
// trim str
|
|
|
|
|
// can't VLA
|
|
|
|
|
str = strdup(in); // copy it
|
|
|
|
|
str[pPosition - in] = '\0'; // nul terminate it early
|
|
|
|
|
llarp::LogDebug("Truncating to ", str);
|
|
|
|
|
LogDebug("Truncating to ", str);
|
|
|
|
|
freeStr = true;
|
|
|
|
|
}
|
|
|
|
|
llarp::Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
struct addrinfo hint, *res = NULL;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
@ -150,7 +113,7 @@ namespace llarp
|
|
|
|
|
ret = getaddrinfo(str, NULL, &hint, &res);
|
|
|
|
|
if(ret)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("failed to determine address family: ", str);
|
|
|
|
|
LogError("failed to determine address family: ", str);
|
|
|
|
|
if(freeStr)
|
|
|
|
|
free(str);
|
|
|
|
|
return false;
|
|
|
|
@ -158,14 +121,14 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
if(res->ai_family == AF_INET6)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("IPv6 address not supported yet", str);
|
|
|
|
|
LogError("IPv6 address not supported yet", str);
|
|
|
|
|
if(freeStr)
|
|
|
|
|
free(str);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else if(res->ai_family != AF_INET)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("Address family not supported yet", str);
|
|
|
|
|
LogError("Address family not supported yet", str);
|
|
|
|
|
if(freeStr)
|
|
|
|
|
free(str);
|
|
|
|
|
return false;
|
|
|
|
@ -175,7 +138,7 @@ namespace llarp
|
|
|
|
|
struct in_addr* addr = &_addr4.sin_addr;
|
|
|
|
|
if(inet_aton(str, addr) == 0)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("failed to parse ", str);
|
|
|
|
|
LogError("failed to parse ", str);
|
|
|
|
|
if(freeStr)
|
|
|
|
|
free(str);
|
|
|
|
|
return false;
|
|
|
|
@ -208,7 +171,7 @@ namespace llarp
|
|
|
|
|
Addr::from_4int(const uint8_t one, const uint8_t two, const uint8_t three,
|
|
|
|
|
const uint8_t four)
|
|
|
|
|
{
|
|
|
|
|
llarp::Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
struct in_addr* addr = &_addr4.sin_addr;
|
|
|
|
|
unsigned char* ip = (unsigned char*)&(addr->s_addr);
|
|
|
|
|
|
|
|
|
@ -264,7 +227,7 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
Addr::Addr(const sockaddr_in& other)
|
|
|
|
|
{
|
|
|
|
|
llarp::Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
_addr.sin6_family = AF_INET;
|
|
|
|
|
uint8_t* addrptr = _addr.sin6_addr.s6_addr;
|
|
|
|
|
uint16_t* port = &_addr.sin6_port;
|
|
|
|
@ -300,7 +263,7 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
Addr::Addr(const sockaddr& other)
|
|
|
|
|
{
|
|
|
|
|
llarp::Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
_addr.sin6_family = other.sa_family;
|
|
|
|
|
uint8_t* addrptr = _addr.sin6_addr.s6_addr;
|
|
|
|
|
uint16_t* port = &_addr.sin6_port;
|
|
|
|
@ -406,10 +369,46 @@ namespace llarp
|
|
|
|
|
return ntohs(_addr.sin6_port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Addr::operator const sockaddr*() const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET)
|
|
|
|
|
return (const sockaddr*)&_addr4;
|
|
|
|
|
else
|
|
|
|
|
return (const sockaddr*)&_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Addr::operator sockaddr*() const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET)
|
|
|
|
|
return (sockaddr*)&_addr4;
|
|
|
|
|
else
|
|
|
|
|
return (sockaddr*)&_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
Addr::operator<(const Addr& other) const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET && other.af() == AF_INET)
|
|
|
|
|
return port() < other.port() || addr4()->s_addr < other.addr4()->s_addr;
|
|
|
|
|
else
|
|
|
|
|
return port() < other.port() || *addr6() < *other.addr6()
|
|
|
|
|
|| af() < other.af();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
Addr::operator==(const Addr& other) const
|
|
|
|
|
{
|
|
|
|
|
if(af() == AF_INET && other.af() == AF_INET)
|
|
|
|
|
return port() == other.port() && addr4()->s_addr == other.addr4()->s_addr;
|
|
|
|
|
else
|
|
|
|
|
return af() == other.af() && memcmp(addr6(), other.addr6(), 16) == 0
|
|
|
|
|
&& port() == other.port();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Addr&
|
|
|
|
|
Addr::operator=(const sockaddr& other)
|
|
|
|
|
{
|
|
|
|
|
llarp::Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
Zero(&_addr, sizeof(sockaddr_in6));
|
|
|
|
|
_addr.sin6_family = other.sa_family;
|
|
|
|
|
uint8_t* addrptr = _addr.sin6_addr.s6_addr;
|
|
|
|
|
uint16_t* port = &_addr.sin6_port;
|
|
|
|
|