mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-20 20:34:25 -04:00
added rs_inet_ntop crossplatform version of inet_ntop
This commit is contained in:
parent
ca1a9707ef
commit
9826c72969
2 changed files with 52 additions and 20 deletions
|
@ -126,6 +126,6 @@ bool sockaddr_storage_isLoopbackNet(const struct sockaddr_storage &addr);
|
||||||
bool sockaddr_storage_isPrivateNet(const struct sockaddr_storage &addr);
|
bool sockaddr_storage_isPrivateNet(const struct sockaddr_storage &addr);
|
||||||
bool sockaddr_storage_isExternalNet(const struct sockaddr_storage &addr);
|
bool sockaddr_storage_isExternalNet(const struct sockaddr_storage &addr);
|
||||||
|
|
||||||
|
bool rs_inet_ntop(const sockaddr_storage &addr, std::string &dst);
|
||||||
|
|
||||||
#endif /* RS_UNIVERSAL_NETWORK_HEADER */
|
#endif /* RS_UNIVERSAL_NETWORK_HEADER */
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
#include "util/rsnet.h"
|
#include "util/rsnet.h"
|
||||||
#include "util/rsstring.h"
|
#include "util/rsstring.h"
|
||||||
|
@ -87,7 +88,7 @@ bool sockaddr_storage_ipv6_isExternalNet(const struct sockaddr_storage &addr);
|
||||||
/******************************** Socket Fns ***********************************/
|
/******************************** Socket Fns ***********************************/
|
||||||
// Standard bind, on OSX anyway will not accept a longer socklen for IPv4.
|
// Standard bind, on OSX anyway will not accept a longer socklen for IPv4.
|
||||||
// so hidding details behind function.
|
// so hidding details behind function.
|
||||||
int universal_bind(int fd, const struct sockaddr *addr, socklen_t socklen)
|
int universal_bind(int fd, const struct sockaddr *addr, socklen_t socklen)
|
||||||
{
|
{
|
||||||
#ifdef SS_DEBUG
|
#ifdef SS_DEBUG
|
||||||
std::cerr << "universal_bind()";
|
std::cerr << "universal_bind()";
|
||||||
|
@ -109,11 +110,8 @@ int universal_bind(int fd, const struct sockaddr *addr, socklen_t socklen)
|
||||||
|
|
||||||
if (len > socklen)
|
if (len > socklen)
|
||||||
{
|
{
|
||||||
std::cerr << "universal_bind() ERROR len > socklen";
|
std::cerr << "universal_bind() ERROR len > socklen" << std::endl;
|
||||||
std::cerr << std::endl;
|
|
||||||
|
|
||||||
len = socklen;
|
len = socklen;
|
||||||
//return EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return bind(fd, addr, len);
|
return bind(fd, addr, len);
|
||||||
|
@ -404,9 +402,9 @@ void sockaddr_storage_dump(const sockaddr_storage & addr, std::string * outputSt
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
char addrStr[INET6_ADDRSTRLEN+1];
|
const sockaddr_in6 * in6 = (const sockaddr_in6 *) & addr;
|
||||||
struct sockaddr_in6 * in6 = (struct sockaddr_in6 *) & addr;
|
std::string addrStr = "INVALID_IPV6";
|
||||||
inet_ntop(addr.ss_family, &(in6->sin6_addr), addrStr, INET6_ADDRSTRLEN);
|
rs_inet_ntop(addr, addrStr);
|
||||||
output << "addr.ss_family = AF_INET6";
|
output << "addr.ss_family = AF_INET6";
|
||||||
output << " in6->sin6_addr = ";
|
output << " in6->sin6_addr = ";
|
||||||
output << addrStr;
|
output << addrStr;
|
||||||
|
@ -418,12 +416,10 @@ void sockaddr_storage_dump(const sockaddr_storage & addr, std::string * outputSt
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
output << "unknown addr.ss_family = ";
|
output << "unknown addr.ss_family ";
|
||||||
output << addr.ss_family;
|
const uint8_t * buf = reinterpret_cast<const uint8_t *>(&addr);
|
||||||
output << " addr.__ss_align = ";
|
for( uint32_t i = 0; i < sizeof(addr); ++i )
|
||||||
output << addr.__ss_align;
|
output << std::setw(2) << std::setfill('0') << std::hex << +buf[i];
|
||||||
output << " addr.__ss_padding = ";
|
|
||||||
output << addr.__ss_padding;
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
if(outputString)
|
if(outputString)
|
||||||
|
@ -867,11 +863,9 @@ std::string sockaddr_storage_ipv4_iptostring(const struct sockaddr_storage &addr
|
||||||
|
|
||||||
std::string sockaddr_storage_ipv6_iptostring(const struct sockaddr_storage & addr)
|
std::string sockaddr_storage_ipv6_iptostring(const struct sockaddr_storage & addr)
|
||||||
{
|
{
|
||||||
char addrStr[INET6_ADDRSTRLEN+1];
|
std::string addrStr;
|
||||||
struct sockaddr_in6 * addrv6p = (struct sockaddr_in6 *) &addr;
|
rs_inet_ntop(addr, addrStr);
|
||||||
inet_ntop(addr.ss_family, &(addrv6p->sin6_addr), addrStr, INET6_ADDRSTRLEN);
|
return addrStr;
|
||||||
std::string output(addrStr);
|
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1009,5 +1003,43 @@ bool sockaddr_storage_ipv6_isExternalNet(const struct sockaddr_storage &addr)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WINDOWS_SYS
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <Winsock2.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool rs_inet_ntop (const sockaddr_storage &addr, std::string &dst)
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
char ipStr[255];
|
||||||
|
|
||||||
|
#ifdef WINDOWS_SYS
|
||||||
|
// Use WSAAddressToString instead of InetNtop because the latter is missing
|
||||||
|
// on XP and is present only on Vista and newers
|
||||||
|
wchar_t wIpStr[255];
|
||||||
|
long unsigned int len = 255;
|
||||||
|
sockaddr_storage tmp;
|
||||||
|
sockaddr_storage_clear(tmp);
|
||||||
|
sockaddr_storage_copyip(tmp, addr);
|
||||||
|
sockaddr * sptr = (sockaddr *) &tmp;
|
||||||
|
success = (0 == WSAAddressToString( sptr, sizeof(sockaddr_storage), NULL, wIpStr, &len ));
|
||||||
|
wcstombs(ipStr, wIpStr, len);
|
||||||
|
#else // WINDOWS_SYS
|
||||||
|
switch(addr.ss_family)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
{
|
||||||
|
const struct sockaddr_in * addrv4p = (const struct sockaddr_in *) &addr;
|
||||||
|
success = inet_ntop( addr.ss_family, (const void *) &(addrv4p->sin_addr), ipStr, INET_ADDRSTRLEN );
|
||||||
|
}
|
||||||
|
case AF_INET6:
|
||||||
|
{
|
||||||
|
const struct sockaddr_in6 * addrv6p = (const struct sockaddr_in6 *) &addr;
|
||||||
|
success = inet_ntop( addr.ss_family, (const void *) &(addrv6p->sin6_addr), ipStr, INET6_ADDRSTRLEN );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // WINDOWS_SYS
|
||||||
|
|
||||||
|
dst = ipStr;
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue