| 1 | /*	$NetBSD: signal.h,v 1.78 2024/09/19 14:41:05 kre 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 | */ |
| 123 | struct	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) |
| 247 | typedef	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 | */ |
| 277 | struct	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) |
| 297 | struct	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 |
| 320 | void	(*signal(int, void (*)(int)))(int); |
| 321 | #if (_POSIX_C_SOURCE - 0) >= 200112L || defined(_NETBSD_SOURCE) |
| 322 | int	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 | */ |
| 336 | void	(*bsd_signal(int, void (*)(int)))(int); |
| 337 | #endif |
| 338 | #if defined(_NETBSD_SOURCE) |
| 339 | int	sigqueueinfo(pid_t, const siginfo_t *); |
| 340 | #endif |
| 341 | __END_DECLS |
| 342 | #endif	/* !_SYS_SIGNAL_H_ */ |