From 54b63347144b616e7fca80608acfc2c3cd9ee9cd Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 2 Aug 2012 19:15:16 +0200 Subject: [PATCH] virsh: Switch to close callback Since we've introduced close callbacks we can drop this SIGINT magic (which doesn't work now neither) and fully utilize the new feature. --- tools/virsh.c | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 4670ee6225..b95a008af6 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -568,31 +568,16 @@ static int disconnected = 0; /* we may have been disconnected */ /* * vshCatchDisconnect: * - * We get here when a SIGPIPE is being raised, we can't do much in the - * handler, just save the fact it was raised - */ -static void vshCatchDisconnect(int sig, siginfo_t *siginfo, - void *context ATTRIBUTE_UNUSED) { - if (sig == SIGPIPE || - (SA_SIGINFO && siginfo->si_signo == SIGPIPE)) - disconnected++; -} - -/* - * vshSetupSignals: - * - * Catch SIGPIPE signals which may arise when disconnection - * from libvirtd occurs + * We get here when the connection was closed. We can't do much in the + * handler, just save the fact it was raised. */ static void -vshSetupSignals(void) { - struct sigaction sig_action; - - sig_action.sa_sigaction = vshCatchDisconnect; - sig_action.sa_flags = SA_SIGINFO; - sigemptyset(&sig_action.sa_mask); - - sigaction(SIGPIPE, &sig_action, NULL); +vshCatchDisconnect(virConnectPtr conn ATTRIBUTE_UNUSED, + int reason, + void *opaque ATTRIBUTE_UNUSED) +{ + if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT) + disconnected++; } /* @@ -614,10 +599,15 @@ vshReconnect(vshControl *ctl) ctl->conn = virConnectOpenAuth(ctl->name, virConnectAuthPtrDefault, ctl->readonly ? VIR_CONNECT_RO : 0); - if (!ctl->conn) + if (!ctl->conn) { vshError(ctl, "%s", _("Failed to reconnect to the hypervisor")); - else if (connected) - vshError(ctl, "%s", _("Reconnected to the hypervisor")); + } else { + if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect, + NULL, NULL) < 0) + vshError(ctl, "%s", _("Unable to register disconnect callback")); + if (connected) + vshError(ctl, "%s", _("Reconnected to the hypervisor")); + } disconnected = 0; ctl->useGetInfo = false; ctl->useSnapshotOld = false; @@ -2458,9 +2448,6 @@ vshInit(vshControl *ctl) /* set up the library error handler */ virSetErrorFunc(NULL, virshErrorHandler); - /* set up the signals handlers to catch disconnections */ - vshSetupSignals(); - if (virEventRegisterDefaultImpl() < 0) return false; -- GitLab