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