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

Daniel Veillard veillard at redhat.com
Tue Nov 3 17:14:45 UTC 2009


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 at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
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