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