1*9ccc37e3SMark Peek /* $Header: /p/tcsh/cvsroot/tcsh/tc.sig.c,v 3.40 2012/01/25 15:34:41 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 35*9ccc37e3SMark Peek RCSID("$tcsh: tc.sig.c,v 3.40 2012/01/25 15:34:41 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; */ 63*9ccc37e3SMark Peek int handle_interrupt; /* = 0; */ 6445e5710bSMark Peek 65*9ccc37e3SMark Peek int 6645e5710bSMark Peek handle_pending_signals(void) 67c80476e4SDavid E. O'Brien { 68*9ccc37e3SMark Peek int rv = 0; 6945e5710bSMark Peek if (!phup_disabled && phup_pending) { 7045e5710bSMark Peek phup_pending = 0; 71*9ccc37e3SMark Peek handle_interrupt++; 7245e5710bSMark Peek phup(); 73*9ccc37e3SMark Peek handle_interrupt--; 7445e5710bSMark Peek } 7545e5710bSMark Peek if (!pintr_disabled && pintr_pending) { 7645e5710bSMark Peek pintr_pending = 0; 77*9ccc37e3SMark Peek handle_interrupt++; 7845e5710bSMark Peek pintr(); 79*9ccc37e3SMark Peek handle_interrupt--; 80*9ccc37e3SMark Peek rv = 1; 8145e5710bSMark Peek } 8245e5710bSMark Peek if (!pchild_disabled && pchild_pending) { 8345e5710bSMark Peek pchild_pending = 0; 84*9ccc37e3SMark Peek handle_interrupt++; 8545e5710bSMark Peek pchild(); 86*9ccc37e3SMark Peek handle_interrupt--; 8745e5710bSMark Peek } 8845e5710bSMark Peek if (!alrmcatch_disabled && alrmcatch_pending) { 8945e5710bSMark Peek alrmcatch_pending = 0; 90*9ccc37e3SMark Peek handle_interrupt++; 9145e5710bSMark Peek alrmcatch(); 92*9ccc37e3SMark Peek handle_interrupt--; 9345e5710bSMark Peek } 94*9ccc37e3SMark Peek return rv; 95c80476e4SDavid E. O'Brien } 96c80476e4SDavid E. O'Brien 9745e5710bSMark Peek void 9845e5710bSMark Peek queue_alrmcatch(int sig) 99c80476e4SDavid E. O'Brien { 10045e5710bSMark Peek USE(sig); 10145e5710bSMark Peek alrmcatch_pending = 1; 102c80476e4SDavid E. O'Brien } 10345e5710bSMark Peek 10445e5710bSMark Peek void 10545e5710bSMark Peek queue_pchild(int sig) 10645e5710bSMark Peek { 10745e5710bSMark Peek USE(sig); 10845e5710bSMark Peek pchild_pending = 1; 10945e5710bSMark Peek } 11045e5710bSMark Peek 11145e5710bSMark Peek void 11245e5710bSMark Peek queue_phup(int sig) 11345e5710bSMark Peek { 11445e5710bSMark Peek USE(sig); 11545e5710bSMark Peek phup_pending = 1; 11645e5710bSMark Peek } 11745e5710bSMark Peek 11845e5710bSMark Peek void 11945e5710bSMark Peek queue_pintr(int sig) 12045e5710bSMark Peek { 12145e5710bSMark Peek USE(sig); 12245e5710bSMark Peek pintr_pending = 1; 12345e5710bSMark Peek } 12445e5710bSMark Peek 12545e5710bSMark Peek void 12645e5710bSMark Peek disabled_cleanup(void *xdisabled) 12745e5710bSMark Peek { 12845e5710bSMark Peek int *disabled; 12945e5710bSMark Peek 13045e5710bSMark Peek disabled = xdisabled; 13145e5710bSMark Peek if (--*disabled == 0) 13245e5710bSMark Peek handle_pending_signals(); 13345e5710bSMark Peek } 13445e5710bSMark Peek 13545e5710bSMark Peek void 13645e5710bSMark Peek pintr_disabled_restore(void *xold) 13745e5710bSMark Peek { 13845e5710bSMark Peek int *old; 13945e5710bSMark Peek 14045e5710bSMark Peek old = xold; 14145e5710bSMark Peek pintr_disabled = *old; 14245e5710bSMark Peek } 14345e5710bSMark Peek 14445e5710bSMark Peek void 14545e5710bSMark Peek pintr_push_enable(int *saved) 14645e5710bSMark Peek { 14745e5710bSMark Peek *saved = pintr_disabled; 14845e5710bSMark Peek pintr_disabled = 0; 14945e5710bSMark Peek cleanup_push(saved, pintr_disabled_restore); 15045e5710bSMark Peek handle_pending_signals(); 15145e5710bSMark Peek } 152