Re: [libvirt] [PATCH] network utilities: Add functions for address-text and get/set port number
On Mon, Nov 02, 2009 at 03:46:12PM -0500, Laine Stump wrote: I'm a bit behind the curve, but... On 11/02/2009 05:57 AM, Matthew Booth wrote: --- src/libvirt_private.syms |3 ++ src/util/network.c | 88 +- src/util/network.h |6 +++ 3 files changed, 96 insertions(+), 1 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8525dbd..15d75fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -289,10 +289,13 @@ virFree; virSocketAddrInNetwork; virSocketAddrIsNetmask; virSocketCheckNetmask; +virSocketFormatAddr; +virSocketGetPort; virSocketGetRange; virSocketParseAddr; virSocketParseIpv4Addr; virSocketParseIpv6Addr; +virSocketSetPort; # network_conf.h diff --git a/src/util/network.c b/src/util/network.c index abd866c..094130f 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -9,6 +9,7 @@ */ #includeconfig.h +#includearpa/inet.h #include memory.h #include network.h @@ -64,7 +65,7 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) { * Mostly a wrapper for getaddrinfo() extracting the address storage * from the numeric string like 1.2.3.4 or 2001:db8:85a3:0:0:8a2e:370:7334 * - * Returns the lenght of the network address or -1 in case of error. + * Returns the length of the network address or -1 in case of error. */ int virSocketParseAddr(const char *val, virSocketAddrPtr addr, int hint) { @@ -116,6 +117,91 @@ virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr) { return(virSocketParseAddr(val, addr, AF_INET6)); } +/* + * virSocketFormatAddr: + * @addr: an initialised virSocketAddrPtr + * + * Returns a string representation of the given address + * Returns NULL on any error + * Caller must free the returned string + */ +char * +virSocketFormatAddr(virSocketAddrPtr addr) { +char *out; +size_t outlen; +void *inaddr; + +if (addr-stor.ss_family == AF_INET) { +outlen = INET_ADDRSTRLEN; +inaddr =addr-inet4.sin_addr; +} + +else if (addr-stor.ss_family == AF_INET6) { +outlen = INET6_ADDRSTRLEN; +inaddr =addr-inet6.sin6_addr; +} + +else { +return NULL; +} + +if (VIR_ALLOC_N(out, outlen) 0) +return NULL; + +if (inet_ntop(addr-stor.ss_family, inaddr, out, outlen) == NULL) { +VIR_FREE(out); +return NULL; +} + +return out; +} + +/* + * virSocketSetPort: + * @addr: an initialised virSocketAddrPtr + * @port: the port number to set + * + * Set the transport layer port of the given virtSocketAddr + * + * Returns 0 on success, -1 on failure + */ +int +virSocketSetPort(virSocketAddrPtr addr, in_port_t port) { +if(addr-stor.ss_family == AF_INET) { +addr-inet4.sin_port = port; sin_port needs to be in network byte order. Unless you're figuring on the caller always remembering to do htons(), you might want to do it here. Sound a good point, can you provide a small patch for those issues ? Daniel +} + +else if(addr-stor.ss_family == AF_INET6) { +addr-inet6.sin6_port = port; Likewise. +} + +else { +return -1; +} + +return 0; +} + +/* + * virSocketGetPort: + * @addr: an initialised virSocketAddrPtr + * + * Returns the transport layer port of the given virtSocketAddr + * Returns 0 if @addr is invalid + */ +in_port_t +virSocketGetPort(virSocketAddrPtr addr) { +if(addr-stor.ss_family == AF_INET) { +return addr-inet4.sin_port; Again, depending on how far you want this abstraction to go, you might want to do ntohs of sin_port. +} + +else if(addr-stor.ss_family == AF_INET6) { +return addr-inet6.sin6_port; Ditto. +} + +return 0; +} + /** * virSocketAddrIsNetmask: * @netmask: the netmask address diff --git a/src/util/network.h b/src/util/network.h index e590747..7618547 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -34,6 +34,12 @@ int virSocketParseIpv4Addr(const char *val, int virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr); +char * virSocketFormatAddr(virSocketAddrPtr addr); + +int virSocketSetPort(virSocketAddrPtr addr, in_port_t port); + +in_port_t virSocketGetPort(virSocketAddrPtr addr); + int virSocketAddrInNetwork(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); -- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ dan...@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library
[libvirt] [PATCH] network utilities: Add functions for address-text and get/set port number
--- src/libvirt_private.syms |3 ++ src/util/network.c | 88 +- src/util/network.h |6 +++ 3 files changed, 96 insertions(+), 1 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8525dbd..15d75fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -289,10 +289,13 @@ virFree; virSocketAddrInNetwork; virSocketAddrIsNetmask; virSocketCheckNetmask; +virSocketFormatAddr; +virSocketGetPort; virSocketGetRange; virSocketParseAddr; virSocketParseIpv4Addr; virSocketParseIpv6Addr; +virSocketSetPort; # network_conf.h diff --git a/src/util/network.c b/src/util/network.c index abd866c..094130f 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -9,6 +9,7 @@ */ #include config.h +#include arpa/inet.h #include memory.h #include network.h @@ -64,7 +65,7 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) { * Mostly a wrapper for getaddrinfo() extracting the address storage * from the numeric string like 1.2.3.4 or 2001:db8:85a3:0:0:8a2e:370:7334 * - * Returns the lenght of the network address or -1 in case of error. + * Returns the length of the network address or -1 in case of error. */ int virSocketParseAddr(const char *val, virSocketAddrPtr addr, int hint) { @@ -116,6 +117,91 @@ virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr) { return(virSocketParseAddr(val, addr, AF_INET6)); } +/* + * virSocketFormatAddr: + * @addr: an initialised virSocketAddrPtr + * + * Returns a string representation of the given address + * Returns NULL on any error + * Caller must free the returned string + */ +char * +virSocketFormatAddr(virSocketAddrPtr addr) { +char *out; +size_t outlen; +void *inaddr; + +if (addr-stor.ss_family == AF_INET) { +outlen = INET_ADDRSTRLEN; +inaddr = addr-inet4.sin_addr; +} + +else if (addr-stor.ss_family == AF_INET6) { +outlen = INET6_ADDRSTRLEN; +inaddr = addr-inet6.sin6_addr; +} + +else { +return NULL; +} + +if (VIR_ALLOC_N(out, outlen) 0) +return NULL; + +if (inet_ntop(addr-stor.ss_family, inaddr, out, outlen) == NULL) { +VIR_FREE(out); +return NULL; +} + +return out; +} + +/* + * virSocketSetPort: + * @addr: an initialised virSocketAddrPtr + * @port: the port number to set + * + * Set the transport layer port of the given virtSocketAddr + * + * Returns 0 on success, -1 on failure + */ +int +virSocketSetPort(virSocketAddrPtr addr, in_port_t port) { +if(addr-stor.ss_family == AF_INET) { +addr-inet4.sin_port = port; +} + +else if(addr-stor.ss_family == AF_INET6) { +addr-inet6.sin6_port = port; +} + +else { +return -1; +} + +return 0; +} + +/* + * virSocketGetPort: + * @addr: an initialised virSocketAddrPtr + * + * Returns the transport layer port of the given virtSocketAddr + * Returns 0 if @addr is invalid + */ +in_port_t +virSocketGetPort(virSocketAddrPtr addr) { +if(addr-stor.ss_family == AF_INET) { +return addr-inet4.sin_port; +} + +else if(addr-stor.ss_family == AF_INET6) { +return addr-inet6.sin6_port; +} + +return 0; +} + /** * virSocketAddrIsNetmask: * @netmask: the netmask address diff --git a/src/util/network.h b/src/util/network.h index e590747..7618547 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -34,6 +34,12 @@ int virSocketParseIpv4Addr(const char *val, int virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr); +char * virSocketFormatAddr(virSocketAddrPtr addr); + +int virSocketSetPort(virSocketAddrPtr addr, in_port_t port); + +in_port_t virSocketGetPort(virSocketAddrPtr addr); + int virSocketAddrInNetwork(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] network utilities: Add functions for address-text and get/set port number
On Mon, Nov 02, 2009 at 10:57:11AM +, Matthew Booth wrote: --- src/libvirt_private.syms |3 ++ src/util/network.c | 88 +- src/util/network.h |6 +++ 3 files changed, 96 insertions(+), 1 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8525dbd..15d75fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -289,10 +289,13 @@ virFree; virSocketAddrInNetwork; virSocketAddrIsNetmask; virSocketCheckNetmask; +virSocketFormatAddr; +virSocketGetPort; virSocketGetRange; virSocketParseAddr; virSocketParseIpv4Addr; virSocketParseIpv6Addr; +virSocketSetPort; # network_conf.h diff --git a/src/util/network.c b/src/util/network.c index abd866c..094130f 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -9,6 +9,7 @@ */ #include config.h +#include arpa/inet.h #include memory.h #include network.h @@ -64,7 +65,7 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) { * Mostly a wrapper for getaddrinfo() extracting the address storage * from the numeric string like 1.2.3.4 or 2001:db8:85a3:0:0:8a2e:370:7334 * - * Returns the lenght of the network address or -1 in case of error. + * Returns the length of the network address or -1 in case of error. */ int virSocketParseAddr(const char *val, virSocketAddrPtr addr, int hint) { @@ -116,6 +117,91 @@ virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr) { return(virSocketParseAddr(val, addr, AF_INET6)); } +/* + * virSocketFormatAddr: + * @addr: an initialised virSocketAddrPtr + * + * Returns a string representation of the given address + * Returns NULL on any error + * Caller must free the returned string + */ +char * +virSocketFormatAddr(virSocketAddrPtr addr) { +char *out; +size_t outlen; +void *inaddr; + +if (addr-stor.ss_family == AF_INET) { +outlen = INET_ADDRSTRLEN; +inaddr = addr-inet4.sin_addr; +} + +else if (addr-stor.ss_family == AF_INET6) { +outlen = INET6_ADDRSTRLEN; +inaddr = addr-inet6.sin6_addr; +} + +else { +return NULL; +} + +if (VIR_ALLOC_N(out, outlen) 0) +return NULL; + +if (inet_ntop(addr-stor.ss_family, inaddr, out, outlen) == NULL) { +VIR_FREE(out); +return NULL; +} + +return out; +} + +/* + * virSocketSetPort: + * @addr: an initialised virSocketAddrPtr + * @port: the port number to set + * + * Set the transport layer port of the given virtSocketAddr + * + * Returns 0 on success, -1 on failure + */ +int +virSocketSetPort(virSocketAddrPtr addr, in_port_t port) { +if(addr-stor.ss_family == AF_INET) { +addr-inet4.sin_port = port; +} + +else if(addr-stor.ss_family == AF_INET6) { +addr-inet6.sin6_port = port; +} + +else { +return -1; +} + +return 0; +} + +/* + * virSocketGetPort: + * @addr: an initialised virSocketAddrPtr + * + * Returns the transport layer port of the given virtSocketAddr + * Returns 0 if @addr is invalid + */ +in_port_t +virSocketGetPort(virSocketAddrPtr addr) { +if(addr-stor.ss_family == AF_INET) { +return addr-inet4.sin_port; +} + +else if(addr-stor.ss_family == AF_INET6) { +return addr-inet6.sin6_port; +} + +return 0; +} + /** * virSocketAddrIsNetmask: * @netmask: the netmask address diff --git a/src/util/network.h b/src/util/network.h index e590747..7618547 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -34,6 +34,12 @@ int virSocketParseIpv4Addr(const char *val, int virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr); +char * virSocketFormatAddr(virSocketAddrPtr addr); + +int virSocketSetPort(virSocketAddrPtr addr, in_port_t port); + +in_port_t virSocketGetPort(virSocketAddrPtr addr); + int virSocketAddrInNetwork(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); Looks fine to me except for the following: - I'm a bit concerned by in_port_t portability, I would prefer to just use int there - using int would allow to keep the usual convention of -1 as the error return value in virSocketGetPort, allowing to distinguish 0 as not set and -1 as input parameter error - even if they are internal calls I would check the passed pointers against NULL in all the new routines. but looks like a good set to me :-) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ dan...@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@redhat.com
[libvirt] [PATCH] network utilities: Add functions for address-text and get/set port number
--- src/libvirt_private.syms |3 + src/util/network.c | 97 +- src/util/network.h |6 +++ 3 files changed, 105 insertions(+), 1 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8525dbd..15d75fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -289,10 +289,13 @@ virFree; virSocketAddrInNetwork; virSocketAddrIsNetmask; virSocketCheckNetmask; +virSocketFormatAddr; +virSocketGetPort; virSocketGetRange; virSocketParseAddr; virSocketParseIpv4Addr; virSocketParseIpv6Addr; +virSocketSetPort; # network_conf.h diff --git a/src/util/network.c b/src/util/network.c index abd866c..674e768 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -9,6 +9,7 @@ */ #include config.h +#include arpa/inet.h #include memory.h #include network.h @@ -64,7 +65,7 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) { * Mostly a wrapper for getaddrinfo() extracting the address storage * from the numeric string like 1.2.3.4 or 2001:db8:85a3:0:0:8a2e:370:7334 * - * Returns the lenght of the network address or -1 in case of error. + * Returns the length of the network address or -1 in case of error. */ int virSocketParseAddr(const char *val, virSocketAddrPtr addr, int hint) { @@ -116,6 +117,100 @@ virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr) { return(virSocketParseAddr(val, addr, AF_INET6)); } +/* + * virSocketFormatAddr: + * @addr: an initialised virSocketAddrPtr + * + * Returns a string representation of the given address + * Returns NULL on any error + * Caller must free the returned string + */ +char * +virSocketFormatAddr(virSocketAddrPtr addr) { +char *out; +size_t outlen; +void *inaddr; + +if (addr == NULL) +return NULL; + +if (addr-stor.ss_family == AF_INET) { +outlen = INET_ADDRSTRLEN; +inaddr = addr-inet4.sin_addr; +} + +else if (addr-stor.ss_family == AF_INET6) { +outlen = INET6_ADDRSTRLEN; +inaddr = addr-inet6.sin6_addr; +} + +else { +return NULL; +} + +if (VIR_ALLOC_N(out, outlen) 0) +return NULL; + +if (inet_ntop(addr-stor.ss_family, inaddr, out, outlen) == NULL) { +VIR_FREE(out); +return NULL; +} + +return out; +} + +/* + * virSocketSetPort: + * @addr: an initialised virSocketAddrPtr + * @port: the port number to set + * + * Set the transport layer port of the given virtSocketAddr + * + * Returns 0 on success, -1 on failure + */ +int +virSocketSetPort(virSocketAddrPtr addr, int port) { +if (addr == NULL) +return -1; + +if(addr-stor.ss_family == AF_INET) { +addr-inet4.sin_port = port; +} + +else if(addr-stor.ss_family == AF_INET6) { +addr-inet6.sin6_port = port; +} + +else { +return -1; +} + +return 0; +} + +/* + * virSocketGetPort: + * @addr: an initialised virSocketAddrPtr + * + * Returns the transport layer port of the given virtSocketAddr + * Returns -1 if @addr is invalid + */ +int +virSocketGetPort(virSocketAddrPtr addr) { +if (addr == NULL) +return -1; + +if(addr-stor.ss_family == AF_INET) { +return addr-inet4.sin_port; +} + +else if(addr-stor.ss_family == AF_INET6) { +return addr-inet6.sin6_port; +} + +return -1; +} + /** * virSocketAddrIsNetmask: * @netmask: the netmask address diff --git a/src/util/network.h b/src/util/network.h index e590747..3762ef2 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -34,6 +34,12 @@ int virSocketParseIpv4Addr(const char *val, int virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr); +char * virSocketFormatAddr(virSocketAddrPtr addr); + +int virSocketSetPort(virSocketAddrPtr addr, int port); + +int virSocketGetPort(virSocketAddrPtr addr); + int virSocketAddrInNetwork(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] network utilities: Add functions for address-text and get/set port number
I'm a bit behind the curve, but... On 11/02/2009 05:57 AM, Matthew Booth wrote: --- src/libvirt_private.syms |3 ++ src/util/network.c | 88 +- src/util/network.h |6 +++ 3 files changed, 96 insertions(+), 1 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8525dbd..15d75fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -289,10 +289,13 @@ virFree; virSocketAddrInNetwork; virSocketAddrIsNetmask; virSocketCheckNetmask; +virSocketFormatAddr; +virSocketGetPort; virSocketGetRange; virSocketParseAddr; virSocketParseIpv4Addr; virSocketParseIpv6Addr; +virSocketSetPort; # network_conf.h diff --git a/src/util/network.c b/src/util/network.c index abd866c..094130f 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -9,6 +9,7 @@ */ #includeconfig.h +#includearpa/inet.h #include memory.h #include network.h @@ -64,7 +65,7 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) { * Mostly a wrapper for getaddrinfo() extracting the address storage * from the numeric string like 1.2.3.4 or 2001:db8:85a3:0:0:8a2e:370:7334 * - * Returns the lenght of the network address or -1 in case of error. + * Returns the length of the network address or -1 in case of error. */ int virSocketParseAddr(const char *val, virSocketAddrPtr addr, int hint) { @@ -116,6 +117,91 @@ virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr) { return(virSocketParseAddr(val, addr, AF_INET6)); } +/* + * virSocketFormatAddr: + * @addr: an initialised virSocketAddrPtr + * + * Returns a string representation of the given address + * Returns NULL on any error + * Caller must free the returned string + */ +char * +virSocketFormatAddr(virSocketAddrPtr addr) { +char *out; +size_t outlen; +void *inaddr; + +if (addr-stor.ss_family == AF_INET) { +outlen = INET_ADDRSTRLEN; +inaddr =addr-inet4.sin_addr; +} + +else if (addr-stor.ss_family == AF_INET6) { +outlen = INET6_ADDRSTRLEN; +inaddr =addr-inet6.sin6_addr; +} + +else { +return NULL; +} + +if (VIR_ALLOC_N(out, outlen) 0) +return NULL; + +if (inet_ntop(addr-stor.ss_family, inaddr, out, outlen) == NULL) { +VIR_FREE(out); +return NULL; +} + +return out; +} + +/* + * virSocketSetPort: + * @addr: an initialised virSocketAddrPtr + * @port: the port number to set + * + * Set the transport layer port of the given virtSocketAddr + * + * Returns 0 on success, -1 on failure + */ +int +virSocketSetPort(virSocketAddrPtr addr, in_port_t port) { +if(addr-stor.ss_family == AF_INET) { +addr-inet4.sin_port = port; sin_port needs to be in network byte order. Unless you're figuring on the caller always remembering to do htons(), you might want to do it here. +} + +else if(addr-stor.ss_family == AF_INET6) { +addr-inet6.sin6_port = port; Likewise. +} + +else { +return -1; +} + +return 0; +} + +/* + * virSocketGetPort: + * @addr: an initialised virSocketAddrPtr + * + * Returns the transport layer port of the given virtSocketAddr + * Returns 0 if @addr is invalid + */ +in_port_t +virSocketGetPort(virSocketAddrPtr addr) { +if(addr-stor.ss_family == AF_INET) { +return addr-inet4.sin_port; Again, depending on how far you want this abstraction to go, you might want to do ntohs of sin_port. +} + +else if(addr-stor.ss_family == AF_INET6) { +return addr-inet6.sin6_port; Ditto. +} + +return 0; +} + /** * virSocketAddrIsNetmask: * @netmask: the netmask address diff --git a/src/util/network.h b/src/util/network.h index e590747..7618547 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -34,6 +34,12 @@ int virSocketParseIpv4Addr(const char *val, int virSocketParseIpv6Addr(const char *val, virSocketAddrPtr addr); +char * virSocketFormatAddr(virSocketAddrPtr addr); + +int virSocketSetPort(virSocketAddrPtr addr, in_port_t port); + +in_port_t virSocketGetPort(virSocketAddrPtr addr); + int virSocketAddrInNetwork(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); -- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list