Blob Blame History Raw
From 666a718d25a45051137ef6dfd353607492c58801 Mon Sep 17 00:00:00 2001
Message-Id: <666a718d25a45051137ef6dfd353607492c58801@dist-git>
From: Martin Kletzander <mkletzan@redhat.com>
Date: Tue, 2 Aug 2016 13:37:38 +0200
Subject: [PATCH] virsh: Report error when explicit connection fails

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@redhat.com>
(cherry picked from commit ff498a9ac70a550bed08233a86e00a4faf12aecf)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
---
 tools/virsh.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index f74698f..d3fe06f 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