mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-07 05:42:19 -04:00
0005 conversions from IPv4/IPv6 (Patch from G10H4ck)
git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6@8029 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
f63c705263
commit
e52d6a07b7
2 changed files with 38 additions and 0 deletions
|
@ -96,6 +96,7 @@ bool sockaddr_storage_inet_pton(struct sockaddr_storage &addr, const char * ip_s
|
||||||
bool sockaddr_storage_ipv4_setport(struct sockaddr_storage &addr, const uint16_t port);
|
bool sockaddr_storage_ipv4_setport(struct sockaddr_storage &addr, const uint16_t port);
|
||||||
|
|
||||||
bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr);
|
bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr);
|
||||||
|
bool sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr);
|
||||||
|
|
||||||
// comparisons.
|
// comparisons.
|
||||||
bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b);
|
bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b);
|
||||||
|
|
|
@ -280,7 +280,9 @@ bool sockaddr_storage_inet_pton(struct sockaddr_storage &addr, const char * ip_s
|
||||||
|
|
||||||
bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)
|
bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)
|
||||||
{
|
{
|
||||||
|
#ifdef SS_DEBUG
|
||||||
std::cerr << "sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)" << std::endl;
|
std::cerr << "sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( addr.ss_family == AF_INET6 ) return true;
|
if ( addr.ss_family == AF_INET6 ) return true;
|
||||||
|
|
||||||
|
@ -304,6 +306,41 @@ bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr)
|
||||||
|
{
|
||||||
|
//#ifdef SS_DEBUG
|
||||||
|
std::cerr << "sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr)" << std::endl;
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
if ( addr.ss_family == AF_INET ) return true;
|
||||||
|
|
||||||
|
if ( addr.ss_family == AF_INET6 )
|
||||||
|
{
|
||||||
|
sockaddr_in6 & addr_ipv6 = (sockaddr_in6 &) addr;
|
||||||
|
bool ipv4m = addr_ipv6.sin6_addr.s6_addr16[5] == (u_int16_t) 0xffff;
|
||||||
|
for ( int i = 0; ipv4m && i < 5 ; ++i )
|
||||||
|
ipv4m &= addr_ipv6.sin6_addr.s6_addr16[i] == (u_int16_t) 0x0000;
|
||||||
|
|
||||||
|
if(ipv4m)
|
||||||
|
{
|
||||||
|
u_int32_t ip = addr_ipv6.sin6_addr.s6_addr32[3];
|
||||||
|
u_int16_t port = addr_ipv6.sin6_port;
|
||||||
|
|
||||||
|
sockaddr_in & addr_ipv4 = (sockaddr_in &) addr;
|
||||||
|
|
||||||
|
sockaddr_storage_clear(addr);
|
||||||
|
addr_ipv4.sin_family = AF_INET;
|
||||||
|
addr_ipv4.sin_port = port;
|
||||||
|
addr_ipv4.sin_addr.s_addr = ip;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************** Comparisions **********************************/
|
/******************************** Comparisions **********************************/
|
||||||
|
|
||||||
bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b)
|
bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue