From d044457531a731dd97533d611ea7bfd22fa920e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 23 Mar 2015 17:47:59 +0000 Subject: [PATCH] BNetworkAddress::IsEmpty() now detects empty ipv4/6. * Until now, only AF_UNSPEC addresses could be empty. * Now, the unspecified IPV4/IPv6 address is considered empty, too. * This corresponds to how the kernel modules handles this. --- src/kits/network/libnetapi/NetworkAddress.cpp | 24 +++++++++++++++++-- .../kits/net/libnetapi/NetworkAddressTest.cpp | 6 ++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/kits/network/libnetapi/NetworkAddress.cpp b/src/kits/network/libnetapi/NetworkAddress.cpp index d8b1e804f4..b6eca702d9 100644 --- a/src/kits/network/libnetapi/NetworkAddress.cpp +++ b/src/kits/network/libnetapi/NetworkAddress.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2013, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2010-2015, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -617,7 +617,27 @@ BNetworkAddress::SockAddr() bool BNetworkAddress::IsEmpty() const { - return fAddress.ss_len == 0 || fAddress.ss_family == AF_UNSPEC; + if (fAddress.ss_len == 0) + return true; + + switch (fAddress.ss_family) { + case AF_UNSPEC: + return true; + case AF_INET: + { + sockaddr_in& sin = (sockaddr_in&)fAddress; + return sin.sin_addr.s_addr == INADDR_ANY && sin.sin_port == 0; + } + case AF_INET6: + { + sockaddr_in6& sin6 = (sockaddr_in6&)fAddress; + return IN6_IS_ADDR_UNSPECIFIED(&sin6.sin6_addr) + && sin6.sin6_port == 0; + } + + default: + return false; + } } diff --git a/src/tests/kits/net/libnetapi/NetworkAddressTest.cpp b/src/tests/kits/net/libnetapi/NetworkAddressTest.cpp index c0d6a4e92b..5c3713493b 100644 --- a/src/tests/kits/net/libnetapi/NetworkAddressTest.cpp +++ b/src/tests/kits/net/libnetapi/NetworkAddressTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2010-2015, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -73,9 +73,13 @@ NetworkAddressTest::TestWildcard() CPPUNIT_ASSERT(wildcard.Port() == 0); CPPUNIT_ASSERT(((sockaddr_in&)wildcard.SockAddr()).sin_addr.s_addr == INADDR_ANY); + CPPUNIT_ASSERT(wildcard.IsEmpty()); BNetworkAddress null(AF_INET, NULL); CPPUNIT_ASSERT(wildcard == null); + + wildcard.SetPort(555); + CPPUNIT_ASSERT(!wildcard.IsEmpty()); }