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&LTOSTOP) */
 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_ */