1/* sig.h -- header file for signal handler definitions. */ 2 3/* Copyright (C) 1994-2006 Free Software Foundation, Inc. 4 5 This file is part of GNU Bash, the Bourne Again SHell. 6 7 Bash is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 2, or (at your option) any later 10 version. 11 12 Bash is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License along 18 with Bash; see the file COPYING. If not, write to the Free Software 19 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ 20 21/* Make sure that this is included *after* config.h! */ 22#include <signal.h> 23#if !defined (_SIG_H_) 24# define _SIG_H_ 25 26#include "stdc.h" 27 28#if !defined (SIGABRT) && defined (SIGIOT) 29# define SIGABRT SIGIOT 30#endif 31 32#define sighandler RETSIGTYPE 33typedef RETSIGTYPE SigHandler __P((int)); 34 35#if defined (VOID_SIGHANDLER) 36# define SIGRETURN(n) return 37#else 38# define SIGRETURN(n) return(n) 39#endif /* !VOID_SIGHANDLER */ 40 41/* Here is a definition for set_signal_handler () which simply expands to 42 a call to signal () for non-Posix systems. The code for set_signal_handler 43 in the Posix case resides in general.c. */ 44#if !defined (HAVE_POSIX_SIGNALS) 45# define set_signal_handler(sig, handler) (SigHandler *)signal (sig, handler) 46#else 47extern SigHandler *set_signal_handler __P((int, SigHandler *)); /* in sig.c */ 48#endif /* _POSIX_VERSION */ 49 50/* Definitions used by the job control code. */ 51#if defined (JOB_CONTROL) 52 53#if !defined (SIGCHLD) && defined (SIGCLD) 54# define SIGCHLD SIGCLD 55#endif 56 57#if !defined (HAVE_POSIX_SIGNALS) && !defined (sigmask) 58# define sigmask(x) (1 << ((x)-1)) 59#endif /* !HAVE_POSIX_SIGNALS && !sigmask */ 60 61#if !defined (HAVE_POSIX_SIGNALS) 62# if !defined (SIG_BLOCK) 63# define SIG_BLOCK 2 64# define SIG_SETMASK 3 65# endif /* SIG_BLOCK */ 66 67/* sigset_t defined in config.h */ 68 69/* Make sure there is nothing inside the signal set. */ 70# define sigemptyset(set) (*(set) = 0) 71 72/* Initialize the signal set to hold all signals. */ 73# define sigfillset(set) (*set) = sigmask (NSIG) - 1 74 75/* Add SIG to the contents of SET. */ 76# define sigaddset(set, sig) *(set) |= sigmask (sig) 77 78/* Delete SIG from signal set SET. */ 79# define sigdelset(set, sig) *(set) &= ~sigmask (sig) 80 81/* Is SIG a member of the signal set SET? */ 82# define sigismember(set, sig) ((*(set) & sigmask (sig)) != 0) 83 84/* Suspend the process until the reception of one of the signals 85 not present in SET. */ 86# define sigsuspend(set) sigpause (*(set)) 87#endif /* !HAVE_POSIX_SIGNALS */ 88 89/* These definitions are used both in POSIX and non-POSIX implementations. */ 90 91#define BLOCK_SIGNAL(sig, nvar, ovar) \ 92do { \ 93 sigemptyset (&nvar); \ 94 sigaddset (&nvar, sig); \ 95 sigemptyset (&ovar); \ 96 sigprocmask (SIG_BLOCK, &nvar, &ovar); \ 97} while (0) 98 99#if defined (HAVE_POSIX_SIGNALS) 100# define BLOCK_CHILD(nvar, ovar) \ 101 BLOCK_SIGNAL (SIGCHLD, nvar, ovar) 102# define UNBLOCK_CHILD(ovar) \ 103 sigprocmask (SIG_SETMASK, &ovar, (sigset_t *) NULL) 104#else /* !HAVE_POSIX_SIGNALS */ 105# define BLOCK_CHILD(nvar, ovar) ovar = sigblock (sigmask (SIGCHLD)) 106# define UNBLOCK_CHILD(ovar) sigsetmask (ovar) 107#endif /* !HAVE_POSIX_SIGNALS */ 108 109#endif /* JOB_CONTROL */ 110 111/* Extern variables */ 112extern volatile int sigwinch_received; 113 114extern int interrupt_immediately; 115extern int terminate_immediately; 116 117/* Functions from sig.c. */ 118extern sighandler termsig_sighandler __P((int)); 119extern void termsig_handler __P((int)); 120extern sighandler sigint_sighandler __P((int)); 121extern void initialize_signals __P((int)); 122extern void initialize_terminating_signals __P((void)); 123extern void reset_terminating_signals __P((void)); 124extern void top_level_cleanup __P((void)); 125extern void throw_to_top_level __P((void)); 126extern void jump_to_top_level __P((int)) __attribute__((__noreturn__)); 127 128extern sighandler sigwinch_sighandler __P((int)); 129extern void set_sigwinch_handler __P((void)); 130extern void unset_sigwinch_handler __P((void)); 131 132/* Functions defined in trap.c. */ 133extern SigHandler *set_sigint_handler __P((void)); 134extern SigHandler *trap_to_sighandler __P((int)); 135extern sighandler trap_handler __P((int)); 136 137#endif /* _SIG_H_ */ 138