master
1/* $NetBSD: signal.h,v 1.75.4.2 2024/10/14 17:44:57 martin Exp $ */
2
3/*
4 * Copyright (c) 1982, 1986, 1989, 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 * (c) UNIX System Laboratories, Inc.
7 * All or some portions of this file are derived from material licensed
8 * to the University of California by American Telephone and Telegraph
9 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10 * the permission of UNIX System Laboratories, Inc.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)signal.h 8.4 (Berkeley) 5/4/95
37 */
38
39#ifndef _SYS_SIGNAL_H_
40#define _SYS_SIGNAL_H_
41
42#include <sys/featuretest.h>
43#include <sys/sigtypes.h>
44
45#define _NSIG 64
46
47#if defined(_NETBSD_SOURCE)
48#define NSIG _NSIG
49
50#endif /* _NETBSD_SOURCE */
51
52#define SIGHUP 1 /* hangup */
53#define SIGINT 2 /* interrupt */
54#define SIGQUIT 3 /* quit */
55#define SIGILL 4 /* illegal instruction (not reset when caught) */
56#define SIGTRAP 5 /* trace trap (not reset when caught) */
57#define SIGABRT 6 /* abort() */
58#define SIGIOT SIGABRT /* compatibility */
59#define SIGEMT 7 /* EMT instruction */
60#define SIGFPE 8 /* floating point exception */
61#define SIGKILL 9 /* kill (cannot be caught or ignored) */
62#define SIGBUS 10 /* bus error */
63#define SIGSEGV 11 /* segmentation violation */
64#define SIGSYS 12 /* bad argument to system call */
65#define SIGPIPE 13 /* write on a pipe with no one to read it */
66#define SIGALRM 14 /* alarm clock */
67#define SIGTERM 15 /* software termination signal from kill */
68#define SIGURG 16 /* urgent condition on IO channel */
69#define SIGSTOP 17 /* sendable stop signal not from tty */
70#define SIGTSTP 18 /* stop signal from tty */
71#define SIGCONT 19 /* continue a stopped process */
72#define SIGCHLD 20 /* to parent on child stop or exit */
73#define SIGTTIN 21 /* to readers pgrp upon background tty read */
74#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */
75#define SIGIO 23 /* input/output possible signal */
76#define SIGXCPU 24 /* exceeded CPU time limit */
77#define SIGXFSZ 25 /* exceeded file size limit */
78#define SIGVTALRM 26 /* virtual time alarm */
79#define SIGPROF 27 /* profiling time alarm */
80#define SIGWINCH 28 /* window size changes */
81#define SIGINFO 29 /* information request */
82#define SIGUSR1 30 /* user defined signal 1 */
83#define SIGUSR2 31 /* user defined signal 2 */
84#define SIGPWR 32 /* power fail/restart (not reset when caught) */
85#define SIGRTMIN 33
86#define SIGRTMAX 63
87
88#ifndef _KERNEL
89#include <sys/cdefs.h>
90#endif
91
92#define SIG_DFL ((void (*)(int)) 0)
93#define SIG_IGN ((void (*)(int)) 1)
94#define SIG_ERR ((void (*)(int)) -1)
95#define SIG_HOLD ((void (*)(int)) 3)
96
97#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
98 defined(_NETBSD_SOURCE)
99
100#ifdef _KERNEL
101#define sigaddset(s, n) __sigaddset(s, n)
102#define sigdelset(s, n) __sigdelset(s, n)
103#define sigismember(s, n) __sigismember(s, n)
104#define sigemptyset(s) __sigemptyset(s)
105#define sigfillset(s) __sigfillset(s)
106#define sigplusset(s, t) __sigplusset(s, t)
107#define sigminusset(s, t) __sigminusset(s, t)
108#endif /* _KERNEL */
109
110#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
111 defined(_NETBSD_SOURCE)
112#include <sys/siginfo.h>
113#endif
114
115#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
116 (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
117#include <sys/ucontext.h>
118#endif /* _XOPEN_SOURCE_EXTENDED || _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */
119
120/*
121 * Signal vector "template" used in sigaction call.
122 */
123struct sigaction {
124 union {
125 void (*_sa_handler)(int);
126#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
127 defined(_NETBSD_SOURCE)
128 void (*_sa_sigaction)(int, siginfo_t *, void *);
129#endif
130 } _sa_u; /* signal handler */
131 sigset_t sa_mask; /* signal mask to apply */
132 int sa_flags; /* see signal options below */
133};
134
135#define sa_handler _sa_u._sa_handler
136#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
137 defined(_NETBSD_SOURCE)
138#define sa_sigaction _sa_u._sa_sigaction
139#endif
140
141/*
142 * Signal return trampoline versioning:
143 *
144 * In historical BSD, the kernel provided the signal trampoline, copying
145 * it out to the process's stack. In NetBSD 2.0, the signal trampoline
146 * was moved into libc, and versioned in order to support the historical
147 * BSD "sigcontext" style of handler in addition to the modern "siginfo"
148 * style of handler. The trampoline and its ABI version are registered
149 * with the kernel along with the handlers.
150 *
151 * The versioning follows this general pattern:
152 *
153 * 0 Historical BSD style, trampoline provided by the kernel. This is
154 * now used only by COMPAT_* modules.
155 *
156 * 1 Legacy BSD "sigcontext" trampoline. This style is deprecated and
157 * no longer documented. However, on platforms that have a legacy
158 * "sigcontext" structure, it is still possible to register a handler
159 * that uses this trampoline.
160 *
161 * 2 Modern "siginfo" trampoline. This style is used if a handler
162 * explicitly requests "siginfo", or if the deprecation of "sigcontext"
163 * style handlers pre-dates support for the platform.
164 *
165 * Some architectures have, in the past, needed to version the "sigcontext"
166 * trampoline; an override mechanism is provided for this purpose. No more
167 * changes to the old "sigcontext" trampoline ABI will ever be performed,
168 * and support for it should not be included when adding support for new
169 * architectures. Those architectures that support the "sigcontext"
170 * trampoline must define __HAVE_STRUCT_SIGCONTEXT in <machine/signal.h>.
171 * If a 64-bit architecture needs to support "sigcontext" trampolines only
172 * for 32-bit compatibility, then __HAVE_STRUCT_SIGCONTEXT can be conditional
173 * on _KERNEL.
174 *
175 * If an architecture defines a sigcontext structure in <machine/signal.h>,
176 * it should be visible only for _KERNEL and _LIBC.
177 *
178 * In the unlikely event that an an architecture needs to version
179 * the "siginfo" trampoline, it can achieve this by overriding the
180 * various __SIGTRAMP_SIGINFO_VERSION-related constants.
181 */
182
183#include <machine/signal.h> /* sigcontext; codes for SIGILL, SIGFPE */
184
185#define __SIGTRAMP_SIGCODE_VERSION 0
186
187#define __SIGTRAMP_SIGCONTEXT_VERSION_MIN 1
188
189#ifndef __SIGTRAMP_SIGCONTEXT_VERSION_MAX
190#define __SIGTRAMP_SIGCONTEXT_VERSION_MAX 1
191#endif
192
193#ifndef __SIGTRAMP_SIGCONTEXT_VERSION
194#define __SIGTRAMP_SIGCONTEXT_VERSION 1
195#endif
196
197#if __SIGTRAMP_SIGCONTEXT_VERSION_MAX < __SIGTRAMP_SIGCONTEXT_VERSION_MIN
198#error invalid __SIGTRAMP_SIGCONTEXT_VERSION_MAX
199#endif
200
201#ifndef __SIGTRAMP_SIGINFO_VERSION_MIN
202#define __SIGTRAMP_SIGINFO_VERSION_MIN 2
203#endif
204
205#ifndef __SIGTRAMP_SIGINFO_VERSION_MAX
206#define __SIGTRAMP_SIGINFO_VERSION_MAX 2
207#endif
208
209#ifndef __SIGTRAMP_SIGINFO_VERSION
210#define __SIGTRAMP_SIGINFO_VERSION 2
211#endif
212
213#if __SIGTRAMP_SIGINFO_VERSION_MAX < __SIGTRAMP_SIGINFO_VERSION_MIN
214#error invalid __SIGTRAMP_SIGINFO_VERSION_MAX
215#endif
216
217#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
218 (_XOPEN_SOURCE - 0) >= 500 || (_POSIX_C_SOURCE - 0) >= 200809L || \
219 defined(_NETBSD_SOURCE)
220#define SA_ONSTACK 0x0001 /* take signal on signal stack */
221#define SA_RESTART 0x0002 /* restart system call on signal return */
222#define SA_RESETHAND 0x0004 /* reset to SIG_DFL when taking signal */
223#define SA_NODEFER 0x0010 /* don't mask the signal we're delivering */
224#endif /* _XOPEN_SOURCE_EXTENDED || _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L || _NETBSD_SOURCE */
225/* Only valid for SIGCHLD. */
226#define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */
227#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
228 defined(_NETBSD_SOURCE)
229#define SA_NOCLDWAIT 0x0020 /* do not generate zombies on unwaited child */
230#define SA_SIGINFO 0x0040 /* take sa_sigaction handler */
231#endif /* (_POSIX_C_SOURCE - 0) >= 199309L || ... */
232#if defined(_NETBSD_SOURCE)
233#define SA_NOKERNINFO 0x0080 /* siginfo does not print kernel info on tty */
234#endif /*_NETBSD_SOURCE */
235#ifdef _KERNEL
236#define SA_ALLBITS 0x00ff
237#endif
238
239/*
240 * Flags for sigprocmask():
241 */
242#define SIG_BLOCK 1 /* block specified signal set */
243#define SIG_UNBLOCK 2 /* unblock specified signal set */
244#define SIG_SETMASK 3 /* set specified signal set */
245
246#if defined(_NETBSD_SOURCE)
247typedef void (*sig_t)(int); /* type of signal function */
248
249#define SS_INIT /* Initializer for stack_t */ \
250 ((stack_t) { .ss_sp = NULL, .ss_flags = SS_DISABLE, .ss_size = 0 })
251
252#endif
253
254#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
255 (_XOPEN_SOURCE - 0) >= 500 || (_POSIX_C_SOURCE - 0) >= 200809L || \
256 defined(_NETBSD_SOURCE)
257/*
258 * Flags used with stack_t/struct sigaltstack.
259 */
260#define SS_ONSTACK 0x0001 /* take signals on alternate stack */
261#define SS_DISABLE 0x0004 /* disable taking signals on alternate stack */
262#ifdef _KERNEL
263#define SS_ALLBITS 0x0005
264#endif
265#define MINSIGSTKSZ 8192 /* minimum allowable stack */
266#define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */
267#endif /* _XOPEN_SOURCE_EXTENDED || _XOPEN_SOURCE >= 500
268 * || _POSIX_C_SOURCE >= 200809L || _NETBSD_SOURCE
269 */
270
271#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
272 (_XOPEN_SOURCE - 0) >= 500 || (_POSIX_C_SOURCE - 0) >= 200809L || \
273 defined(_NETBSD_SOURCE)
274/*
275 * Structure used in sigstack call.
276 */
277struct sigstack {
278 void *ss_sp; /* signal stack pointer */
279 int ss_onstack; /* current status */
280};
281#endif /* _XOPEN_SOURCE_EXTENDED || _XOPEN_SOURCE >= 500
282 * || _POSIX_C_SOURCE >= 200809L || _NETBSD_SOURCE
283 */
284
285#if defined(_NETBSD_SOURCE) && !defined(_KERNEL)
286/*
287 * Macro for converting signal number to a mask suitable for
288 * sigblock().
289 */
290#define sigmask(n) __sigmask(n)
291
292#define BADSIG SIG_ERR
293#endif /* _NETBSD_SOURCE */
294
295#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
296 defined(_NETBSD_SOURCE)
297struct sigevent {
298 int sigev_notify;
299 int sigev_signo;
300 union sigval sigev_value;
301 void (*sigev_notify_function)(union sigval);
302 void /* pthread_attr_t */ *sigev_notify_attributes;
303};
304
305#define SIGEV_NONE 0
306#define SIGEV_SIGNAL 1
307#define SIGEV_THREAD 2
308#if defined(_NETBSD_SOURCE)
309#define SIGEV_SA 3
310#endif
311#endif /* (_POSIX_C_SOURCE - 0) >= 199309L || ... */
312
313#endif /* _POSIX_C_SOURCE || _XOPEN_SOURCE || _NETBSD_SOURCE */
314
315/*
316 * For historical reasons; programs expect signal's return value to be
317 * defined by <sys/signal.h>.
318 */
319__BEGIN_DECLS
320void (*signal(int, void (*)(int)))(int);
321#if (_POSIX_C_SOURCE - 0) >= 200112L || defined(_NETBSD_SOURCE)
322int sigqueue(pid_t, int, const union sigval);
323#endif
324
325#if defined(_NETBSD_SOURCE) || \
326 (!defined (_XOPEN_SOURCE) && defined(_XOPEN_VERSION) && \
327 (_XOPEN_VERSION - 0) >= 4) || \
328 (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0) <= 600)
329/*
330 * bsd_signal() was added to the standards in POSIX issue 4 (SusV4)
331 * (release 2 of SusV4) and then removed in POSIX issue 7 (2008),
332 * after being marked obsolete in POSIX issue 6 (2001). It was
333 * always an X/Open extension function (though was moved to the
334 * base POSIX spec in issue 5, but still as an extension).
335 */
336void (*bsd_signal(int, void (*)(int)))(int);
337#endif
338#if defined(_NETBSD_SOURCE)
339int sigqueueinfo(pid_t, const siginfo_t *);
340#endif
341__END_DECLS
342#endif /* !_SYS_SIGNAL_H_ */