PageRenderTime 11ms CodeModel.GetById 1ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/tcsh/tc.sig.c

https://bitbucket.org/freebsd/freebsd-head/
C | 151 lines | 104 code | 15 blank | 32 comment | 12 complexity | a6fae47b769967acc173389166d6bc48 MD5 | raw file
  1/* $Header: /p/tcsh/cvsroot/tcsh/tc.sig.c,v 3.40 2012/01/25 15:34:41 christos Exp $ */
  2/*
  3 * tc.sig.c: Signal routine emulations
  4 */
  5/*-
  6 * Copyright (c) 1980, 1991 The Regents of the University of California.
  7 * All rights reserved.
  8 *
  9 * Redistribution and use in source and binary forms, with or without
 10 * modification, are permitted provided that the following conditions
 11 * are met:
 12 * 1. Redistributions of source code must retain the above copyright
 13 *    notice, this list of conditions and the following disclaimer.
 14 * 2. Redistributions in binary form must reproduce the above copyright
 15 *    notice, this list of conditions and the following disclaimer in the
 16 *    documentation and/or other materials provided with the distribution.
 17 * 3. Neither the name of the University nor the names of its contributors
 18 *    may be used to endorse or promote products derived from this software
 19 *    without specific prior written permission.
 20 *
 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 31 * SUCH DAMAGE.
 32 */
 33#include "sh.h"
 34
 35RCSID("$tcsh: tc.sig.c,v 3.40 2012/01/25 15:34:41 christos Exp $")
 36
 37#include "tc.wait.h"
 38
 39void
 40sigset_interrupting(int sig, void (*fn) (int))
 41{
 42    struct sigaction act;
 43
 44    act.sa_handler = fn;
 45    sigemptyset(&act.sa_mask);
 46    act.sa_flags = 0;
 47    if (sigaction(sig, &act, NULL) == 0) {
 48	sigset_t set;
 49	sigemptyset(&set);
 50	sigaddset(&set, sig);
 51	sigprocmask(SIG_UNBLOCK, &set, NULL);
 52    }
 53}
 54
 55static volatile sig_atomic_t alrmcatch_pending; /* = 0; */
 56static volatile sig_atomic_t pchild_pending; /* = 0; */
 57static volatile sig_atomic_t phup_pending; /* = 0; */
 58static volatile sig_atomic_t pintr_pending; /* = 0; */
 59int alrmcatch_disabled; /* = 0; */
 60int phup_disabled; /* = 0; */
 61int pchild_disabled; /* = 0; */
 62int pintr_disabled; /* = 0; */
 63int handle_interrupt; /* = 0; */
 64
 65int
 66handle_pending_signals(void)
 67{
 68    int rv = 0;
 69    if (!phup_disabled && phup_pending) {
 70	phup_pending = 0;
 71	handle_interrupt++;
 72	phup();
 73	handle_interrupt--;
 74    }
 75    if (!pintr_disabled && pintr_pending) {
 76	pintr_pending = 0;
 77	handle_interrupt++;
 78	pintr();
 79	handle_interrupt--;
 80	rv = 1;
 81    }
 82    if (!pchild_disabled && pchild_pending) {
 83	pchild_pending = 0;
 84	handle_interrupt++;
 85	pchild();
 86	handle_interrupt--;
 87    }
 88    if (!alrmcatch_disabled && alrmcatch_pending) {
 89	alrmcatch_pending = 0;
 90	handle_interrupt++;
 91	alrmcatch();
 92	handle_interrupt--;
 93    }
 94    return rv;
 95}
 96
 97void
 98queue_alrmcatch(int sig)
 99{
100    USE(sig);
101    alrmcatch_pending = 1;
102}
103
104void
105queue_pchild(int sig)
106{
107    USE(sig);
108    pchild_pending = 1;
109}
110
111void
112queue_phup(int sig)
113{
114    USE(sig);
115    phup_pending = 1;
116}
117
118void
119queue_pintr(int sig)
120{
121    USE(sig);
122    pintr_pending = 1;
123}
124
125void
126disabled_cleanup(void *xdisabled)
127{
128    int *disabled;
129
130    disabled = xdisabled;
131    if (--*disabled == 0)
132	handle_pending_signals();
133}
134
135void
136pintr_disabled_restore(void *xold)
137{
138    int *old;
139
140    old = xold;
141    pintr_disabled = *old;
142}
143
144void
145pintr_push_enable(int *saved)
146{
147    *saved = pintr_disabled;
148    pintr_disabled = 0;
149    cleanup_push(saved, pintr_disabled_restore);
150    handle_pending_signals();
151}