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 @@
> */
>
> #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;
>
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(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/