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