[libvirt] [PATCH] network utilities: Add functions for address->text and get/set port number

Daniel Veillard veillard at redhat.com
Mon Nov 2 11:07:20 UTC 2009


On Mon, Nov 02, 2009 at 10:57:11AM +0000, 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/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list