[libvirt] [PATCH] Improve error reporting for virConnectGetHostname calls

Chris Lalancette clalance at redhat.com
Wed Oct 28 14:32:32 UTC 2009


Cole Robinson wrote:
> All drivers have copy + pasted inadequate error reporting which wraps
> util.c:virGetHostname. Move all error reporting to this function, and improve
> what we report.

Overall, a good idea, I think.  A few nits below.

> diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> index 03d091a..058e684 100644
> --- a/daemon/libvirtd.c
> +++ b/daemon/libvirtd.c
> @@ -939,9 +939,8 @@ static struct qemud_server *qemudNetworkInit(struct qemud_server *server) {
>          if (!mdns_name) {
>              char groupname[64], *localhost, *tmp;
>              /* Extract the host part of the potentially FQDN */
> -            localhost = virGetHostname();
> +            localhost = virGetHostname(NULL);
>              if (localhost == NULL) {
> -                virReportOOMError(NULL);
>                  goto cleanup;
>              }

Drop the braces here as well.

>              if ((tmp = strchr(localhost, '.')))
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index ef97364..73f1c8e 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2058,16 +2058,8 @@ cleanup:
>  
>  static char *lxcGetHostname (virConnectPtr conn)
>  {
> -    char *result;
> -
> -    result = virGetHostname();
> -    if (result == NULL) {
> -        virReportSystemError (conn, errno,
> -                              "%s", _("failed to determine host name"));
> -        return NULL;
> -    }
>      /* Caller frees this string. */
> -    return result;
> +    return virGetHostname(conn);
>  }

Just get rid of the whole function and call virGetHostname() directly where
lxcGetHostname() would have been called.

>  
>  static int lxcFreezeContainer(lxc_driver_t *driver, virDomainObjPtr vm)
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index a3beedb..86546e5 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2623,16 +2623,8 @@ cleanup:
>  static char *
>  qemudGetHostname (virConnectPtr conn)
>  {
> -    char *result;
> -
> -    result = virGetHostname();
> -    if (result == NULL) {
> -        virReportSystemError (conn, errno,
> -                              "%s", _("failed to determine host name"));
> -        return NULL;
> -    }
>      /* Caller frees this string. */
> -    return result;
> +    return virGetHostname(conn);
>  }

Same here.

>  
>  static int qemudListDomains(virConnectPtr conn, int *ids, int nids) {
> @@ -6283,9 +6275,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
>          if (port == QEMUD_MIGRATION_NUM_PORTS) port = 0;
>  
>          /* Get hostname */
> -        if ((hostname = virGetHostname()) == NULL) {
> -            virReportSystemError (dconn, errno,
> -                                  "%s", _("failed to determine host name"));
> +        if ((hostname = virGetHostname(dconn)) == NULL) {
>              goto cleanup;
>          }
>  
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 36f8158..4a081be 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -994,16 +994,8 @@ static int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED,
>  
>  static char *testGetHostname (virConnectPtr conn)
>  {
> -    char *result;
> -
> -    result = virGetHostname();
> -    if (result == NULL) {
> -        virReportSystemError(conn, errno,
> -                             "%s", _("cannot lookup hostname"));
> -        return NULL;
> -    }
>      /* Caller frees this string. */
> -    return result;
> +    return virGetHostname(conn);
>  }

Same here.

>  
>  static int testGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index 9a7fe42..cd92a6b 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1131,16 +1131,8 @@ cleanup:
>  static char *
>  umlGetHostname (virConnectPtr conn)
>  {
> -    char *result;
> -
> -    result = virGetHostname();
> -    if (result == NULL) {
> -        virReportSystemError(conn, errno,
> -                             "%s", _("cannot lookup hostname"));
> -        return NULL;
> -    }
>      /* Caller frees this string. */
> -    return result;
> +    return virGetHostname(conn);
>  }

Same here.

>  
>  static int umlListDomains(virConnectPtr conn, int *ids, int nids) {
> diff --git a/src/util/util.c b/src/util/util.c
> index 98f8a14..49eac6d 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -1804,30 +1804,42 @@ int virDiskNameToIndex(const char *name) {
>  #define AI_CANONIDN 0
>  #endif
>  
> -char *virGetHostname(void)
> +char *virGetHostname(virConnectPtr conn)

To be honest, I'm not sure we even need to add the "conn" parameter here.  I
seem to remember DanB saying that it was only needed in very few circumstances
anymore.  Can't we just call "virReportSystemError(NULL)", etc?  That keeps this
function signature a bit simpler.  (It's not a deal-breaker in any case, just
nice to not have to require this parameter)

>  {
>      int r;
>      char hostname[HOST_NAME_MAX+1], *result;
>      struct addrinfo hints, *info;
>  
>      r = gethostname (hostname, sizeof(hostname));
> -    if (r == -1)
> +    if (r == -1) {
> +        virReportSystemError (conn, errno,
> +                              "%s", _("failed to determine host name"));
>          return NULL;
> +    }
>      NUL_TERMINATE(hostname);
>  
>      memset(&hints, 0, sizeof(hints));
>      hints.ai_flags = AI_CANONNAME|AI_CANONIDN;
>      hints.ai_family = AF_UNSPEC;
>      r = getaddrinfo(hostname, NULL, &hints, &info);
> -    if (r != 0)
> +    if (r != 0) {
> +        ReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                    _("getaddrinfo failed for '%s': %s"),
> +                    hostname, gai_strerror(r));
>          return NULL;
> +    }
>      if (info->ai_canonname == NULL) {
> +        ReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                    "%s", _("could not determine canonical host name"));
>          freeaddrinfo(info);
>          return NULL;
>      }
>  
>      /* Caller frees this string. */
>      result = strdup (info->ai_canonname);
> +    if (!result)
> +        virReportOOMError(conn);
> +
>      freeaddrinfo(info);
>      return result;
>  }
> diff --git a/src/util/util.h b/src/util/util.h
> index 8679636..85d5488 100644
> --- a/src/util/util.h
> +++ b/src/util/util.h
> @@ -222,7 +222,7 @@ static inline int getuid (void) { return 0; }
>  static inline int getgid (void) { return 0; }
>  #endif
>  
> -char *virGetHostname(void);
> +char *virGetHostname(virConnectPtr conn);
>  
>  int virKillProcess(pid_t pid, int sig);
>  
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 4f43901..2a17946 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -594,17 +594,8 @@ static int vboxGetVersion(virConnectPtr conn, unsigned long *version) {
>  }
>  
>  static char *vboxGetHostname(virConnectPtr conn) {
> -    char *hostname;
> -
>      /* the return string should be freed by caller */
> -    hostname = virGetHostname();
> -    if (hostname == NULL) {
> -        vboxError(conn, VIR_ERR_INTERNAL_ERROR,"%s",
> -                  "failed to determine host name");
> -        return NULL;
> -    }
> -
> -    return hostname;
> +    return virGetHostname(conn);
>  }

Again, drop the wrapper function.

>  
>  static int vboxGetMaxVcpus(virConnectPtr conn, const char *type ATTRIBUTE_UNUSED) {
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index f2744b0..0818cd3 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -484,16 +484,8 @@ xenUnifiedGetVersion (virConnectPtr conn, unsigned long *hvVer)
>  static char *
>  xenUnifiedGetHostname (virConnectPtr conn)
>  {
> -    char *result;
> -
> -    result = virGetHostname();
> -    if (result == NULL) {
> -        virReportSystemError(conn, errno,
> -                             "%s", _("cannot lookup hostname"));
> -        return NULL;
> -    }
>      /* Caller frees this string. */
> -    return result;
> +    return virGetHostname(conn);
>  }

Drop the wrapper.

>  
>  static int
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index d3ab019..6d1d851 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -4347,9 +4347,8 @@ xenDaemonDomainMigratePrepare (virConnectPtr dconn,
>       * deallocates this string.
>       */
>      if (uri_in == NULL) {
> -        *uri_out = virGetHostname();
> +        *uri_out = virGetHostname(dconn);
>          if (*uri_out == NULL) {
> -            virReportOOMError(dconn);
>              return -1;
>          }
>      }

Drop the braces.

> diff --git a/tools/virsh.c b/tools/virsh.c
> index 6b93405..3c668da 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -524,7 +524,7 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom)
>      char *thatHost = NULL;
>      char *thisHost = NULL;
>  
> -    if (!(thisHost = virGetHostname())) {
> +    if (!(thisHost = virGetHostname(ctl->conn))) {
>          vshError(ctl, "%s", _("Failed to get local hostname"));
>          goto cleanup;
>      }


-- 
Chris Lalancette




More information about the libvir-list mailing list