1 | /* sig.h -- header file for signal handler definitions. */
|
---|
2 |
|
---|
3 | /* Copyright (C) 1994-2005 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 |
|
---|
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
|
---|
33 | typedef 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
|
---|
47 | extern 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) \
|
---|
92 | do { \
|
---|
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 */
|
---|
112 | extern volatile int sigwinch_received;
|
---|
113 |
|
---|
114 | /* Functions from sig.c. */
|
---|
115 | extern sighandler termination_unwind_protect __P((int));
|
---|
116 | extern sighandler sigint_sighandler __P((int));
|
---|
117 | extern void initialize_signals __P((int));
|
---|
118 | extern void initialize_terminating_signals __P((void));
|
---|
119 | extern void reset_terminating_signals __P((void));
|
---|
120 | extern void throw_to_top_level __P((void));
|
---|
121 | extern void jump_to_top_level __P((int)) __attribute__((__noreturn__));
|
---|
122 |
|
---|
123 | extern sighandler sigwinch_sighandler __P((int));
|
---|
124 | extern void set_sigwinch_handler __P((void));
|
---|
125 | extern void unset_sigwinch_handler __P((void));
|
---|
126 |
|
---|
127 | /* Functions defined in trap.c. */
|
---|
128 | extern SigHandler *set_sigint_handler __P((void));
|
---|
129 | extern SigHandler *trap_to_sighandler __P((int));
|
---|
130 | extern sighandler trap_handler __P((int));
|
---|
131 |
|
---|
132 | #endif /* _SIG_H_ */
|
---|