1 /* $NetBSD: signal.c,v 1.5 2003/10/13 14:34:25 agc Exp $ */
4 * Copyright (c) 1988 Mark Nudelman
5 * Copyright (c) 1988, 1993
6 * The Regents of the University of California. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 #include <sys/cdefs.h>
36 static char sccsid
[] = "@(#)signal.c 8.1 (Berkeley) 6/6/93";
38 __RCSID("$NetBSD: signal.c,v 1.5 2003/10/13 14:34:25 agc Exp $");
43 * Routines dealing with signals.
45 * A signal usually merely causes a bit to be set in the "signals" word.
46 * At some convenient time, the mainline code checks to see if any
47 * signals need processing by calling psignal().
48 * If we happen to be reading from a file [in iread()] at the time
49 * the signal is received, we call intread to interrupt the iread.
59 * "sigs" contains bits indicating signals which need to be processed.
66 #if defined(SIGWINCH) || defined(SIGWIND)
71 static void purgeandquit
__P((int));
74 static void stop
__P((int));
76 * "Stop" (^Z) signal handler.
82 (void)signal(SIGTSTP
, stop
);
91 * "Window" change handler
97 (void)signal(SIGWINCH
, winch
);
105 * "Window" change handler
109 (void)signal(SIGWIND
, winch
);
122 purge(); /* purge buffered output */
127 * Set up the signal handlers.
136 * Set signal handlers.
138 (void)signal(SIGINT
, purgeandquit
);
140 (void)signal(SIGTSTP
, stop
);
143 (void)signal(SIGWINCH
, winch
);
146 (void)signal(SIGWIND
, winch
);
152 * Restore signals to defaults.
154 (void)signal(SIGINT
, SIG_DFL
);
156 (void)signal(SIGTSTP
, SIG_DFL
);
159 (void)signal(SIGWINCH
, SIG_IGN
);
162 (void)signal(SIGWIND
, SIG_IGN
);
168 * Process any signals we have received.
169 * A received signal cause a bit to be set in "sigs".
176 if ((tsignals
= sigs
) == 0)
181 if (tsignals
& S_WINCH
)
183 int old_width
, old_height
;
185 * Re-execute get_term() to read the new window size.
187 old_width
= sc_width
;
188 old_height
= sc_height
;
190 if (sc_width
!= old_width
|| sc_height
!= old_height
)
192 scroll_lines
= (sc_height
+ 1) / 2;
198 if (tsignals
& S_STOP
)
201 * Clean up the terminal.
204 (void)signal(SIGTTOU
, SIG_IGN
);
212 (void)signal(SIGTTOU
, SIG_DFL
);
214 (void)signal(SIGTSTP
, SIG_DFL
);
215 (void)kill(getpid(), SIGTSTP
);
218 * Hopefully we'll be back later and resume here...
219 * Reset the terminal and arrange to repaint the
220 * screen when we get back to the main command loop.
222 (void)signal(SIGTSTP
, stop
);