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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]