mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-02 15:32:52 +00:00
fixed RetrieveNetmask for windows (#3338)
* fixed RetrieveNetmask for windows * clang..
This commit is contained in:
parent
e3fe6e2809
commit
df85efde7c
@ -262,33 +262,43 @@ bool NetUtilInternal::RetrieveNetmask() {
|
||||
auto success = false;
|
||||
|
||||
#ifdef _WIN32
|
||||
std::vector<u8> adapter_addresses(sizeof(IP_ADAPTER_ADDRESSES));
|
||||
ULONG size_infos = sizeof(IP_ADAPTER_ADDRESSES);
|
||||
ULONG flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER;
|
||||
ULONG family = AF_INET; // Only IPv4
|
||||
ULONG buffer_size = 15000;
|
||||
|
||||
if (GetAdaptersAddresses(AF_INET, 0, NULL,
|
||||
reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_addresses.data()),
|
||||
&size_infos) == ERROR_BUFFER_OVERFLOW)
|
||||
adapter_addresses.resize(size_infos);
|
||||
std::vector<BYTE> buffer(buffer_size);
|
||||
auto adapter_addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());
|
||||
|
||||
if (GetAdaptersAddresses(AF_INET, 0, NULL,
|
||||
reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_addresses.data()),
|
||||
&size_infos) == NO_ERROR &&
|
||||
size_infos) {
|
||||
PIP_ADAPTER_ADDRESSES adapter;
|
||||
for (adapter = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_addresses.data()); adapter;
|
||||
adapter = adapter->Next) {
|
||||
PIP_ADAPTER_UNICAST_ADDRESS unicast = adapter->FirstUnicastAddress;
|
||||
if (unicast) {
|
||||
DWORD result = GetAdaptersAddresses(family, flags, nullptr, adapter_addresses, &buffer_size);
|
||||
if (result == ERROR_BUFFER_OVERFLOW) {
|
||||
buffer.resize(buffer_size);
|
||||
adapter_addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());
|
||||
result = GetAdaptersAddresses(family, flags, nullptr, adapter_addresses, &buffer_size);
|
||||
}
|
||||
|
||||
if (result != NO_ERROR)
|
||||
return false;
|
||||
|
||||
for (auto adapter = adapter_addresses; adapter != nullptr; adapter = adapter->Next) {
|
||||
// Skip loopback and down interfaces
|
||||
if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK || adapter->OperStatus != IfOperStatusUp)
|
||||
continue;
|
||||
|
||||
for (auto unicast = adapter->FirstUnicastAddress; unicast != nullptr;
|
||||
unicast = unicast->Next) {
|
||||
if (unicast->Address.lpSockaddr->sa_family == AF_INET) {
|
||||
ULONG prefix_length = unicast->OnLinkPrefixLength;
|
||||
ULONG mask = prefix_length == 0 ? 0 : 0xFFFFFFFF << (32 - prefix_length);
|
||||
in_addr addr{};
|
||||
addr.S_un.S_addr = htonl(mask);
|
||||
inet_ntop(AF_INET, &addr, netmaskStr, INET_ADDRSTRLEN);
|
||||
success = true;
|
||||
|
||||
in_addr mask_addr{};
|
||||
mask_addr.S_un.S_addr = htonl(mask);
|
||||
|
||||
if (inet_ntop(AF_INET, &mask_addr, netmaskStr, INET_ADDRSTRLEN)) {
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
ifaddrs* ifap;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user