1/* 2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 29/* 30 * Copyright (c) 1982, 1986, 1989, 1991, 1993 31 * The Regents of the University of California. All rights reserved. 32 * (c) UNIX System Laboratories, Inc. 33 * All or some portions of this file are derived from material licensed 34 * to the University of California by American Telephone and Telegraph 35 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 36 * the permission of UNIX System Laboratories, Inc. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 1. Redistributions of source code must retain the above copyright 42 * notice, this list of conditions and the following disclaimer. 43 * 2. Redistributions in binary form must reproduce the above copyright 44 * notice, this list of conditions and the following disclaimer in the 45 * documentation and/or other materials provided with the distribution. 46 * 3. All advertising materials mentioning features or use of this software 47 * must display the following acknowledgement: 48 * This product includes software developed by the University of 49 * California, Berkeley and its contributors. 50 * 4. Neither the name of the University nor the names of its contributors 51 * may be used to endorse or promote products derived from this software 52 * without specific prior written permission. 53 * 54 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 64 * SUCH DAMAGE. 65 * 66 * @(#)signal.h 8.2 (Berkeley) 1/21/94 67 */ 68 69#ifndef _SYS_SIGNAL_H_ 70#define _SYS_SIGNAL_H_ 71 72#include <sys/cdefs.h> 73#include <sys/appleapiopts.h> 74 75#define __DARWIN_NSIG 32 /* counting 0; could be 33 (mask is 1-32) */ 76 77#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) 78#define NSIG __DARWIN_NSIG 79#endif 80 81#include <machine/signal.h> /* sigcontext; codes for SIGILL, SIGFPE */ 82 83#define SIGHUP 1 /* hangup */ 84#define SIGINT 2 /* interrupt */ 85#define SIGQUIT 3 /* quit */ 86#define SIGILL 4 /* illegal instruction (not reset when caught) */ 87#define SIGTRAP 5 /* trace trap (not reset when caught) */ 88#define SIGABRT 6 /* abort() */ 89#if (defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE)) 90#define SIGPOLL 7 /* pollable event ([XSR] generated, not supported) */ 91#else /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 92#define SIGIOT SIGABRT /* compatibility */ 93#define SIGEMT 7 /* EMT instruction */ 94#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 95#define SIGFPE 8 /* floating point exception */ 96#define SIGKILL 9 /* kill (cannot be caught or ignored) */ 97#define SIGBUS 10 /* bus error */ 98#define SIGSEGV 11 /* segmentation violation */ 99#define SIGSYS 12 /* bad argument to system call */ 100#define SIGPIPE 13 /* write on a pipe with no one to read it */ 101#define SIGALRM 14 /* alarm clock */ 102#define SIGTERM 15 /* software termination signal from kill */ 103#define SIGURG 16 /* urgent condition on IO channel */ 104#define SIGSTOP 17 /* sendable stop signal not from tty */ 105#define SIGTSTP 18 /* stop signal from tty */ 106#define SIGCONT 19 /* continue a stopped process */ 107#define SIGCHLD 20 /* to parent on child stop or exit */ 108#define SIGTTIN 21 /* to readers pgrp upon background tty read */ 109#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ 110#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) 111#define SIGIO 23 /* input/output possible signal */ 112#endif 113#define SIGXCPU 24 /* exceeded CPU time limit */ 114#define SIGXFSZ 25 /* exceeded file size limit */ 115#define SIGVTALRM 26 /* virtual time alarm */ 116#define SIGPROF 27 /* profiling time alarm */ 117#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) 118#define SIGWINCH 28 /* window size changes */ 119#define SIGINFO 29 /* information request */ 120#endif 121#define SIGUSR1 30 /* user defined signal 1 */ 122#define SIGUSR2 31 /* user defined signal 2 */ 123 124#if defined(_ANSI_SOURCE) || __DARWIN_UNIX03 || defined(__cplusplus) 125/* 126 * Language spec sez we must list exactly one parameter, even though we 127 * actually supply three. Ugh! 128 * SIG_HOLD is chosen to avoid KERN_SIG_* values in <sys/signalvar.h> 129 */ 130#define SIG_DFL (void (*)(int))0 131#define SIG_IGN (void (*)(int))1 132#define SIG_HOLD (void (*)(int))5 133#define SIG_ERR ((void (*)(int))-1) 134#else 135/* DO NOT REMOVE THE COMMENTED OUT int: fixincludes needs to see them */ 136#define SIG_DFL (void (*)(/*int*/))0 137#define SIG_IGN (void (*)(/*int*/))1 138#define SIG_HOLD (void (*)(/*int*/))5 139#define SIG_ERR ((void (*)(/*int*/))-1) 140#endif 141 142#ifndef _ANSI_SOURCE 143#include <sys/_types.h> 144 145#include <machine/_mcontext.h> 146#include <sys/_types/_sigaltstack.h> 147#include <sys/_types/_ucontext.h> 148 149#include <sys/_types/_pid_t.h> 150#include <sys/_types/_pthread_attr_t.h> 151#include <sys/_types/_sigset_t.h> 152#include <sys/_types/_size_t.h> 153#include <sys/_types/_uid_t.h> 154 155union sigval { 156 /* Members as suggested by Annex C of POSIX 1003.1b. */ 157 int sival_int; 158 void *sival_ptr; 159}; 160 161#define SIGEV_NONE 0 /* No async notification */ 162#define SIGEV_SIGNAL 1 /* aio - completion notification */ 163#define SIGEV_THREAD 3 /* [NOTIMP] [RTS] call notification function */ 164 165struct sigevent { 166 int sigev_notify; /* Notification type */ 167 int sigev_signo; /* Signal number */ 168 union sigval sigev_value; /* Signal value */ 169 void (*sigev_notify_function)(union sigval); /* Notification function */ 170 pthread_attr_t *sigev_notify_attributes; /* Notification attributes */ 171}; 172 173#ifdef BSD_KERNEL_PRIVATE 174 175union user64_sigval { 176 struct { 177 uint32_t pad; /* assumes Motorola byte order */ 178 int32_t sival_int; 179 } size_equivalent; 180 user64_addr_t sival_ptr; 181}; 182 183union user32_sigval { 184 /* Members as suggested by Annex C of POSIX 1003.1b. */ 185 int32_t sival_int; 186 user32_addr_t sival_ptr; 187}; 188 189union user_sigval { 190 struct { 191 uint32_t pad; /* assumes Motorola byte order */ 192 int32_t sival_int; 193 } size_equivalent; 194 user_addr_t sival_ptr; 195}; 196 197struct user64_sigevent { 198 int sigev_notify; /* Notification type */ 199 int sigev_signo; /* Signal number */ 200 union user64_sigval sigev_value; /* Signal value */ 201 user64_addr_t sigev_notify_function; /* Notify function */ 202 user64_addr_t sigev_notify_attributes; /* Notify attributes */ 203}; 204 205struct user32_sigevent { 206 int sigev_notify; /* Notification type */ 207 int sigev_signo; /* Signal number */ 208 union user32_sigval sigev_value; /* Signal value */ 209 user32_addr_t sigev_notify_function; /* Notify function */ 210 user32_addr_t sigev_notify_attributes; /* Notify attributes */ 211}; 212 213struct user_sigevent { 214 int sigev_notify; /* Notification type */ 215 int sigev_signo; /* Signal number */ 216 union user_sigval sigev_value; /* Signal value */ 217 user_addr_t sigev_notify_function; /* Notify function */ 218 user_addr_t sigev_notify_attributes; /* Notify attributes */ 219}; 220 221#endif /* BSD_KERNEL_PRIVATE */ 222 223typedef struct __siginfo { 224 int si_signo; /* signal number */ 225 int si_errno; /* errno association */ 226 int si_code; /* signal code */ 227 pid_t si_pid; /* sending process */ 228 uid_t si_uid; /* sender's ruid */ 229 int si_status; /* exit value */ 230 void *si_addr; /* faulting instruction */ 231 union sigval si_value; /* signal value */ 232 long si_band; /* band event for SIGPOLL */ 233 unsigned long __pad[7]; /* Reserved for Future Use */ 234} siginfo_t; 235 236#ifdef BSD_KERNEL_PRIVATE 237 238typedef struct user_siginfo { 239 int si_signo; /* signal number */ 240 int si_errno; /* errno association */ 241 int si_code; /* signal code */ 242 pid_t si_pid; /* sending process */ 243 uid_t si_uid; /* sender's ruid */ 244 int si_status; /* exit value */ 245 user_addr_t si_addr; /* faulting instruction (see below) */ 246 union user_sigval si_value; /* signal value */ 247 user_long_t si_band; /* band event for SIGPOLL */ 248 user_ulong_t pad[7]; /* Reserved for Future Use */ 249} user_siginfo_t; 250 251typedef struct user64_siginfo { 252 int si_signo; /* signal number */ 253 int si_errno; /* errno association */ 254 int si_code; /* signal code */ 255 pid_t si_pid; /* sending process */ 256 uid_t si_uid; /* sender's ruid */ 257 int si_status; /* exit value */ 258 user64_addr_t si_addr; /* faulting instruction (see below) */ 259 union user64_sigval si_value; /* signal value */ 260 user64_long_t si_band; /* band event for SIGPOLL */ 261 user64_ulong_t __pad[7]; /* Reserved for Future Use */ 262} user64_siginfo_t; 263 264typedef struct user32_siginfo { 265 int si_signo; /* signal number */ 266 int si_errno; /* errno association */ 267 int si_code; /* signal code */ 268 pid_t si_pid; /* sending process */ 269 uid_t si_uid; /* sender's ruid */ 270 int si_status; /* exit value */ 271 user32_addr_t si_addr; /* faulting instruction (see below) */ 272 union user32_sigval si_value; /* signal value */ 273 user32_long_t si_band; /* band event for SIGPOLL */ 274 user32_ulong_t __pad[7]; /* Reserved for Future Use */ 275} user32_siginfo_t; 276 277void siginfo_user_to_user32(user_siginfo_t *, user32_siginfo_t *); 278void siginfo_user_to_user64(user_siginfo_t *, user64_siginfo_t *); 279 280#endif /* BSD_KERNEL_PRIVATE */ 281 282/* 283 * When the signal is SIGILL or SIGFPE, si_addr contains the address of 284 * the faulting instruction. 285 * When the signal is SIGSEGV or SIGBUS, si_addr contains the address of 286 * the faulting memory reference. Although for x86 there are cases of SIGSEGV 287 * for which si_addr cannot be determined and is NULL. 288 * If the signal is SIGCHLD, the si_pid field will contain the child process ID, 289 * si_status contains the exit value or signal and 290 * si_uid contains the real user ID of the process that sent the signal. 291 */ 292 293/* Values for si_code */ 294 295/* Codes for SIGILL */ 296#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 297#define ILL_NOOP 0 /* if only I knew... */ 298#endif 299#define ILL_ILLOPC 1 /* [XSI] illegal opcode */ 300#define ILL_ILLTRP 2 /* [XSI] illegal trap */ 301#define ILL_PRVOPC 3 /* [XSI] privileged opcode */ 302#define ILL_ILLOPN 4 /* [XSI] illegal operand -NOTIMP */ 303#define ILL_ILLADR 5 /* [XSI] illegal addressing mode -NOTIMP */ 304#define ILL_PRVREG 6 /* [XSI] privileged register -NOTIMP */ 305#define ILL_COPROC 7 /* [XSI] coprocessor error -NOTIMP */ 306#define ILL_BADSTK 8 /* [XSI] internal stack error -NOTIMP */ 307 308/* Codes for SIGFPE */ 309#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 310#define FPE_NOOP 0 /* if only I knew... */ 311#endif 312#define FPE_FLTDIV 1 /* [XSI] floating point divide by zero */ 313#define FPE_FLTOVF 2 /* [XSI] floating point overflow */ 314#define FPE_FLTUND 3 /* [XSI] floating point underflow */ 315#define FPE_FLTRES 4 /* [XSI] floating point inexact result */ 316#define FPE_FLTINV 5 /* [XSI] invalid floating point operation */ 317#define FPE_FLTSUB 6 /* [XSI] subscript out of range -NOTIMP */ 318#define FPE_INTDIV 7 /* [XSI] integer divide by zero */ 319#define FPE_INTOVF 8 /* [XSI] integer overflow */ 320 321/* Codes for SIGSEGV */ 322#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 323#define SEGV_NOOP 0 /* if only I knew... */ 324#endif 325#define SEGV_MAPERR 1 /* [XSI] address not mapped to object */ 326#define SEGV_ACCERR 2 /* [XSI] invalid permission for mapped object */ 327 328/* Codes for SIGBUS */ 329#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 330#define BUS_NOOP 0 /* if only I knew... */ 331#endif 332#define BUS_ADRALN 1 /* [XSI] Invalid address alignment */ 333#define BUS_ADRERR 2 /* [XSI] Nonexistent physical address -NOTIMP */ 334#define BUS_OBJERR 3 /* [XSI] Object-specific HW error - NOTIMP */ 335 336/* Codes for SIGTRAP */ 337#define TRAP_BRKPT 1 /* [XSI] Process breakpoint -NOTIMP */ 338#define TRAP_TRACE 2 /* [XSI] Process trace trap -NOTIMP */ 339 340/* Codes for SIGCHLD */ 341#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 342#define CLD_NOOP 0 /* if only I knew... */ 343#endif 344#define CLD_EXITED 1 /* [XSI] child has exited */ 345#define CLD_KILLED 2 /* [XSI] terminated abnormally, no core file */ 346#define CLD_DUMPED 3 /* [XSI] terminated abnormally, core file */ 347#define CLD_TRAPPED 4 /* [XSI] traced child has trapped */ 348#define CLD_STOPPED 5 /* [XSI] child has stopped */ 349#define CLD_CONTINUED 6 /* [XSI] stopped child has continued */ 350 351/* Codes for SIGPOLL */ 352#define POLL_IN 1 /* [XSR] Data input available */ 353#define POLL_OUT 2 /* [XSR] Output buffers available */ 354#define POLL_MSG 3 /* [XSR] Input message available */ 355#define POLL_ERR 4 /* [XSR] I/O error */ 356#define POLL_PRI 5 /* [XSR] High priority input available */ 357#define POLL_HUP 6 /* [XSR] Device disconnected */ 358 359/* union for signal handlers */ 360union __sigaction_u { 361 void (*__sa_handler)(int); 362 void (*__sa_sigaction)(int, struct __siginfo *, 363 void *); 364}; 365 366/* Signal vector template for Kernel user boundary */ 367struct __sigaction { 368 union __sigaction_u __sigaction_u; /* signal handler */ 369 void (*sa_tramp)(void *, int, int, siginfo_t *, void *); 370 sigset_t sa_mask; /* signal mask to apply */ 371 int sa_flags; /* see signal options below */ 372}; 373 374/* 375 * Signal vector "template" used in sigaction call. 376 */ 377struct sigaction { 378 union __sigaction_u __sigaction_u; /* signal handler */ 379 sigset_t sa_mask; /* signal mask to apply */ 380 int sa_flags; /* see signal options below */ 381}; 382 383#ifdef BSD_KERNEL_PRIVATE 384#include <machine/types.h> 385 386union __user32_sigaction_u { 387 user32_addr_t __sa_handler; 388 user32_addr_t __sa_sigaction; 389}; 390 391struct user32_sigaction { 392 union __user32_sigaction_u __sigaction_u; /* signal handler */ 393 sigset_t sa_mask; /* signal mask to apply */ 394 int sa_flags; /* see signal options below */ 395}; 396 397struct __user32_sigaction { 398 union __user32_sigaction_u __sigaction_u; /* signal handler */ 399 user32_addr_t sa_tramp; 400 sigset_t sa_mask; /* signal mask to apply */ 401 int sa_flags; /* see signal options below */ 402}; 403 404union __user64_sigaction_u { 405 user64_addr_t __sa_handler; 406 user64_addr_t __sa_sigaction; 407}; 408 409struct user64_sigaction { 410 union __user64_sigaction_u __sigaction_u; /* signal handler */ 411 sigset_t sa_mask; /* signal mask to apply */ 412 int sa_flags; /* see signal options below */ 413}; 414 415struct __user64_sigaction { 416 union __user64_sigaction_u __sigaction_u; /* signal handler */ 417 user64_addr_t sa_tramp; /* signal mask to apply */ 418 sigset_t sa_mask; /* signal mask to apply */ 419 int sa_flags; /* see signal options below */ 420}; 421 422union __kern_sigaction_u { 423 user_addr_t __sa_handler; 424 user_addr_t __sa_sigaction; 425}; 426 427struct kern_sigaction { 428 union __kern_sigaction_u __sigaction_u; /* signal handler */ 429 sigset_t sa_mask; /* signal mask to apply */ 430 int sa_flags; /* see signal options below */ 431}; 432 433struct __kern_sigaction { 434 union __kern_sigaction_u __sigaction_u; /* signal handler */ 435 user_addr_t sa_tramp; /* signal mask to apply */ 436 sigset_t sa_mask; /* signal mask to apply */ 437 int sa_flags; /* see signal options below */ 438}; 439 440#undef SIG_DFL 441#undef SIG_IGN 442#undef SIG_ERR 443#define SIG_DFL ((user_addr_t)0LL) 444#define SIG_IGN ((user_addr_t)1LL) 445#define SIG_ERR ((user_addr_t)-1LL) 446 447#endif /* BSD_KERNEL_PRIVATE */ 448 449 450/* if SA_SIGINFO is set, sa_sigaction is to be used instead of sa_handler. */ 451#define sa_handler __sigaction_u.__sa_handler 452#define sa_sigaction __sigaction_u.__sa_sigaction 453 454#define SA_ONSTACK 0x0001 /* take signal on signal stack */ 455#define SA_RESTART 0x0002 /* restart system on signal return */ 456#ifdef BSD_KERNEL_PRIVATE 457#define SA_DISABLE 0x0004 /* disable taking signals on alternate stack - for user_sigaltstack.ss_flags only */ 458#endif /* BSD_KERNEL_PRIVATE */ 459#define SA_RESETHAND 0x0004 /* reset to SIG_DFL when taking signal */ 460#define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */ 461#define SA_NODEFER 0x0010 /* don't mask the signal we're delivering */ 462#define SA_NOCLDWAIT 0x0020 /* don't keep zombies around */ 463#define SA_SIGINFO 0x0040 /* signal handler with SA_SIGINFO args */ 464#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 465#define SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */ 466/* This will provide 64bit register set in a 32bit user address space */ 467#define SA_64REGSET 0x0200 /* signal handler with SA_SIGINFO args with 64bit regs information */ 468#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 469 470/* the following are the only bits we support from user space, the 471 * rest are for kernel use only. 472 */ 473#define SA_USERSPACE_MASK (SA_ONSTACK | SA_RESTART | SA_RESETHAND | SA_NOCLDSTOP | SA_NODEFER | SA_NOCLDWAIT | SA_SIGINFO) 474 475/* 476 * Flags for sigprocmask: 477 */ 478#define SIG_BLOCK 1 /* block specified signal set */ 479#define SIG_UNBLOCK 2 /* unblock specified signal set */ 480#define SIG_SETMASK 3 /* set specified signal set */ 481 482/* POSIX 1003.1b required values. */ 483#define SI_USER 0x10001 /* [CX] signal from kill() */ 484#define SI_QUEUE 0x10002 /* [CX] signal from sigqueue() */ 485#define SI_TIMER 0x10003 /* [CX] timer expiration */ 486#define SI_ASYNCIO 0x10004 /* [CX] aio request completion */ 487#define SI_MESGQ 0x10005 /* [CX] from message arrival on empty queue */ 488 489#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 490typedef void (*sig_t)(int); /* type of signal function */ 491#endif 492 493/* 494 * Structure used in sigaltstack call. 495 */ 496#ifdef BSD_KERNEL_PRIVATE 497 498struct user32_sigaltstack { 499 user32_addr_t ss_sp; /* signal stack base */ 500 user32_size_t ss_size; /* signal stack length */ 501 int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ 502}; 503 504struct user64_sigaltstack { 505 user64_addr_t ss_sp; /* signal stack base */ 506 user64_size_t ss_size; /* signal stack length */ 507 int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ 508}; 509 510struct kern_sigaltstack { 511 user_addr_t ss_sp; /* signal stack base */ 512 user_size_t ss_size; /* signal stack length */ 513 int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ 514}; 515 516#endif /* BSD_KERNEL_PRIVATE */ 517 518#define SS_ONSTACK 0x0001 /* take signal on signal stack */ 519#define SS_DISABLE 0x0004 /* disable taking signals on alternate stack */ 520#define MINSIGSTKSZ 32768 /* (32K)minimum allowable stack */ 521#define SIGSTKSZ 131072 /* (128K)recommended stack size */ 522 523#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 524/* 525 * 4.3 compatibility: 526 * Signal vector "template" used in sigvec call. 527 */ 528struct sigvec { 529 void (*sv_handler)(int); /* signal handler */ 530 int sv_mask; /* signal mask to apply */ 531 int sv_flags; /* see signal options below */ 532}; 533 534#define SV_ONSTACK SA_ONSTACK 535#define SV_INTERRUPT SA_RESTART /* same bit, opposite sense */ 536#define SV_RESETHAND SA_RESETHAND 537#define SV_NODEFER SA_NODEFER 538#define SV_NOCLDSTOP SA_NOCLDSTOP 539#define SV_SIGINFO SA_SIGINFO 540 541#define sv_onstack sv_flags /* isn't compatibility wonderful! */ 542#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 543 544/* 545 * Structure used in sigstack call. 546 */ 547struct sigstack { 548 char *ss_sp; /* signal stack pointer */ 549 int ss_onstack; /* current status */ 550}; 551 552#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 553/* 554 * Macro for converting signal number to a mask suitable for 555 * sigblock(). 556 */ 557#define sigmask(m) (1 << ((m)-1)) 558 559#ifdef KERNEL_PRIVATE 560/* 561 * signals delivered on a per-thread basis. 562 */ 563#define threadmask (sigmask(SIGILL)|sigmask(SIGTRAP)|\ 564 sigmask(SIGIOT)|sigmask(SIGEMT)|\ 565 sigmask(SIGFPE)|sigmask(SIGBUS)|\ 566 sigmask(SIGSEGV)|sigmask(SIGSYS)|\ 567 sigmask(SIGPIPE)|sigmask(SIGKILL)) 568 569#define workq_threadmask (threadmask | sigcantmask) 570 571/* 572 * Signals carried across exec. 573 */ 574#define execmask (sigmask(SIGHUP)|sigmask(SIGINT)|\ 575 sigmask(SIGQUIT)|sigmask(SIGKILL)|\ 576 sigmask(SIGTERM)|sigmask(SIGSTOP)|\ 577 sigmask(SIGTSTP)|sigmask(SIGCONT)|\ 578 sigmask(SIGTTIN)|sigmask(SIGTTOU)|\ 579 sigmask(SIGUSR1)|sigmask(SIGUSR2)) 580 581#endif /* KERNEL_PRIVATE */ 582 583#define BADSIG SIG_ERR 584 585#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 586#endif /* !_ANSI_SOURCE */ 587 588/* 589 * For historical reasons; programs expect signal's return value to be 590 * defined by <sys/signal.h>. 591 */ 592__BEGIN_DECLS 593void (*signal(int, void (*)(int)))(int); 594__END_DECLS 595#endif /* !_SYS_SIGNAL_H_ */ 596