mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-05 21:04:14 -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_to_ipv6(sockaddr_storage &addr);
|
||||
bool sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr);
|
||||
|
||||
// comparisons.
|
||||
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)
|
||||
{
|
||||
#ifdef SS_DEBUG
|
||||
std::cerr << "sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)" << std::endl;
|
||||
#endif
|
||||
|
||||
if ( addr.ss_family == AF_INET6 ) return true;
|
||||
|
||||
|
@ -304,6 +306,41 @@ bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)
|
|||
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 **********************************/
|
||||
|
||||
bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue