/* * virshReconnect: * * Reconnect after a disconnect from libvirtd * */ static int virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force) { bool connected = false; virshControlPtr priv = ctl->privData; /* If the flag was not specified, then it depends on whether we are * reconnecting to the current URI (in which case we want to keep the * readonly flag as it was) or to a specified URI in which case it * should stay false */ if (!readonly && !name) readonly = priv->readonly; if (priv->conn) { int ret; connected = true; virConnectUnregisterCloseCallback(priv->conn, virshCatchDisconnect); ret = virConnectClose(priv->conn); if (ret < 0) vshError(ctl, "%s", _("Failed to disconnect from the hypervisor")); else if (ret > 0) vshError(ctl, "%s", _("One or more references were leaked after " "disconnect from the hypervisor")); } priv->conn = virshConnect(ctl, name ? name : ctl->connname, readonly); if (!priv->conn) { if (disconnected) 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); ctl->connname = vshStrdup(ctl, name); } priv->readonly = readonly; if (virConnectRegisterCloseCallback(priv->conn, virshCatchDisconnect, ctl, NULL) < 0) vshError(ctl, "%s", _("Unable to register disconnect callback")); if (connected && !force) vshError(ctl, "%s", _("Reconnected to the hypervisor")); } disconnected = 0; priv->useGetInfo = false; priv->useSnapshotOld = false; priv->blockJobNoBytes = false; return 0; }
static bool cmdConnect(vshControl *ctl, const vshCmd *cmd) { bool ro = vshCommandOptBool(cmd, "readonly"); const char *name = NULL; virshControlPtr priv = ctl->privData; if (priv->conn) { int ret; virConnectUnregisterCloseCallback(priv->conn, virshCatchDisconnect); ret = virConnectClose(priv->conn); if (ret < 0) vshError(ctl, "%s", _("Failed to disconnect from the hypervisor")); else if (ret > 0) vshError(ctl, "%s", _("One or more references were leaked after " "disconnect from the hypervisor")); priv->conn = NULL; } VIR_FREE(ctl->connname); if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0) return false; ctl->connname = vshStrdup(ctl, name); priv->useGetInfo = false; priv->useSnapshotOld = false; 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, NULL, NULL) < 0) vshError(ctl, "%s", _("Unable to register disconnect callback")); return true; }