xref: /freebsd/contrib/tcsh/tc.sig.c (revision 45e5710bbb3676c9d945e9df78019b2c58930a59)
145e5710bSMark Peek /* $Header: /p/tcsh/cvsroot/tcsh/tc.sig.c,v 3.36 2006/08/24 20:56:31 christos Exp $ */
2c80476e4SDavid E. O'Brien /*
3c80476e4SDavid E. O'Brien  * tc.sig.c: Signal routine emulations
4c80476e4SDavid E. O'Brien  */
5c80476e4SDavid E. O'Brien /*-
6c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
7c80476e4SDavid E. O'Brien  * All rights reserved.
8c80476e4SDavid E. O'Brien  *
9c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
10c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
11c80476e4SDavid E. O'Brien  * are met:
12c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
13c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
14c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
15c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
16c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
1729301572SMark Peek  * 3. Neither the name of the University nor the names of its contributors
18c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
19c80476e4SDavid E. O'Brien  *    without specific prior written permission.
20c80476e4SDavid E. O'Brien  *
21c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
32c80476e4SDavid E. O'Brien  */
33c80476e4SDavid E. O'Brien #include "sh.h"
34c80476e4SDavid E. O'Brien 
3545e5710bSMark Peek RCSID("$tcsh: tc.sig.c,v 3.36 2006/08/24 20:56:31 christos Exp $")
36c80476e4SDavid E. O'Brien 
37c80476e4SDavid E. O'Brien #include "tc.wait.h"
38c80476e4SDavid E. O'Brien 
39c80476e4SDavid E. O'Brien void
4045e5710bSMark Peek sigset_interrupting(int sig, void (*fn) (int))
41c80476e4SDavid E. O'Brien {
4245e5710bSMark Peek     struct sigaction act;
43c80476e4SDavid E. O'Brien 
4445e5710bSMark Peek     act.sa_handler = fn;
4545e5710bSMark Peek     sigemptyset(&act.sa_mask);
4645e5710bSMark Peek     act.sa_flags = 0;
4745e5710bSMark Peek     if (sigaction(sig, &act, NULL) == 0) {
48c80476e4SDavid E. O'Brien 	sigset_t set;
4945e5710bSMark Peek 	sigemptyset(&set);
5045e5710bSMark Peek 	sigaddset(&set, sig);
5145e5710bSMark Peek 	sigprocmask(SIG_UNBLOCK, &set, NULL);
5245e5710bSMark Peek     }
53c80476e4SDavid E. O'Brien }
54c80476e4SDavid E. O'Brien 
5545e5710bSMark Peek static volatile sig_atomic_t alrmcatch_pending; /* = 0; */
5645e5710bSMark Peek static volatile sig_atomic_t pchild_pending; /* = 0; */
5745e5710bSMark Peek static volatile sig_atomic_t phup_pending; /* = 0; */
5845e5710bSMark Peek static volatile sig_atomic_t pintr_pending; /* = 0; */
5945e5710bSMark Peek int alrmcatch_disabled; /* = 0; */
6045e5710bSMark Peek int phup_disabled; /* = 0; */
6145e5710bSMark Peek int pchild_disabled; /* = 0; */
6245e5710bSMark Peek int pintr_disabled; /* = 0; */
6345e5710bSMark Peek 
6445e5710bSMark Peek void
6545e5710bSMark Peek handle_pending_signals(void)
66c80476e4SDavid E. O'Brien {
6745e5710bSMark Peek     if (!phup_disabled && phup_pending) {
6845e5710bSMark Peek 	phup_pending = 0;
6945e5710bSMark Peek 	phup();
7045e5710bSMark Peek     }
7145e5710bSMark Peek     if (!pintr_disabled && pintr_pending) {
7245e5710bSMark Peek 	pintr_pending = 0;
7345e5710bSMark Peek 	pintr();
7445e5710bSMark Peek     }
7545e5710bSMark Peek     if (!pchild_disabled && pchild_pending) {
7645e5710bSMark Peek 	pchild_pending = 0;
7745e5710bSMark Peek 	pchild();
7845e5710bSMark Peek     }
7945e5710bSMark Peek     if (!alrmcatch_disabled && alrmcatch_pending) {
8045e5710bSMark Peek 	alrmcatch_pending = 0;
8145e5710bSMark Peek 	alrmcatch();
8245e5710bSMark Peek     }
83c80476e4SDavid E. O'Brien }
84c80476e4SDavid E. O'Brien 
8545e5710bSMark Peek void
8645e5710bSMark Peek queue_alrmcatch(int sig)
87c80476e4SDavid E. O'Brien {
8845e5710bSMark Peek     USE(sig);
8945e5710bSMark Peek     alrmcatch_pending = 1;
90c80476e4SDavid E. O'Brien }
9145e5710bSMark Peek 
9245e5710bSMark Peek void
9345e5710bSMark Peek queue_pchild(int sig)
9445e5710bSMark Peek {
9545e5710bSMark Peek     USE(sig);
9645e5710bSMark Peek     pchild_pending = 1;
9745e5710bSMark Peek }
9845e5710bSMark Peek 
9945e5710bSMark Peek void
10045e5710bSMark Peek queue_phup(int sig)
10145e5710bSMark Peek {
10245e5710bSMark Peek     USE(sig);
10345e5710bSMark Peek     phup_pending = 1;
10445e5710bSMark Peek }
10545e5710bSMark Peek 
10645e5710bSMark Peek void
10745e5710bSMark Peek queue_pintr(int sig)
10845e5710bSMark Peek {
10945e5710bSMark Peek     USE(sig);
11045e5710bSMark Peek     pintr_pending = 1;
11145e5710bSMark Peek }
11245e5710bSMark Peek 
11345e5710bSMark Peek void
11445e5710bSMark Peek disabled_cleanup(void *xdisabled)
11545e5710bSMark Peek {
11645e5710bSMark Peek     int *disabled;
11745e5710bSMark Peek 
11845e5710bSMark Peek     disabled = xdisabled;
11945e5710bSMark Peek     if (--*disabled == 0)
12045e5710bSMark Peek 	handle_pending_signals();
12145e5710bSMark Peek }
12245e5710bSMark Peek 
12345e5710bSMark Peek void
12445e5710bSMark Peek pintr_disabled_restore(void *xold)
12545e5710bSMark Peek {
12645e5710bSMark Peek     int *old;
12745e5710bSMark Peek 
12845e5710bSMark Peek     old = xold;
12945e5710bSMark Peek     pintr_disabled = *old;
13045e5710bSMark Peek }
13145e5710bSMark Peek 
13245e5710bSMark Peek void
13345e5710bSMark Peek pintr_push_enable(int *saved)
13445e5710bSMark Peek {
13545e5710bSMark Peek     *saved = pintr_disabled;
13645e5710bSMark Peek     pintr_disabled = 0;
13745e5710bSMark Peek     cleanup_push(saved, pintr_disabled_restore);
13845e5710bSMark Peek     handle_pending_signals();
13945e5710bSMark Peek }
140