From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anton Vorontsov Subject: [PATCH] kvm tools: Fix broken terminal when kvm exits because of a signal Date: Fri, 17 Jun 2011 20:10:46 +0400 Message-ID: <20110617161046.GA13705@oksana.dev.rtsoft.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org To: Pekka Enberg Return-path: Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org Issuing 'killall kvm' leaves the terminal on which kvm was running in a broken state. This is because atexit(3) handlers are not called if a process terminates because of a signal. Installing a proper handler for the TERM signal fixes the issue. p.s. The rest of the kvm tools use signal(2), and not sigaction(2), so I continue the tradition. Signed-off-by: Anton Vorontsov --- tools/kvm/term.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/tools/kvm/term.c b/tools/kvm/term.c index 689d52d..9947223 100644 --- a/tools/kvm/term.c +++ b/tools/kvm/term.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "kvm/read-write.h" #include "kvm/term.h" @@ -102,6 +103,13 @@ static void term_cleanup(void) tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); } +static void term_sig_cleanup(int sig) +{ + term_cleanup(); + signal(sig, SIG_DFL); + raise(sig); +} + void term_init(void) { struct termios term; @@ -113,5 +121,6 @@ void term_init(void) term.c_lflag &= ~(ICANON | ECHO | ISIG); tcsetattr(STDIN_FILENO, TCSANOW, &term); + signal(SIGTERM, term_sig_cleanup); atexit(term_cleanup); } -- 1.7.5.3