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