]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add new functions to virSocketAddr
authorStefan Berger <stefanb@linux.vnet.ibm.com>
Wed, 25 Apr 2012 13:53:29 +0000 (09:53 -0400)
committerStefan Berger <stefanb@us.ibm.com>
Wed, 25 Apr 2012 13:53:29 +0000 (09:53 -0400)
Add 2 new functions to the virSocketAddr 'class':

- virSocketAddrEqual: tests whether two IP addresses and their ports are equal
- virSocketaddSetIPv4Addr: set a virSocketAddr given a 32 bit int

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

index a4bd9167fe3d105ad049ff47e1827bf717b79cdf..025816ab1ba44286fc52fd874861c9c3f41e79ca 100644 (file)
@@ -1452,6 +1452,7 @@ virRandomInitialize;
 virSocketAddrBroadcast;
 virSocketAddrBroadcastByPrefix;
 virSocketAddrCheckNetmask;
+virSocketAddrEqual;
 virSocketAddrFormat;
 virSocketAddrFormatFull;
 virSocketAddrGetPort;
@@ -1463,6 +1464,7 @@ virSocketAddrParse;
 virSocketAddrParseIPv4;
 virSocketAddrParseIPv6;
 virSocketAddrPrefixToNetmask;
+virSocketAddrSetIPv4Addr;
 virSocketAddrSetPort;
 
 
index b3104e74c6137ea6da148727d33c0ae4b080da15..34664068db3f85cbe8f3e1d501ef09413ee1c949 100644 (file)
@@ -151,6 +151,51 @@ virSocketAddrParseIPv6(virSocketAddrPtr addr, const char *val) {
     return virSocketAddrParse(addr, val, AF_INET6);
 }
 
+/*
+ * virSocketAddrSetIPv4Addr:
+ * @addr: the location to store the result
+ * @val: the 32bit integer in host byte order representing the IPv4 address
+ *
+ * Set the IPv4 address given an integer in host order. This function does not
+ * touch any previously set port.
+ */
+void
+virSocketAddrSetIPv4Addr(virSocketAddrPtr addr, uint32_t val)
+{
+    addr->data.stor.ss_family = AF_INET;
+    addr->data.inet4.sin_addr.s_addr = htonl(val);
+    addr->len = sizeof(struct sockaddr_in);
+}
+
+/*
+ * virSocketAddrEqual:
+ * @s1: the location of the one IP address
+ * @s2: the location of the other IP address
+ *
+ * Compare two IP addresses for equality. Two addresses are equal
+ * if their IP addresses and ports are equal.
+ */
+bool
+virSocketAddrEqual(const virSocketAddrPtr s1, const virSocketAddrPtr s2)
+{
+    if (s1->data.stor.ss_family != s2->data.stor.ss_family)
+        return false;
+
+    switch (s1->data.stor.ss_family) {
+    case AF_INET:
+        return (memcmp(&s1->data.inet4.sin_addr.s_addr,
+                       &s2->data.inet4.sin_addr.s_addr,
+                       sizeof(s1->data.inet4.sin_addr.s_addr)) == 0 &&
+                s1->data.inet4.sin_port == s2->data.inet4.sin_port);
+    case AF_INET6:
+        return (memcmp(&s1->data.inet6.sin6_addr.s6_addr,
+                       &s2->data.inet6.sin6_addr.s6_addr,
+                       sizeof(s1->data.inet6.sin6_addr.s6_addr)) == 0 &&
+                s1->data.inet6.sin6_port == s2->data.inet6.sin6_port);
+    }
+    return false;
+}
+
 /*
  * virSocketAddrFormat:
  * @addr: an initialized virSocketAddrPtr
index 3af6fe56fbbda3b0997cb20c2b064ce3e2a2d2ae..b71a8af00093e39e04d32043e60c69ba1b24e752 100644 (file)
@@ -66,6 +66,8 @@ int virSocketAddrParseIPv4(virSocketAddrPtr addr,
 int virSocketAddrParseIPv6(virSocketAddrPtr addr,
                            const char *val);
 
+void virSocketAddrSetIPv4Addr(const virSocketAddrPtr s, uint32_t addr);
+
 char * virSocketAddrFormat(virSocketAddrPtr addr);
 char * virSocketAddrFormatFull(virSocketAddrPtr addr,
                                bool withService,
@@ -100,5 +102,7 @@ int virSocketAddrGetNumNetmaskBits(const virSocketAddrPtr netmask);
 int virSocketAddrPrefixToNetmask(unsigned int prefix,
                                  virSocketAddrPtr netmask,
                                  int family);
+bool virSocketAddrEqual(const virSocketAddrPtr s1,
+                        const virSocketAddrPtr s2);
 
 #endif /* __VIR_SOCKETADDR_H__ */