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 3216016df79f846d6d21266c3b1dce1e7c24dc4be1Josh Gao#include <sys/cdefs.h> 3316016df79f846d6d21266c3b1dce1e7c24dc4be1Josh Gao#include <sys/types.h> 3416016df79f846d6d21266c3b1dce1e7c24dc4be1Josh Gao 3575ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert#include <asm/sigcontext.h> 365704c423c81790195161c1757ae79da188590c51Elliott Hughes#include <bits/pthread_types.h> 375704c423c81790195161c1757ae79da188590c51Elliott Hughes#include <bits/timespec.h> 3875ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert#include <limits.h> 39c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 40d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__) || defined(__mips__) 41d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes/* For 64-bit (and mips), the kernel's struct sigaction doesn't match the POSIX one, 42c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * so we need to expose our own and translate behind the scenes. */ 43c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes# define sigaction __kernel_sigaction 4461fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes# include <linux/signal.h> 45c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes# undef sigaction 46c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#else 47c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes/* For 32-bit, we're stuck with the definitions we already shipped, 48c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * even though they contain a sigset_t that's too small. */ 4961fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes# include <linux/signal.h> 50c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5226a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes#include <sys/ucontext.h> 5326a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes#define __BIONIC_HAVE_UCONTEXT_T 5426a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 575470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#if defined(__clang__) 585470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic push 595470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic ignored "-Wnullability-completeness" 605470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#endif 615470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes 62c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turnertypedef int sig_atomic_t; 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 64199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* The arm and x86 kernel header files don't define _NSIG. */ 65199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#ifndef _KERNEL__NSIG 66199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _KERNEL__NSIG 64 67c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#endif 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 69199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* Userspace's NSIG is the kernel's _NSIG + 1. */ 70199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _NSIG (_KERNEL__NSIG + 1) 71199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define NSIG _NSIG 72199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes 735375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann/* The kernel headers define SIG_DFL (0) and SIG_IGN (1) but not SIG_HOLD, since 745375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann * SIG_HOLD is only used by the deprecated SysV signal API. 755375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann */ 765470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#define SIG_HOLD __BIONIC_CAST(reinterpret_cast, sighandler_t, 2) 775375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann 780990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes/* We take a few real-time signals for ourselves. May as well use the same names as glibc. */ 790990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMIN (__libc_current_sigrtmin()) 800990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMAX (__libc_current_sigrtmax()) 815470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint __libc_current_sigrtmin(void) __INTRODUCED_IN(21); 825470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint __libc_current_sigrtmax(void) __INTRODUCED_IN(21); 830990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes 845470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesextern const char* const sys_siglist[_NSIG]; 855470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesextern const char* const sys_signame[_NSIG]; /* BSD compatibility. */ 86da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughes 87c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sig_t; /* BSD compatibility. */ 88c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sighandler_t; /* glibc compatibility. */ 89c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 90a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes#define si_timerid si_tid /* glibc compatibility. */ 91a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes 92d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__) 93c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 94c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesstruct sigaction { 95c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes unsigned int sa_flags; 96c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes union { 97c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes sighandler_t sa_handler; 98c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes void (*sa_sigaction)(int, struct siginfo*, void*); 99c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes }; 100c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes sigset_t sa_mask; 101c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes void (*sa_restorer)(void); 102c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes}; 103c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 104d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#elif defined(__mips__) 105d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes 106d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughesstruct sigaction { 107d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes unsigned int sa_flags; 108d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes union { 109d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes sighandler_t sa_handler; 110d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes void (*sa_sigaction) (int, struct siginfo*, void*); 111d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes }; 112d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes sigset_t sa_mask; 113d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes}; 114d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes 115c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1175470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigaction(int, const struct sigaction*, struct sigaction*); 118c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1195470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint siginterrupt(int, int); 120c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1215bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#if __ANDROID_API__ >= __ANDROID_API_L__ 122b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaosighandler_t signal(int, sighandler_t) __INTRODUCED_IN(21); 123b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaoint sigaddset(sigset_t*, int) __INTRODUCED_IN(21); 124b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaoint sigdelset(sigset_t*, int) __INTRODUCED_IN(21); 125b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaoint sigemptyset(sigset_t*) __INTRODUCED_IN(21); 126b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaoint sigfillset(sigset_t*) __INTRODUCED_IN(21); 127b6a4a4c0cc76004459f87cecb260d202b5ba5512Josh Gaoint sigismember(const sigset_t*, int) __INTRODUCED_IN(21); 1288778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao#else 1298778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao// Implemented as static inlines before 21. 1308778d64d5c78a42d5389767adcf232bfe323e0f8Josh Gao#endif 131c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1325470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigpending(sigset_t* _Nonnull); 1335470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigprocmask(int, const sigset_t*, sigset_t*); 1345470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigsuspend(const sigset_t* _Nonnull); 1355470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigwait(const sigset_t* _Nonnull, int* _Nonnull); 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1375470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sighold(int) 13834c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead"))) 139cb302f932a3532f1484e1e70894e9b1199384283Josh Gao __INTRODUCED_IN(26); 1405470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigignore(int) 141cb302f932a3532f1484e1e70894e9b1199384283Josh Gao __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN(26); 1425470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigpause(int) 143cb302f932a3532f1484e1e70894e9b1199384283Josh Gao __attribute__((deprecated("use sigsuspend() instead"))) __INTRODUCED_IN(26); 1445470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigrelse(int) 14534c599a8b0b04f66b065c4d84b809f74dd44382dJosh Gao __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead"))) 146cb302f932a3532f1484e1e70894e9b1199384283Josh Gao __INTRODUCED_IN(26); 1475470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughessighandler_t sigset(int, sighandler_t) 148cb302f932a3532f1484e1e70894e9b1199384283Josh Gao __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN(26); 1495375bf639856cbeb1b4872553a56b95e641f1404Greg Hackmann 1505470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint raise(int); 1515470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint kill(pid_t, int); 1525470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint killpg(int, int); 153d3cfd2687249d2340b738ddeb8ea0660860e9e3fJosh Gaoint tgkill(int tgid, int tid, int sig) __INTRODUCED_IN_32(16); 154c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes 1555470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigaltstack(const stack_t*, stack_t*); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1575470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesvoid psiginfo(const siginfo_t*, const char*) __INTRODUCED_IN(17); 1585470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesvoid psignal(int, const char*) __INTRODUCED_IN(17); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1605470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint pthread_kill(pthread_t, int); 1615470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint pthread_sigmask(int, const sigset_t*, sigset_t*); 16275ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert 1635470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigqueue(pid_t, int, const union sigval) __INTRODUCED_IN(23); 1645470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigtimedwait(const sigset_t* _Nonnull, siginfo_t*, const struct timespec*) __INTRODUCED_IN(23); 1655470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughesint sigwaitinfo(const sigset_t* _Nonnull, siginfo_t*) __INTRODUCED_IN(23); 1665470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes 1675470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#if defined(__clang__) 1685470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#pragma clang diagnostic pop 1695470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#endif 170634816055f51c536d24dea30dfe930b7fe2fa603Yabin Cui 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 173b8e1b705d187886decb5970f791358f928f93d75Josh Gao#include <android/legacy_signal_inlines.h> 174b8e1b705d187886decb5970f791358f928f93d75Josh Gao 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SIGNAL_H_ */ 176