]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsocket: Introduce virSocketAddrIsWildcard
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 6 Jun 2013 13:50:01 +0000 (15:50 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 7 Jun 2013 13:21:57 +0000 (15:21 +0200)
This internal API checks, if passed address is a wildcard address.

src/libvirt_private.syms
src/util/virsocketaddr.c
src/util/virsocketaddr.h
tests/sockettest.c

index b93629feb8ed237f898981a7883274ee0f76bbea..1ea74674977a63902f28425addf36591408f31c2 100644 (file)
@@ -1782,6 +1782,7 @@ virSocketAddrGetPort;
 virSocketAddrGetRange;
 virSocketAddrIsNetmask;
 virSocketAddrIsPrivate;
+virSocketAddrIsWildcard;
 virSocketAddrMask;
 virSocketAddrMaskByPrefix;
 virSocketAddrParse;
index 1071b0056e9e76861d2a6e99e0a9012c924aea6d..e84c58e81ea3d911a23c4ad5b0dfe260b04715c2 100644 (file)
@@ -226,6 +226,26 @@ virSocketAddrIsPrivate(const virSocketAddrPtr addr)
     return false;
 }
 
+/*
+ * virSocketAddrIsWildcard:
+ * @addr: address to check
+ *
+ * Check if passed address is a variant of ANYCAST address.
+ */
+bool
+virSocketAddrIsWildcard(const virSocketAddrPtr addr)
+{
+    in_addr_t tmp = INADDR_ANY;
+    switch (addr->data.stor.ss_family) {
+    case AF_INET:
+        return memcmp(&addr->data.inet4.sin_addr.s_addr, &tmp,
+                      sizeof(addr->data.inet4.sin_addr.s_addr)) == 0;
+    case AF_INET6:
+        return IN6_IS_ADDR_UNSPECIFIED(&addr->data.inet6.sin6_addr.s6_addr);
+    }
+    return false;
+}
+
 /*
  * virSocketAddrFormat:
  * @addr: an initialized virSocketAddrPtr
index 1c9e54a441b305fb6a500ea1dc179197e914993c..b28fe6c7d5fd0ad5b0fbbc15a95b05669655a54d 100644 (file)
@@ -123,4 +123,5 @@ bool virSocketAddrEqual(const virSocketAddrPtr s1,
                         const virSocketAddrPtr s2);
 bool virSocketAddrIsPrivate(const virSocketAddrPtr addr);
 
+bool virSocketAddrIsWildcard(const virSocketAddrPtr addr);
 #endif /* __VIR_SOCKETADDR_H__ */
index 5b36a6c0bf7c8617ef848ac35a2e250a204ef8b9..092de88ba6902b5242d78423d593fbf79a977f0a 100644 (file)
@@ -157,6 +157,28 @@ static int testNetmaskHelper(const void *opaque)
     return testNetmask(data->addr1, data->addr2, data->netmask, data->pass);
 }
 
+static int testWildcard(const char *addrstr,
+                        bool pass)
+{
+    virSocketAddr addr;
+
+    if (virSocketAddrParse(&addr, addrstr, AF_UNSPEC) < 0)
+        return -1;
+
+    if (virSocketAddrIsWildcard(&addr))
+        return pass ? 0 : -1;
+    return pass ? -1 : 0;
+}
+
+struct testWildcardData {
+    const char *addr;
+    bool pass;
+};
+static int testWildcardHelper(const void *opaque)
+{
+    const struct testWildcardData *data = opaque;
+    return testWildcard(data->addr, data->pass);
+}
 
 static int
 mymain(void)
@@ -223,6 +245,14 @@ mymain(void)
             ret = -1;                                                   \
     } while (0)
 
+#define DO_TEST_WILDCARD(addr, pass)                                    \
+    do {                                                                \
+        struct testWildcardData data = { addr, pass};                   \
+        if (virtTestRun("Test wildcard " addr, 1,                       \
+                        testWildcardHelper, &data) < 0)                 \
+            ret = -1;                                                   \
+    } while (0)
+
 
     DO_TEST_PARSE_AND_FORMAT("127.0.0.1", AF_UNSPEC, true);
     DO_TEST_PARSE_AND_FORMAT("127.0.0.1", AF_INET, true);
@@ -276,6 +306,14 @@ mymain(void)
     DO_TEST_NETMASK("2000::1:1", "9000::1:1",
                     "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0", false);
 
+    DO_TEST_WILDCARD("0.0.0.0", true);
+    DO_TEST_WILDCARD("::", true);
+    DO_TEST_WILDCARD("0", true);
+    DO_TEST_WILDCARD("0.0", true);
+    DO_TEST_WILDCARD("0.0.0", true);
+    DO_TEST_WILDCARD("1", false);
+    DO_TEST_WILDCARD("0.1", false);
+
     return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }