[libvirt] [PATCH 3/3] Improve virSocketAddrMask[ByPrefix] API

Laine Stump laine at laine.org
Fri Dec 31 11:33:21 UTC 2010


The original version of these functions would modify the address sent
in, meaning that the caller would usually need to copy the address
first. This change makes the original a const, and puts the resulting
masked address into a new arg (which could point to the same
virSocketAddr as the original, if the caller really wants to modify
it).

This also makes the API consistent with virSocketAddrBroadcast[ByPrefix].
---
 src/util/iptables.c |    3 +--
 src/util/network.c  |   36 ++++++++++++++++++++++++++----------
 src/util/network.h  |   10 ++++++----
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/util/iptables.c b/src/util/iptables.c
index 647e7ae..6770fe0 100644
--- a/src/util/iptables.c
+++ b/src/util/iptables.c
@@ -298,8 +298,7 @@ static char *iptablesFormatNetwork(virSocketAddr *netaddr,
         return NULL;
     }
 
-    network = *netaddr;
-    if (virSocketAddrMaskByPrefix(&network, prefix) < 0) {
+    if (virSocketAddrMaskByPrefix(netaddr, prefix, &network) < 0) {
         iptablesError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Failure to mask address"));
         return NULL;
diff --git a/src/util/network.c b/src/util/network.c
index f58986e..a7e7423 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -298,23 +298,35 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask) {
  * Returns 0 in case of success, or -1 on error.
  */
 int
-virSocketAddrMask(virSocketAddrPtr addr, const virSocketAddrPtr netmask)
+virSocketAddrMask(const virSocketAddrPtr addr,
+                  const virSocketAddrPtr netmask,
+                  virSocketAddrPtr       network)
 {
-    if (addr->data.stor.ss_family != netmask->data.stor.ss_family)
+    if (addr->data.stor.ss_family != netmask->data.stor.ss_family) {
+        network->data.stor.ss_family = AF_UNSPEC;
         return -1;
+    }
 
     if (addr->data.stor.ss_family == AF_INET) {
-        addr->data.inet4.sin_addr.s_addr
-            &= netmask->data.inet4.sin_addr.s_addr;
+        network->data.inet4.sin_addr.s_addr
+            = (addr->data.inet4.sin_addr.s_addr
+               & netmask->data.inet4.sin_addr.s_addr);
+        network->data.stor.ss_family = AF_INET;
+        network->len = addr->len;
         return 0;
     }
     if (addr->data.stor.ss_family == AF_INET6) {
         int ii;
-        for (ii = 0; ii < 16; ii++)
-            addr->data.inet6.sin6_addr.s6_addr[ii]
-                &= netmask->data.inet6.sin6_addr.s6_addr[ii];
+        for (ii = 0; ii < 16; ii++) {
+            network->data.inet6.sin6_addr.s6_addr[ii]
+                = (addr->data.inet6.sin6_addr.s6_addr[ii]
+                   & netmask->data.inet6.sin6_addr.s6_addr[ii]);
+        }
+        network->data.stor.ss_family = AF_INET6;
+        network->len = addr->len;
         return 0;
     }
+    network->data.stor.ss_family = AF_UNSPEC;
     return -1;
 }
 
@@ -329,15 +341,19 @@ virSocketAddrMask(virSocketAddrPtr addr, const virSocketAddrPtr netmask)
  * Returns 0 in case of success, or -1 on error.
  */
 int
-virSocketAddrMaskByPrefix(virSocketAddrPtr addr, unsigned int prefix)
+virSocketAddrMaskByPrefix(const virSocketAddrPtr addr,
+                          unsigned int           prefix,
+                          virSocketAddrPtr       network)
 {
     virSocketAddr netmask;
 
     if (virSocketAddrPrefixToNetmask(prefix, &netmask,
-                                     addr->data.stor.ss_family) < 0)
+                                     addr->data.stor.ss_family) < 0) {
+        network->data.stor.ss_family = AF_UNSPEC;
         return -1;
+    }
 
-    return virSocketAddrMask(addr, &netmask);
+    return virSocketAddrMask(addr, &netmask, network);
 }
 
 /**
diff --git a/src/util/network.h b/src/util/network.h
index bcbc607..0b43bf6 100644
--- a/src/util/network.h
+++ b/src/util/network.h
@@ -73,10 +73,12 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask);
 int virSocketCheckNetmask (virSocketAddrPtr addr1,
                            virSocketAddrPtr addr2,
                            virSocketAddrPtr netmask);
-int virSocketAddrMask     (virSocketAddrPtr addr,
-                           const virSocketAddrPtr netmask);
-int virSocketAddrMaskByPrefix(virSocketAddrPtr addr,
-                              unsigned int prefix);
+int virSocketAddrMask     (const virSocketAddrPtr addr,
+                           const virSocketAddrPtr netmask,
+                           virSocketAddrPtr       network);
+int virSocketAddrMaskByPrefix(const virSocketAddrPtr addr,
+                              unsigned int           prefix,
+                              virSocketAddrPtr       network);
 int virSocketAddrBroadcast(const virSocketAddrPtr addr,
                            const virSocketAddrPtr netmask,
                            virSocketAddrPtr       broadcast);
-- 
1.7.3.4




More information about the libvir-list mailing list