tc.sig.h revision 195609
198524Sfenner/* $Header: /p/tcsh/cvsroot/tcsh/tc.sig.h,v 3.33 2007/07/05 14:13:06 christos Exp $ */
298524Sfenner/*
398524Sfenner * tc.sig.h: Signal handling
498524Sfenner *
598524Sfenner */
698524Sfenner/*-
798524Sfenner * Copyright (c) 1980, 1991 The Regents of the University of California.
898524Sfenner * All rights reserved.
998524Sfenner *
1098524Sfenner * Redistribution and use in source and binary forms, with or without
1198524Sfenner * modification, are permitted provided that the following conditions
1298524Sfenner * are met:
1398524Sfenner * 1. Redistributions of source code must retain the above copyright
1498524Sfenner *    notice, this list of conditions and the following disclaimer.
1598524Sfenner * 2. Redistributions in binary form must reproduce the above copyright
1698524Sfenner *    notice, this list of conditions and the following disclaimer in the
1798524Sfenner *    documentation and/or other materials provided with the distribution.
1898524Sfenner * 3. Neither the name of the University nor the names of its contributors
1998524Sfenner *    may be used to endorse or promote products derived from this software
2098524Sfenner *    without specific prior written permission.
2198524Sfenner *
2298524Sfenner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2398524Sfenner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2498524Sfenner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2598524Sfenner * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2698524Sfenner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2798524Sfenner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2898524Sfenner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2998524Sfenner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3098524Sfenner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31127668Sbms * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32190207Srpaulo * SUCH DAMAGE.
3398524Sfenner */
3498524Sfenner#ifndef _h_tc_sig
3598524Sfenner#define _h_tc_sig
3698524Sfenner
3798524Sfenner#if (SYSVREL > 0) || defined(BSD4_4) || defined(_MINIX) || defined(DGUX) || defined(WINNT_NATIVE) || defined(__QNXNTO__)
3898524Sfenner# include <signal.h>
39127668Sbms# ifndef SIGCHLD
4098524Sfenner#  define SIGCHLD SIGCLD
4198524Sfenner# endif /* SIGCHLD */
4298524Sfenner#else /* SYSVREL == 0 */
4398524Sfenner# include <sys/signal.h>
4498524Sfenner#endif /* SYSVREL > 0 */
4598524Sfenner
4698524Sfenner#if defined(__APPLE__) || defined(SUNOS4) || defined(DGUX) || defined(hp800) || (SYSVREL > 3 && defined(VFORK))
4798524Sfenner# define SAVESIGVEC
4898524Sfenner#endif /* SUNOS4 || DGUX || hp800 || SVR4 & VFORK */
4998524Sfenner
5098524Sfenner#if SYSVREL > 0
5198524Sfenner# ifdef BSDJOBS
5298524Sfenner/* here I assume that systems that have bsdjobs implement the
5398524Sfenner * the setpgrp call correctly. Otherwise defining this would
5498524Sfenner * work, but it would kill the world, because all the setpgrp
5598524Sfenner * code is the the part defined when BSDJOBS are defined
5698524Sfenner * NOTE: we don't want killpg(a, b) == kill(-getpgrp(a), b)
5798524Sfenner * cause process a might be already dead and getpgrp would fail
5898524Sfenner */
5998524Sfenner#  define killpg(a, b) kill(-(a), (b))
6098524Sfenner# else
6198524Sfenner/* this is the poor man's version of killpg()! Just kill the
6298524Sfenner * current process and don't worry about the rest. Someday
6398524Sfenner * I hope I get to fix that.
6498524Sfenner */
6598524Sfenner#  define killpg(a, b) kill((a), (b))
6698524Sfenner# endif /* BSDJOBS */
6798524Sfenner#endif /* SYSVREL > 0 */
6898524Sfenner
6998524Sfenner#ifdef _MINIX
7098524Sfenner# include <signal.h>
7198524Sfenner# define killpg(a, b) kill((a), (b))
7298524Sfenner# ifdef _MINIX_VMD
7398524Sfenner#  define signal(a, b) signal((a), (a) == SIGCHLD ? SIG_IGN : (b))
7498524Sfenner# endif /* _MINIX_VMD */
7598524Sfenner#endif /* _MINIX */
7698524Sfenner
7798524Sfenner#ifdef _VMS_POSIX
7898524Sfenner# define killpg(a, b) kill(-(a), (b))
7998524Sfenner#endif /* atp _VMS_POSIX */
8098524Sfenner
8198524Sfenner#ifdef aiws
8298524Sfenner# undef	killpg
8398524Sfenner# define 	killpg(a, b)	kill(-getpgrp(a), b)
8498524Sfenner#endif /* aiws */
8598524Sfenner
8698524Sfenner#if !defined(NSIG) && defined(SIGMAX)
8798524Sfenner# define NSIG (SIGMAX+1)
8898524Sfenner#endif /* !NSIG && SIGMAX */
8998524Sfenner#if !defined(NSIG) && defined(_SIG_MAX)
9098524Sfenner# define NSIG (_SIG_MAX+1)
9198524Sfenner#endif /* !NSIG && _SIG_MAX */
9298524Sfenner#if !defined(NSIG) && defined(_NSIG)
9398524Sfenner# define NSIG _NSIG
9498524Sfenner#endif /* !NSIG && _NSIG */
9598524Sfenner#if !defined(NSIG)
9698524Sfenner#define NSIG (sizeof(sigset_t) * 8)
9798524Sfenner#endif /* !NSIG */
9898524Sfenner#if !defined(MAXSIG) && defined(NSIG)
9998524Sfenner# define MAXSIG NSIG
10098524Sfenner#endif /* !MAXSIG && NSIG */
10198524Sfenner
10298524Sfenner/*
10398524Sfenner * We choose a define for the window signal if it exists..
10498524Sfenner */
10598524Sfenner#ifdef SIGWINCH
10698524Sfenner# define SIG_WINDOW SIGWINCH
10798524Sfenner#else
10898524Sfenner# ifdef SIGWINDOW
10998524Sfenner#  define SIG_WINDOW SIGWINDOW
11098524Sfenner# endif /* SIGWINDOW */
11198524Sfenner#endif /* SIGWINCH */
11298524Sfenner
11398524Sfenner#ifdef SAVESIGVEC
11498524Sfenner# define NSIGSAVED 7
11598524Sfenner /*
11698524Sfenner  * These are not inline for speed. gcc -traditional -O on the sparc ignores
11798524Sfenner  * the fact that vfork() corrupts the registers. Calling a routine is not
11898524Sfenner  * nice, since it can make the compiler put some things that we want saved
11998524Sfenner  * into registers 				- christos
12098524Sfenner  */
12198524Sfenner# define savesigvec(sv, sm)			\
12298524Sfenner    do {					\
12398524Sfenner	sigset_t m__;				\
12498524Sfenner						\
12598524Sfenner	sigaction(SIGINT,  NULL, &(sv)[0]);	\
12698524Sfenner	sigaction(SIGQUIT, NULL, &(sv)[1]);	\
12798524Sfenner	sigaction(SIGTSTP, NULL, &(sv)[2]);	\
12898524Sfenner	sigaction(SIGTTIN, NULL, &(sv)[3]);	\
12998524Sfenner	sigaction(SIGTTOU, NULL, &(sv)[4]);	\
13098524Sfenner	sigaction(SIGTERM, NULL, &(sv)[5]);	\
13198524Sfenner	sigaction(SIGHUP,  NULL, &(sv)[6]);	\
13298524Sfenner	sigemptyset(&m__);			\
13398524Sfenner	sigaddset(&m__, SIGINT);		\
13498524Sfenner	sigaddset(&m__, SIGQUIT);		\
13598524Sfenner	sigaddset(&m__, SIGTSTP);		\
13698524Sfenner	sigaddset(&m__, SIGTTIN);		\
13798524Sfenner	sigaddset(&m__, SIGTTOU);		\
13898524Sfenner	sigaddset(&m__, SIGTERM);		\
13998524Sfenner	sigaddset(&m__, SIGHUP);		\
14098524Sfenner	sigprocmask(SIG_BLOCK, &m__, &sm);	\
14198524Sfenner    } while (0)
14298524Sfenner
14398524Sfenner# define restoresigvec(sv, sm)			\
14498524Sfenner    do {					\
14598524Sfenner	sigaction(SIGINT,  &(sv)[0], NULL);	\
14698524Sfenner	sigaction(SIGQUIT, &(sv)[1], NULL);	\
14798524Sfenner	sigaction(SIGTSTP, &(sv)[2], NULL);	\
14898524Sfenner	sigaction(SIGTTIN, &(sv)[3], NULL);	\
14998524Sfenner	sigaction(SIGTTOU, &(sv)[4], NULL);	\
15098524Sfenner	sigaction(SIGTERM, &(sv)[5], NULL);	\
15198524Sfenner	sigaction(SIGHUP,  &(sv)[6], NULL);	\
15298524Sfenner	sigprocmask(SIG_SETMASK, &sm, NULL);	\
15398524Sfenner    } while (0)
15498524Sfenner# endif /* SAVESIGVEC */
15598524Sfenner
15698524Sfennerextern int alrmcatch_disabled;
15798524Sfennerextern int pchild_disabled;
15898524Sfennerextern int phup_disabled;
15998524Sfennerextern int pintr_disabled;
16098524Sfenner
16198524Sfennerextern void sigset_interrupting(int, void (*) (int));
16298524Sfennerextern void handle_pending_signals(void);
16398524Sfenner
16498524Sfennerextern void queue_alrmcatch(int);
16598524Sfennerextern void queue_pchild(int);
16698524Sfennerextern void queue_phup(int);
16798524Sfennerextern void queue_pintr(int);
16898524Sfenner
16998524Sfennerextern void disabled_cleanup(void *);
17098524Sfennerextern void pintr_disabled_restore(void *);
17198524Sfennerextern void pintr_push_enable(int *);
17298524Sfenner
17398524Sfenner#endif /* _h_tc_sig */
17498524Sfenner