[libvirt] [PATCH 06/11] Expand virSocketFormat to be more flexible
Eric Blake
eblake at redhat.com
Thu Oct 21 20:34:38 UTC 2010
On 10/21/2010 12:17 PM, Daniel P. Berrange wrote:
> The getnameinfo() function is more flexible than inet_ntop()
> avoiding the need to if/else the code based on socket family.
> Also make it support UNIX socket addrs and allow inclusion
> of a port (service) address. Finally do proper error reporting
> via normal APIs.
>
> * src/conf/domain_conf.c, src/nwfilter/nwfilter_ebiptables_driver.c,
> src/qemu/qemu_conf.c: Fix error handling with virSocketFormat
> * src/util/network.c: Rewrite virSocketFormat to use getnameinfo
> and cope with UNIX socket addrs.
> ---
> po/POTFILES.in | 1 +
> src/conf/domain_conf.c | 5 +--
> src/libvirt_private.syms | 1 +
> src/nwfilter/nwfilter_ebiptables_driver.c | 12 +----
> src/qemu/qemu_conf.c | 2 +
> src/util/network.c | 82 ++++++++++++++++++++++-------
> src/util/network.h | 5 ++
> 7 files changed, 75 insertions(+), 33 deletions(-)
> +/*
> + * virSocketFormatAddr:
s/Addr:/AddrFull:/
> + * @addr: an initialized virSocketAddrPtr
> + * @withService: if true, then service info is appended
> + * @separator: separator between hostname& service.
Must be non-NULL if withService is true, and ignored when withService is
false? In which case, is it merely sufficient to provide a non-NULL
string to request withService, in which point the second parameter is
redundant?
> + *
> + * Returns a string representation of the given address
> + * Returns NULL on any error
> + * Caller must free the returned string
> + */
> +char *
> +virSocketFormatAddrFull(virSocketAddrPtr addr,
> + bool withService,
> + const char *separator)
> +{
> + char host[NI_MAXHOST], port[NI_MAXSERV];
> + char *addrstr;
> + int err;
>
> - else if (addr->data.stor.ss_family == AF_INET6) {
> - outlen = INET6_ADDRSTRLEN;
> - inaddr =&addr->data.inet6.sin6_addr;
> + if (addr == NULL) {
> + virSocketError(VIR_ERR_INVALID_ARG, _("Missing address"));
> + return NULL;
> }
>
> - else {
> - return NULL;
> + /* Short-circuit since getnameinfo doesn't work
> + * nicely for UNIX sockets */
> + if (addr->data.sa.sa_family == AF_UNIX) {
> + if (withService) {
> + if (virAsprintf(&addrstr, "127.0.0.1%s0",
> + separator ? separator : ":")< 0)
Oh, I see - separator defaults to ":" if withService is true but
separator is NULL. Still, is the three-argument version buying us
anything over a two-argument version where the caller must supply ":"
rather than relying on a default?
ACK if you decide 3 arguments is worth it, and with the doc typo fixed.
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list