[libvirt] [PATCHv2] addrToString: give better error message

Matthias Bolte matthias.bolte at googlemail.com
Thu Apr 22 20:33:15 UTC 2010


2010/4/21 Eric Blake <eblake at redhat.com>:
> The user probably doesn't care what the gai error numbers are, as
> much as what the failed conversion IP address was.
>
> * src/remote/remote_driver.c (addrToString): Mention which address
> could not be converted.
> * daemon/remote.c (addrToString): Likewise.
> ---
>
> Changes in v2:
> Remove magic numbers in remote.c's array sizing
> Use correct offset for IP addresses
>
>  daemon/remote.c            |   30 ++++++++++++++++++++++--------
>  src/remote/remote_driver.c |   26 ++++++++++++++++++++------
>  2 files changed, 42 insertions(+), 14 deletions(-)
>
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 149176f..b753a4a 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -1,7 +1,7 @@
>  /*
>  * remote.c: handlers for RPC method calls
>  *
> - * Copyright (C) 2007, 2008, 2009 Red Hat, Inc.
> + * Copyright (C) 2007-2010 Red Hat, Inc.
>  *
>  * This library is free software; you can redistribute it and/or
>  * modify it under the terms of the GNU Lesser General Public
> @@ -41,6 +41,7 @@
>  #include <string.h>
>  #include <errno.h>
>  #include <fnmatch.h>
> +#include <arpa/inet.h>
>  #include "virterror_internal.h"
>
>  #if HAVE_POLKIT0
> @@ -3169,21 +3170,34 @@ remoteDispatchAuthList (struct qemud_server *server,
>
>  #if HAVE_SASL
>  /*
> - * NB, keep in sync with similar method in src/remote_internal.c
> + * NB, keep in sync with similar method in src/remote/remote_driver.c
>  */
>  static char *addrToString(remote_error *rerr,
> -                          struct sockaddr_storage *sa, socklen_t salen) {
> -    char host[1024], port[20];
> +                          struct sockaddr_storage *ss, socklen_t salen) {
> +    char host[NI_MAXHOST], port[NI_MAXSERV];
>     char *addr;
>     int err;
> +    struct sockaddr *sa = (struct sockaddr *)ss;
>
> -    if ((err = getnameinfo((struct sockaddr *)sa, salen,
> +    if ((err = getnameinfo(sa, salen,
>                            host, sizeof(host),
>                            port, sizeof(port),
>                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
> -        remoteDispatchFormatError(rerr,
> -                                  _("Cannot resolve address %d: %s"),
> -                                  err, gai_strerror(err));
> +        char ip[INET6_ADDRSTRLEN];
> +
> +        if (inet_ntop(sa->sa_family,
> +                      (sa->sa_family == AF_INET
> +                       ? (void *)&((struct sockaddr_in *)sa)->sin_addr
> +                       : (void *)&((struct sockaddr_in6 *)sa)->sin6_addr),

Could we avoid this void * cast? The same cast is in
src/remote/remote_driver.c too.

> +                      ip, sizeof ip)) {
> +            remoteDispatchFormatError(rerr,
> +                                      _("Cannot resolve address %s: %s"),
> +                                      ip, gai_strerror(err));
> +        } else {
> +            remoteDispatchFormatError(rerr,
> +                                      _("Cannot resolve address: %s"),
> +                                      gai_strerror(err));
> +        }
>         return NULL;
>     }
>

ACK.

Matthias




More information about the libvir-list mailing list