signal.h revision 8778d64d5c78a42d5389767adcf232bfe323e0f8
11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 28c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _SIGNAL_H_ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _SIGNAL_H_ 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3275ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert#include <asm/sigcontext.h> 335704c423c81790195161c1757ae79da188590c51Elliott Hughes#include <bits/pthread_types.h> 345704c423c81790195161c1757ae79da188590c51Elliott Hughes#include <bits/timespec.h> 3575ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert#include <limits.h> 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 38c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 39d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__) || defined(__mips__) 40d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes/* For 64-bit (and mips), the kernel's struct sigaction doesn't match the POSIX one, 41c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * so we need to expose our own and translate behind the scenes. */ 42c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes# define sigaction __kernel_sigaction 4361fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes# include <linux/signal.h> 44c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes# undef sigaction 45c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#else 46c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes/* For 32-bit, we're stuck with the definitions we already shipped, 47c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * even though they contain a sigset_t that's too small. */ 4861fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes# include <linux/signal.h> 49c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5126a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes#include <sys/ucontext.h> 5226a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes#define __BIONIC_HAVE_UCONTEXT_T 5326a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 565470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#if defined(__clang__) 575470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic push 585470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic ignored "-Wnullability-completeness" 595470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#endif 605470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes 61c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turnertypedef int sig_atomic_t; 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 63199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* The arm and x86 kernel header files don't define _NSIG. */ 64199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#ifndef _KERNEL__NSIG 65199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _KERNEL__NSIG 64 66c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#endif 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 68199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* Userspace's NSIG is the kernel's _NSIG + 1. */ 69199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _NSIG (_KERNEL__NSIG + 1) 70199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define NSIG _NSIG 71199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes 725375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann/* The kernel headers define SIG_DFL (0) and SIG_IGN (1) but not SIG_HOLD, since 735375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann * SIG_HOLD is only used by the deprecated SysV signal API. 745375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann */ 755470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#define SIG_HOLD __BIONIC_CAST(reinterpret_cast, sighandler_t, 2) 765375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann 770990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes/* We take a few real-time signals for ourselves. May as well use the same names as glibc. */ 780990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMIN (__libc_current_sigrtmin()) 790990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMAX (__libc_current_sigrtmax()) 805470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint __libc_current_sigrtmin(void) __INTRODUCED_IN(21); 815470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint __libc_current_sigrtmax(void) __INTRODUCED_IN(21); 820990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes 835470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesextern const char* const sys_siglist[_NSIG]; 845470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesextern const char* const sys_signame[_NSIG]; /* BSD compatibility. */ 85da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughes 86c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sig_t; /* BSD compatibility. */ 87c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sighandler_t; /* glibc compatibility. */ 88c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 89a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes#define si_timerid si_tid /* glibc compatibility. */ 90a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes 91d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__) 92c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 93c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesstruct sigaction { 94c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes unsigned int sa_flags; 95c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes union { 96c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes sighandler_t sa_handler; 97c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes void (*sa_sigaction)(int, struct siginfo*, void*); 98c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes }; 99c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes sigset_t sa_mask; 100c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes void (*sa_restorer)(void); 101c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes}; 102c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 103d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#elif defined(__mips__) 104d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes 105d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughesstruct sigaction { 106d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes unsigned int sa_flags; 107d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes union { 108d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes sighandler_t sa_handler; 109d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes void (*sa_sigaction) (int, struct siginfo*, void*); 110d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes }; 111d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes sigset_t sa_mask; 112d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes}; 113d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes 114c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1165470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigaction(int, const struct sigaction*, struct sigaction*); 117c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1185470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint siginterrupt(int, int); 119c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1208778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao#if __ANDROID_API__ >= 21 1218778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaosighandler_t signal(int, sighandler_t); 1228778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaoint sigaddset(sigset_t*, int); 1238778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaoint sigdelset(sigset_t*, int); 1248778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaoint sigemptyset(sigset_t*); 1258778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaoint sigfillset(sigset_t*); 1268778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gaoint sigismember(const sigset_t*, int); 1278778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao#else 1288778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao// Implemented as static inlines before 21. 1298778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao#endif 130c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1315470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigpending(sigset_t* _Nonnull); 1325470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigprocmask(int, const sigset_t*, sigset_t*); 1335470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigsuspend(const sigset_t* _Nonnull); 1345470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigwait(const sigset_t* _Nonnull, int* _Nonnull); 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1365470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sighold(int) 13734c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead"))) 13834c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __INTRODUCED_IN_FUTURE; 1395470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigignore(int) 14034c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN_FUTURE; 1415470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigpause(int) 14234c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigsuspend() instead"))) __INTRODUCED_IN_FUTURE; 1435470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigrelse(int) 14434c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead"))) 14534c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __INTRODUCED_IN_FUTURE; 1465470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughessighandler_t sigset(int, sighandler_t) 14734c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN_FUTURE; 1485375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann 1495470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint raise(int); 1505470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint kill(pid_t, int); 1515470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint killpg(int, int); 152c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1535470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigaltstack(const stack_t*, stack_t*); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1555470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesvoid psiginfo(const siginfo_t*, const char*) __INTRODUCED_IN(17); 1565470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesvoid psignal(int, const char*) __INTRODUCED_IN(17); 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1585470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint pthread_kill(pthread_t, int); 1595470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint pthread_sigmask(int, const sigset_t*, sigset_t*); 16075ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert 1615470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigqueue(pid_t, int, const union sigval) __INTRODUCED_IN(23); 1625470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigtimedwait(const sigset_t* _Nonnull, siginfo_t*, const struct timespec*) __INTRODUCED_IN(23); 1635470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigwaitinfo(const sigset_t* _Nonnull, siginfo_t*) __INTRODUCED_IN(23); 1645470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes 1655470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#if defined(__clang__) 1665470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic pop 1675470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#endif 168634816055f51c536d24dea30dfe930b7fe2fa603Yabin Cui 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171b8e1b705d187886decb5970f791358f928f93d75Josh Gao#include <android/legacy_signal_inlines.h> 172b8e1b705d187886decb5970f791358f928f93d75Josh Gao 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SIGNAL_H_ */ 174