On Thu, Jun 06, 2013 at 16:10:29 +0200, Michal Privoznik wrote:
This internal API checks, if passed address is ANYCAST address.
---
src/libvirt_private.syms | 1 +
src/util/virsocketaddr.c | 22 ++++++++++++++++++++++
src/util/virsocketaddr.h | 1 +
tests/sockettest.c | 38 ++++++++++++++++++++++++++++++++++++++
4 files changed, 62 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b93629f..0b2ce42 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1780,6 +1780,7 @@ virSocketAddrFormatFull;
virSocketAddrGetIpPrefix;
virSocketAddrGetPort;
virSocketAddrGetRange;
+virSocketAddrIsAny;
virSocketAddrIsNetmask;
virSocketAddrIsPrivate;
virSocketAddrMask;
diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c
index 1071b00..4bfc86d 100644
--- a/src/util/virsocketaddr.c
+++ b/src/util/virsocketaddr.c
@@ -227,6 +227,28 @@ virSocketAddrIsPrivate(const virSocketAddrPtr addr)
}
/*
+ * virSocketAddrIsAny:
+ * @addr: address to check
+ *
+ * Check if passed address is a variant of ANYCAST address.
+ */
+bool
+virSocketAddrIsAny(const virSocketAddrPtr addr)
+{
+ unsigned long tmp;
+ switch (addr->data.stor.ss_family) {
+ case AF_INET:
+ tmp = INADDR_ANY;
+ return memcmp(&addr->data.inet4.sin_addr.s_addr, &tmp,
+ sizeof(addr->data.inet4.sin_addr.s_addr)) == 0;
+ case AF_INET6:
+ return memcmp(addr->data.inet6.sin6_addr.s6_addr, &in6addr_any,
+ sizeof(addr->data.inet6.sin6_addr.s6_addr)) == 0;
+ }
+ return false;
Shouldn't we use in_addr_t (or uint32_t at least) for tmp rather than
unsigned long and
IN6_IS_ADDR_UNSPECIFIED(&addr->data.inet6.sin6_addr.s6_addr)
instead of the second memcmp? However, I'm not sure how portable that
would be... in.h(0P) man page says both of them shall be defined in
netinet/in.h
+}
+
+/*
* virSocketAddrFormat:
* @addr: an initialized virSocketAddrPtr
*
diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h
index 1c9e54a..d4d7ccf 100644
--- a/src/util/virsocketaddr.h
+++ b/src/util/virsocketaddr.h
@@ -123,4 +123,5 @@ bool virSocketAddrEqual(const virSocketAddrPtr s1,
const virSocketAddrPtr s2);
bool virSocketAddrIsPrivate(const virSocketAddrPtr addr);
+bool virSocketAddrIsAny(const virSocketAddrPtr addr);
#endif /* __VIR_SOCKETADDR_H__ */
diff --git a/tests/sockettest.c b/tests/sockettest.c
index 5b36a6c..e4a998b 100644
--- a/tests/sockettest.c
+++ b/tests/sockettest.c
@@ -157,6 +157,28 @@ static int testNetmaskHelper(const void *opaque)
return testNetmask(data->addr1, data->addr2, data->netmask,
data->pass);
}
+static int testAnycast(const char *addrstr,
+ bool pass)
I'd probably use a different name since "anycast" has different meaning
in IPv6 world but I don't mind that much as I can't think of a better
name :-)
Jirka