Index: src/OFSystemInfo.m ================================================================== --- src/OFSystemInfo.m +++ src/OFSystemInfo.m @@ -95,10 +95,13 @@ # include # endif #endif #ifdef OF_WINDOWS # include +# define interface struct +# include +# undef interface #endif #ifdef OF_HAIKU # include #endif #ifdef OF_QNX @@ -939,12 +942,11 @@ if (ifrs[i].ifr_addr.sa_family != family) continue; name = [OFString stringWithCString: ifrs[i].ifr_name encoding: encoding]; - interface = [ret objectForKey: name]; - if (interface == nil) { + if ((interface = [ret objectForKey: name]) == nil) { interface = [OFMutableDictionary dictionary]; [ret setObject: interface forKey: name]; } addresses = [interface objectForKey: key]; @@ -1005,12 +1007,11 @@ name = [components objectAtIndex: 5]; if (addressString.length != 32) continue; - interface = [ret objectForKey: name]; - if (interface == nil) { + if ((interface = [ret objectForKey: name]) == nil) { interface = [OFMutableDictionary dictionary]; [ret setObject: interface forKey: name]; } memset(&address, 0, sizeof(address)); @@ -1032,13 +1033,12 @@ address.sockaddr.in6.sin6_addr.s6_addr[i / 2] = (unsigned char)byte; } - addresses = [interface - objectForKey: OFNetworkInterfaceIPv6Addresses]; - if (addresses == nil) { + if ((addresses = [interface + objectForKey: OFNetworkInterfaceIPv6Addresses]) == nil) { addresses = [OFMutableData dataWithItemSize: sizeof(OFSocketAddress)]; [interface setObject: addresses forKey: OFNetworkInterfaceIPv6Addresses]; } @@ -1066,11 +1066,82 @@ # endif static bool queryNetworkInterfaceIPv4Addresses(OFMutableDictionary *ret) { -# if defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) +# if defined(OF_WINDOWS) + OFStringEncoding encoding = [OFLocale encoding]; + ULONG adapterInfoSize = sizeof(IP_ADAPTER_INFO); + PIP_ADAPTER_INFO adapterInfo = malloc(adapterInfoSize); + OFMutableDictionary *interface; + OFEnumerator *enumerator; + + if (adapterInfo == NULL) + return false; + + @try { + ULONG error = GetAdaptersInfo(adapterInfo, &adapterInfoSize); + + if (error == ERROR_BUFFER_OVERFLOW) { + PIP_ADAPTER_INFO newAdapterInfo = realloc( + adapterInfo, adapterInfoSize); + + if (newAdapterInfo == NULL) + return false; + + adapterInfo = newAdapterInfo; + error = GetAdaptersInfo(adapterInfo, &adapterInfoSize); + } + + if (error != ERROR_SUCCESS) + return false; + + for (PIP_ADAPTER_INFO iter = adapterInfo; iter != NULL; + iter = iter->Next) { + OFString *name, *IPString; + OFMutableData *addresses; + OFSocketAddress address; + + name = [OFString stringWithCString: iter->AdapterName + encoding: encoding]; + + if ((interface = [ret objectForKey: name]) == nil) { + interface = [OFMutableDictionary dictionary]; + [ret setObject: interface forKey: name]; + } + + IPString = [OFString + stringWithCString: iter->IpAddressList.IpAddress + .String + encoding: encoding]; + + if ([IPString isEqual: @"0.0.0.0"]) + continue; + + if ((addresses = [interface objectForKey: + OFNetworkInterfaceIPv4Addresses]) == nil) { + addresses = [OFMutableData + dataWithItemSize: sizeof(OFSocketAddress)]; + [interface + setObject: addresses + forKey: OFNetworkInterfaceIPv4Addresses]; + } + + address = OFSocketAddressParseIPv4(IPString, 0); + [addresses addItem: &address]; + } + } @finally { + free(adapterInfo); + } + + enumerator = [ret objectEnumerator]; + while ((interface = [enumerator nextObject]) != nil) + [[interface objectForKey: OFNetworkInterfaceIPv4Addresses] + makeImmutable]; + + return true; +# elif defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) return queryNetworkInterfaceAddresses(ret, OFNetworkInterfaceIPv4Addresses, OFSocketAddressFamilyIPv4, AF_INET, sizeof(struct sockaddr_in)); # else return false;