From 13c881dcbfb6ab222e51f68eca4fdcb314c2759e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 6 Dec 2011 21:46:22 +0000 Subject: [PATCH] Improve error reporting when libvirtd is not installed Currently if you try to connect to a local libvirtd when libvirtd is not in $PATH, you'll get an error error: internal error invalid use of command API This is because remoteFindDaemonPath() returns NULL, which causes us to pass NULL into virNetSocketConnectUNIX which in turn causes us to pass NULL into virCommandNewArgList. Adding missing error checks improves this to error: internal error Unable to locate libvirtd daemon in $PATH * src/remote/remote_driver.c: Report error if libvirtd cannot be found * src/rpc/virnetsocket.c: Report error if caller requested spawning of daemon, but provided no binary path --- src/remote/remote_driver.c | 8 +++++++- src/rpc/virnetsocket.c | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 1fb0eca2d5..755275ab9d 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -321,6 +321,7 @@ doRemoteOpen (virConnectPtr conn, trans_ext, trans_tcp, } transport; + const char *daemonPath; /* We handle *ALL* URIs here. The caller has rejected any * URIs we don't care about */ @@ -588,9 +589,14 @@ doRemoteOpen (virConnectPtr conn, VIR_DEBUG("Proceeding with sockname %s", sockname); } + if (!(daemonPath = remoteFindDaemonPath())) { + remoteError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to locate libvirtd daemon in $PATH")); + goto failed; + } if (!(priv->client = virNetClientNewUNIX(sockname, flags & VIR_DRV_OPEN_REMOTE_AUTOSTART, - remoteFindDaemonPath()))) + daemonPath))) goto failed; priv->is_secure = 1; diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index 2747f66c6f..af4fc5e9a7 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -481,6 +481,12 @@ int virNetSocketNewConnectUNIX(const char *path, remoteAddr.len = sizeof(remoteAddr.data.un); + if (spawnDaemon && !binary) { + virNetError(VIR_ERR_INTERNAL_ERROR, + _("Auto-spawn of daemon requested, but no binary specified")); + return -1; + } + if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { virReportSystemError(errno, "%s", _("Failed to create socket")); goto error; -- 2.47.2