From: Cole Robinson Date: Wed, 20 Apr 2016 17:56:27 +0000 (-0400) Subject: virsh: Don't clear old connection if 'connect $uri' fails X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=a02a859be40ab49b79cc3c4ff4d735878139cf30;p=libvirt.git virsh: Don't clear old connection if 'connect $uri' fails virsh # list --all Id Name State ---------------------------------------------------- 1 test running virsh # connect frob error: Failed to connect to the hypervisor error: no connection driver available for frob virsh # list --all error: failed to connect to the hypervisor error: no valid connection error: no connection driver available for frob Seems sensible IMO to just not clear out the old connection state until the new virConnectOpen succeeds. https://bugzilla.redhat.com/show_bug.cgi?id=829160 --- diff --git a/tools/virsh.c b/tools/virsh.c index 366956cd5c..af07251087 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -292,6 +292,17 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd) bool ro = vshCommandOptBool(cmd, "readonly"); const char *name = NULL; virshControlPtr priv = ctl->privData; + virConnectPtr conn; + + if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0) + return false; + + conn = virshConnect(ctl, name, ro); + + if (!conn) { + vshError(ctl, "%s", _("Failed to connect to the hypervisor")); + return false; + } if (priv->conn) { int ret; @@ -303,13 +314,10 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd) else if (ret > 0) vshError(ctl, "%s", _("One or more references were leaked after " "disconnect from the hypervisor")); - priv->conn = NULL; } + priv->conn = conn; VIR_FREE(ctl->connname); - if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0) - return false; - ctl->connname = vshStrdup(ctl, name); priv->useGetInfo = false; @@ -317,13 +325,6 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd) priv->blockJobNoBytes = false; priv->readonly = ro; - priv->conn = virshConnect(ctl, ctl->connname, priv->readonly); - - if (!priv->conn) { - vshError(ctl, "%s", _("Failed to connect to the hypervisor")); - return false; - } - if (virConnectRegisterCloseCallback(priv->conn, virshCatchDisconnect, ctl, NULL) < 0) vshError(ctl, "%s", _("Unable to register disconnect callback"));