From 1614970ec527fca97bf54c272dca9daaf523d934 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Wed, 25 Apr 2012 09:53:29 -0400 Subject: [PATCH] Add new functions to virSocketAddr 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 | 2 ++ src/util/virsocketaddr.c | 45 ++++++++++++++++++++++++++++++++++++++++ src/util/virsocketaddr.h | 4 ++++ 3 files changed, 51 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a4bd9167fe..025816ab1b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1452,6 +1452,7 @@ virRandomInitialize; virSocketAddrBroadcast; virSocketAddrBroadcastByPrefix; virSocketAddrCheckNetmask; +virSocketAddrEqual; virSocketAddrFormat; virSocketAddrFormatFull; virSocketAddrGetPort; @@ -1463,6 +1464,7 @@ virSocketAddrParse; virSocketAddrParseIPv4; virSocketAddrParseIPv6; virSocketAddrPrefixToNetmask; +virSocketAddrSetIPv4Addr; virSocketAddrSetPort; diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c index b3104e74c6..34664068db 100644 --- a/src/util/virsocketaddr.c +++ b/src/util/virsocketaddr.c @@ -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 diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h index 3af6fe56fb..b71a8af000 100644 --- a/src/util/virsocketaddr.h +++ b/src/util/virsocketaddr.h @@ -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__ */ -- GitLab