Index: src/OFSystemInfo.h ================================================================== --- src/OFSystemInfo.h +++ src/OFSystemInfo.h @@ -44,23 +44,34 @@ * * This maps to an @ref OFNumber. */ extern OFNetworkInterfaceKey OFNetworkInterfaceIndex; +# ifdef OF_HAVE_IPV6 /** * @brief The IPv6 addresses of a network interface. * * This maps to an @ref OFData of @ref OFSocketAddress. */ extern OFNetworkInterfaceKey OFNetworkInterfaceIPv6Addresses; +# endif /** * @brief The IPv4 addresses of a network interface. * * This maps to an @ref OFData of @ref OFSocketAddress. */ extern OFNetworkInterfaceKey OFNetworkInterfaceIPv4Addresses; + +# ifdef OF_HAVE_APPLETALK +/** + * @brief The AppleTalk addresses of a network interface. + * + * This maps to an @ref OFData of @ref OFSocketAddress. + */ +extern OFNetworkInterfaceKey OFNetworkInterfaceAppleTalkAddresses; +# endif #endif /** * @class OFSystemInfo OFSystemInfo.h ObjFW/OFSystemInfo.h * Index: src/OFSystemInfo.m ================================================================== --- src/OFSystemInfo.m +++ src/OFSystemInfo.m @@ -135,14 +135,20 @@ NSSearchPathEnumerationState, char *); #endif #ifdef OF_HAVE_SOCKETS OFNetworkInterfaceKey OFNetworkInterfaceIndex = @"OFNetworkInterfaceIndex"; +# ifdef OF_HAVE_IPV6 OFNetworkInterfaceKey OFNetworkInterfaceIPv6Addresses = @"OFNetworkInterfaceIPv6Addresses"; +# endif OFNetworkInterfaceKey OFNetworkInterfaceIPv4Addresses = @"OFNetworkInterfaceIPv4Addresses"; +# ifdef OF_HAVE_APPLETALK +OFNetworkInterfaceKey OFNetworkInterfaceAppleTalkAddresses = + @"OFNetworkInterfaceAppleTalkAddresses"; +# endif #endif #if defined(OF_AMD64) || defined(OF_X86) struct X86Regs { uint32_t eax, ebx, ecx, edx; @@ -966,14 +972,15 @@ return true; } # endif +# ifdef OF_HAVE_IPV6 static bool queryNetworkInterfaceIPv6Addresses(OFMutableDictionary *ret) { -# if defined(OF_LINUX) && defined(OF_HAVE_FILES) +# if defined(OF_LINUX) && defined(OF_HAVE_FILES) OFFile *file; OFString *line; OFMutableDictionary *interface; OFEnumerator *enumerator; @@ -1046,18 +1053,19 @@ while ((interface = [enumerator nextObject]) != nil) [[interface objectForKey: OFNetworkInterfaceIPv4Addresses] makeImmutable]; return false; -# elif defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) +# elif defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) return queryNetworkInterfaceAddresses(ret, OFNetworkInterfaceIPv6Addresses, OFSocketAddressFamilyIPv6, AF_INET6, sizeof(struct sockaddr_in6)); -# else +# else return false; -# endif +# endif } +# endif static bool queryNetworkInterfaceIPv4Addresses(OFMutableDictionary *ret) { # if defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) @@ -1066,10 +1074,25 @@ AF_INET, sizeof(struct sockaddr_in)); # else return false; # endif } + +# ifdef OF_HAVE_APPLETALK +static bool +queryNetworkInterfaceAppleTalkAddresses(OFMutableDictionary *ret) +{ +# if defined(HAVE_IOCTL) && defined(HAVE_NET_IF_H) + return queryNetworkInterfaceAddresses(ret, + OFNetworkInterfaceAppleTalkAddresses, + OFSocketAddressFamilyAppleTalk, AF_APPLETALK, + sizeof(struct sockaddr_at)); +# else + return false; +# endif +} +# endif + (OFDictionary OF_GENERIC(OFString *, OFNetworkInterface) *)networkInterfaces { void *pool = objc_autoreleasePoolPush(); OFMutableDictionary *ret = [OFMutableDictionary dictionary]; @@ -1076,12 +1099,17 @@ bool success = false; OFEnumerator *enumerator; OFMutableDictionary *interface; success |= queryNetworkInterfaceIndices(ret); +# ifdef OF_HAVE_IPV6 success |= queryNetworkInterfaceIPv6Addresses(ret); +# endif success |= queryNetworkInterfaceIPv4Addresses(ret); +# ifdef OF_HAVE_APPLETALK + success |= queryNetworkInterfaceAppleTalkAddresses(ret); +# endif if (!success) { objc_autoreleasePoolPop(pool); return nil; } Index: tests/OFSystemInfoTests.m ================================================================== --- tests/OFSystemInfoTests.m +++ tests/OFSystemInfoTests.m @@ -14,10 +14,29 @@ */ #include "config.h" #import "TestsAppDelegate.h" + +#ifdef OF_HAVE_SOCKETS +static void +printAddresses(OFData *addresses, bool *firstAddress) +{ + size_t count = addresses.count; + + for (size_t i = 0; i < count; i++) { + const OFSocketAddress *address = [addresses itemAtIndex: i]; + + if (!*firstAddress) + [OFStdOut writeString: @", "]; + + *firstAddress = false; + + [OFStdOut writeString: OFSocketAddressString(address)]; + } +} +#endif @implementation TestsAppDelegate (OFSystemInfoTests) - (void)systemInfoTests { void *pool = objc_autoreleasePoolPush(); @@ -113,49 +132,36 @@ #ifdef OF_HAVE_SOCKETS networkInterfaces = [OFSystemInfo networkInterfaces]; [OFStdOut writeString: @"[OFSystemInfo] Network interfaces: "]; for (OFString *name in networkInterfaces) { + bool firstAddress = true; OFNetworkInterface interface; - OFData *IPv6Addresses, *IPv4Addresses; if (!firstInterface) [OFStdOut writeString: @"; "]; firstInterface = false; [OFStdOut writeFormat: @"%@(", name]; interface = [networkInterfaces objectForKey: name]; - IPv6Addresses = [interface - objectForKey: OFNetworkInterfaceIPv6Addresses]; - IPv4Addresses = [interface - objectForKey: OFNetworkInterfaceIPv4Addresses]; - - for (size_t i = 0; i < IPv6Addresses.count; i++) { - const OFSocketAddress *address = - [IPv6Addresses itemAtIndex: i]; - - if (i > 0) - [OFStdOut writeString: @", "]; - - [OFStdOut writeString: OFSocketAddressString(address)]; - } - - for (size_t i = 0; i < IPv4Addresses.count; i++) { - const OFSocketAddress *address = - [IPv4Addresses itemAtIndex: i]; - - if (i > 0 || IPv6Addresses.count > 0) - [OFStdOut writeString: @", "]; - - [OFStdOut writeString: OFSocketAddressString(address)]; - } + +# ifdef OF_HAVE_IPV6 + printAddresses([interface objectForKey: + OFNetworkInterfaceIPv6Addresses], &firstAddress); +# endif + printAddresses([interface objectForKey: + OFNetworkInterfaceIPv4Addresses], &firstAddress); +# ifdef OF_HAVE_APPLETALK + printAddresses([interface objectForKey: + OFNetworkInterfaceAppleTalkAddresses], &firstAddress); +# endif [OFStdOut writeString: @")"]; } [OFStdOut writeString: @"\n"]; #endif objc_autoreleasePoolPop(pool); } @end