[libvirt] [PATCH] virsh: Report error when explicit connection fails

Martin Kletzander mkletzan at redhat.com
Fri Jul 29 06:17:42 UTC 2016


Commit 0c56d9431839 forgot to return false in the cmdConnect command
after the clean up made there.

Before (assuming you don't have uri alias for 'asdf'):
  $ virsh connect asdf
  error: failed to connect to the hypervisor

  $ echo $?
  0

After (with the same assumption):
  $ virsh connect asdf
  error: failed to connect to the hypervisor
  error: no connection driver available for asdf

  $ echo $?
  1

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1356461

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 tools/virsh.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index f74698fa5f9a..d3fe06f19032 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -210,7 +210,7 @@ virshConnect(vshControl *ctl, const char *uri, bool readonly)
  * Reconnect after a disconnect from libvirtd
  *
  */
-static void
+static int
 virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
 {
     bool connected = false;
@@ -237,6 +237,7 @@ virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
             vshError(ctl, "%s", _("Failed to reconnect to the hypervisor"));
         else
             vshError(ctl, "%s", _("failed to connect to the hypervisor"));
+        return -1;
     } else {
         if (name) {
             VIR_FREE(ctl->connname);
@@ -253,6 +254,7 @@ virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
     priv->useGetInfo = false;
     priv->useSnapshotOld = false;
     priv->blockJobNoBytes = false;
+    return 0;
 }

 int virshStreamSink(virStreamPtr st ATTRIBUTE_UNUSED,
@@ -301,7 +303,8 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0)
         return false;

-    virshReconnect(ctl, name, ro, true);
+    if (virshReconnect(ctl, name, ro, true) < 0)
+        return false;

     return true;
 }
@@ -333,11 +336,13 @@ virshConnectionHandler(vshControl *ctl)
 {
     virshControlPtr priv = ctl->privData;

-    if (!priv->conn || disconnected)
-        virshReconnect(ctl, NULL, false, false);
+    if ((!priv->conn || disconnected) &&
+        virshReconnect(ctl, NULL, false, false) < 0)
+        return NULL;

     if (virshConnectionUsability(ctl, priv->conn))
         return priv->conn;
+
     return NULL;
 }

@@ -444,14 +449,13 @@ virshInit(vshControl *ctl)
         return false;

     if (ctl->connname) {
-        virshReconnect(ctl, NULL, false, false);
         /* Connecting to a named connection must succeed, but we delay
          * connecting to the default connection until we need it
          * (since the first command might be 'connect' which allows a
          * non-default connection, or might be 'help' which needs no
          * connection).
          */
-        if (!priv->conn) {
+        if (virshReconnect(ctl, NULL, false, false) < 0) {
             vshReportError(ctl);
             return false;
         }
-- 
2.9.2




More information about the libvir-list mailing list