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