Browse Source

correct implementation of GetMTUWindows for WindowsXP

pull/1441/head
orignal 5 years ago
parent
commit
c3e3c091cc
  1. 41
      libi2pd/util.cpp

41
libi2pd/util.cpp

@ -61,17 +61,22 @@ namespace net
{ {
#ifdef WIN32 #ifdef WIN32
bool IsWindowsXPorLater() bool IsWindowsXPorLater()
{ {
OSVERSIONINFO osvi; static bool isRequested = false;
static bool isXP = false;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); if (!isRequested)
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); {
GetVersionEx(&osvi); // request
OSVERSIONINFO osvi;
if (osvi.dwMajorVersion <= 5)
return true; ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
else osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
return false; GetVersionEx(&osvi);
isXP = osvi.dwMajorVersion <= 5;
isRequested = true;
}
return isXP;
} }
int GetMTUWindowsIpv4(sockaddr_in inputAddress, int fallback) int GetMTUWindowsIpv4(sockaddr_in inputAddress, int fallback)
@ -202,7 +207,7 @@ namespace net
std::string localAddressUniversal = localAddress.to_string(); std::string localAddressUniversal = localAddress.to_string();
#endif #endif
if (IsWindowsXPorLater()) bool isXP = IsWindowsXPorLater();
{ {
#define inet_pton inet_pton_xp #define inet_pton inet_pton_xp
} }
@ -210,13 +215,19 @@ namespace net
if(localAddress.is_v4()) if(localAddress.is_v4())
{ {
sockaddr_in inputAddress; sockaddr_in inputAddress;
inet_pton(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr)); if (isXP)
inet_pton_xp(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr));
else
inet_pton(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr));
return GetMTUWindowsIpv4(inputAddress, fallback); return GetMTUWindowsIpv4(inputAddress, fallback);
} }
else if(localAddress.is_v6()) else if(localAddress.is_v6())
{ {
sockaddr_in6 inputAddress; sockaddr_in6 inputAddress;
inet_pton(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr)); if (isXP)
inet_pton_xp(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr));
else
inet_pton(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr));
return GetMTUWindowsIpv6(inputAddress, fallback); return GetMTUWindowsIpv6(inputAddress, fallback);
} else { } else {
LogPrint(eLogError, "NetIface: GetMTU(): address family is not supported"); LogPrint(eLogError, "NetIface: GetMTU(): address family is not supported");

Loading…
Cancel
Save