Index: src/OFSystemInfo+NetworkInterfaces.h ================================================================== --- src/OFSystemInfo+NetworkInterfaces.h +++ src/OFSystemInfo+NetworkInterfaces.h @@ -39,10 +39,17 @@ * * This maps to an @ref OFNumber. */ extern OFNetworkInterfaceKey OFNetworkInterfaceIndex; +/** + * @brief The hardware address of a network interface. + * + * This maps to an @ref OFData. + */ +extern OFNetworkInterfaceKey OFNetworkInterfaceHardwareAddress; + /** * @brief The IPv4 addresses of a network interface. * * This maps to an @ref OFData of @ref OFSocketAddress. */ Index: src/OFSystemInfo+NetworkInterfaces.m ================================================================== --- src/OFSystemInfo+NetworkInterfaces.m +++ src/OFSystemInfo+NetworkInterfaces.m @@ -16,10 +16,12 @@ #include "config.h" #import "OFSystemInfo.h" OFNetworkInterfaceKey OFNetworkInterfaceIndex = @"OFNetworkInterfaceIndex"; +OFNetworkInterfaceKey OFNetworkInterfaceHardwareAddress = + @"OFNetworkInterfaceHardwareAddress"; OFNetworkInterfaceKey OFNetworkInterfaceIPv4Addresses = @"OFNetworkInterfaceIPv4Addresses"; #ifdef OF_HAVE_IPV6 OFNetworkInterfaceKey OFNetworkInterfaceIPv6Addresses = @"OFNetworkInterfaceIPv6Addresses"; Index: src/platform/Windows/OFSystemInfo+NetworkInterfaces.m ================================================================== --- src/platform/Windows/OFSystemInfo+NetworkInterfaces.m +++ src/platform/Windows/OFSystemInfo+NetworkInterfaces.m @@ -90,10 +90,19 @@ } index = [OFNumber numberWithUnsignedInt: iter->IfIndex]; [interface setObject: index forKey: OFNetworkInterfaceIndex]; + + if (iter->PhysicalAddressLength > 0) { + const OFNetworkInterfaceKey key = + OFNetworkInterfaceHardwareAddress; + OFData *address = [OFData + dataWithItems: iter->PhysicalAddress + count: iter->PhysicalAddressLength]; + [interface setObject: address forKey: key]; + } for (PIP_ADAPTER_UNICAST_ADDRESS_LH addrIter = iter->FirstUnicastAddress; addrIter != NULL; addrIter = addrIter->Next) { OFSocketAddress address; @@ -181,11 +190,11 @@ for (PIP_ADAPTER_INFO iter = adapterInfo; iter != NULL; iter = iter->Next) { OFMutableDictionary *interface; OFString *name, *IPString; OFNumber *index; - OFSocketAddress address; + OFSocketAddress IPv4Address; OFData *addresses; name = [OFString stringWithCString: iter->AdapterName encoding: encoding]; @@ -195,23 +204,32 @@ } index = [OFNumber numberWithUnsignedInt: iter->Index]; [interface setObject: index forKey: OFNetworkInterfaceIndex]; + + if (iter->AddressLength > 0) { + const OFNetworkInterfaceKey key = + OFNetworkInterfaceHardwareAddress; + OFData *address = [OFData + dataWithItems: iter->Address + count: iter->AddressLength]; + [interface setObject: address forKey: key]; + } IPString = [OFString stringWithCString: iter->IpAddressList.IpAddress .String encoding: encoding]; if ([IPString isEqual: @"0.0.0.0"]) continue; - address = OFSocketAddressParseIPv4(IPString, 0); - addresses = [OFData dataWithItems: &address + IPv4Address = OFSocketAddressParseIPv4(IPString, 0); + addresses = [OFData dataWithItems: &IPv4Address count: 1 - itemSize: sizeof(address)]; + itemSize: sizeof(IPv4Address)]; [interface setObject: addresses forKey: OFNetworkInterfaceIPv4Addresses]; } } @finally { free(adapterInfo); Index: tests/OFSystemInfoTests.m ================================================================== --- tests/OFSystemInfoTests.m +++ tests/OFSystemInfoTests.m @@ -134,10 +134,11 @@ networkInterfaces = [OFSystemInfo networkInterfaces]; [OFStdOut writeString: @"[OFSystemInfo] Network interfaces: "]; for (OFString *name in networkInterfaces) { bool firstAddress = true; OFNetworkInterface interface; + OFData *hardwareAddress; if (!firstInterface) [OFStdOut writeString: @"; "]; firstInterface = false; @@ -158,14 +159,31 @@ # endif # ifdef OF_HAVE_APPLETALK printAddresses([interface objectForKey: OFNetworkInterfaceAppleTalkAddresses], &firstAddress); # endif + + hardwareAddress = [interface + objectForKey: OFNetworkInterfaceHardwareAddress]; + if (hardwareAddress != nil) { + const unsigned char *bytes = hardwareAddress.items; + size_t length = hardwareAddress.count; + + if (!firstAddress) + [OFStdOut writeString: @", "]; + + for (size_t i = 0; i < length; i++) { + if (i > 0) + [OFStdOut writeString: @":"]; + + [OFStdOut writeFormat: @"%02X", bytes[i]]; + } + } [OFStdOut writeString: @")"]; } [OFStdOut writeString: @"\n"]; #endif objc_autoreleasePoolPop(pool); } @end