X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftty%2Flib_tstp.c;h=06c8411caa4d2a2891b63c3febc79b6d0d5e6ba9;hp=4c9f9fbaf1b763a9dce16e64d684f07a2c4ec719;hb=76af49c338ca828b39306fcf93c6d49dfaf11dfc;hpb=027ae42953e3186daed8f3882da73de48291b606 diff --git a/ncurses/tty/lib_tstp.c b/ncurses/tty/lib_tstp.c index 4c9f9fba..06c8411c 100644 --- a/ncurses/tty/lib_tstp.c +++ b/ncurses/tty/lib_tstp.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2002,2006 Free Software Foundation, Inc. * + * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -46,7 +46,7 @@ #define _POSIX_SOURCE #endif -MODULE_ID("$Id: lib_tstp.c,v 1.32 2006/04/01 19:31:34 tom Exp $") +MODULE_ID("$Id: lib_tstp.c,v 1.37 2008/05/03 16:24:56 tom Exp $") #if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC) #define USE_SIGTSTP 1 @@ -234,14 +234,12 @@ tstp(int dummy GCC_UNUSED) static void cleanup(int sig) { - static int nested; - /* * Actually, doing any sort of I/O from within an signal handler is * "unsafe". But we'll _try_ to clean up the screen and terminal * settings on the way out. */ - if (!nested++ + if (!_nc_globals.cleanup_nested++ && (sig == SIGINT || sig == SIGQUIT)) { #if HAVE_SIGACTION || HAVE_SIGVEC @@ -254,19 +252,17 @@ cleanup(int sig) if (signal(sig, SIG_IGN) != SIG_ERR) #endif { - SCREEN *scan = _nc_screen_chain; - while (scan) { - if (SP != 0 - && SP->_ofp != 0 - && isatty(fileno(SP->_ofp))) { - SP->_cleanup = TRUE; - SP->_outch = _nc_outch; + SCREEN *scan; + for (each_screen(scan)) { + if (scan->_ofp != 0 + && isatty(fileno(scan->_ofp))) { + scan->_cleanup = TRUE; + scan->_outch = _nc_outch; } set_term(scan); endwin(); if (SP) SP->_endwin = FALSE; /* in case we have an atexit! */ - scan = scan->_next_screen; } } } @@ -277,7 +273,7 @@ cleanup(int sig) static void sigwinch(int sig GCC_UNUSED) { - _nc_handle_sigwinch(-1); + _nc_globals.have_sigwinch = 1; } #endif /* USE_SIGWINCH */ @@ -351,29 +347,27 @@ CatchIfDefault(int sig, RETSIGTYPE (*handler) (int)) NCURSES_EXPORT(void) _nc_signal_handler(bool enable) { - static bool initialized = FALSE; - T((T_CALLED("_nc_signal_handler(%d)"), enable)); #if USE_SIGTSTP /* Xenix 2.x doesn't have SIGTSTP, for example */ { static bool ignore_tstp = FALSE; if (!ignore_tstp) { - static sigaction_t act, oact; + static sigaction_t new_sigaction, old_sigaction; if (!enable) { - act.sa_handler = SIG_IGN; - sigaction(SIGTSTP, &act, &oact); - } else if (act.sa_handler != SIG_DFL) { - sigaction(SIGTSTP, &oact, NULL); - } else if (sigaction(SIGTSTP, NULL, &oact) == 0 - && (oact.sa_handler == SIG_DFL)) { - sigemptyset(&act.sa_mask); + new_sigaction.sa_handler = SIG_IGN; + sigaction(SIGTSTP, &new_sigaction, &old_sigaction); + } else if (new_sigaction.sa_handler != SIG_DFL) { + sigaction(SIGTSTP, &old_sigaction, NULL); + } else if (sigaction(SIGTSTP, NULL, &old_sigaction) == 0 + && (old_sigaction.sa_handler == SIG_DFL)) { + sigemptyset(&new_sigaction.sa_mask); #ifdef SA_RESTART - act.sa_flags |= SA_RESTART; + new_sigaction.sa_flags |= SA_RESTART; #endif /* SA_RESTART */ - act.sa_handler = tstp; - (void) sigaction(SIGTSTP, &act, NULL); + new_sigaction.sa_handler = tstp; + (void) sigaction(SIGTSTP, &new_sigaction, NULL); } else { ignore_tstp = TRUE; } @@ -381,14 +375,14 @@ _nc_signal_handler(bool enable) } #endif /* !USE_SIGTSTP */ - if (!initialized) { + if (!_nc_globals.init_signals) { if (enable) { CatchIfDefault(SIGINT, cleanup); CatchIfDefault(SIGTERM, cleanup); #if USE_SIGWINCH CatchIfDefault(SIGWINCH, sigwinch); #endif - initialized = TRUE; + _nc_globals.init_signals = TRUE; } } returnVoid;