Home | History | Annotate | Line # | Download | only in sys
      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_ */
    343