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