* Copyright (c) 1981, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)tstp.c 8.2 (Berkeley) 1/2/94";
__stop_signal_handler(signo
)
/* Get the current terminal state (which the user may have changed). */
if (tcgetattr(STDIN_FILENO
, &save
))
* Block window change and timer signals. The latter is because
* applications use timers to decide when to repaint the screen.
(void)sigaddset(&set
, SIGALRM
);
(void)sigaddset(&set
, SIGWINCH
);
(void)sigprocmask(SIG_BLOCK
, &set
, &oset
);
* End the window, which also resets the terminal state to the
(void)sigaddset(&set
, SIGTSTP
);
(void)sigprocmask(SIG_UNBLOCK
, &set
, NULL
);
/* Reset the curses SIGTSTP signal handler. */
/* save the new "default" terminal state */
(void)tcgetattr(STDIN_FILENO
, &__orig_termios
);
/* Reset the terminal state to the mode just before we stopped. */
(void)tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, &save
);
/* Restart the screen. */
/* Repaint the screen. */
(void)sigprocmask(SIG_SETMASK
, &oset
, NULL
);
static void (*otstpfn
)() = SIG_DFL
;
otstpfn
= signal(SIGTSTP
, __stop_signal_handler
);
* Restore the TSTP handler.
(void)signal(SIGTSTP
, otstpfn
);
void tstp() { __stop_signal_handler(SIGTSTP
); }