
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