]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: Report error when explicit connection fails
authorMartin Kletzander <mkletzan@redhat.com>
Fri, 29 Jul 2016 06:09:22 +0000 (08:09 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Tue, 2 Aug 2016 11:21:01 +0000 (13:21 +0200)
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>
tools/virsh.c

index f74698fa5f9a508079f4a5ebf09e506dc12f8cad..d3fe06f190324a0b8044dc88990e5b9900307590 100644 (file)
@@ -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;
         }