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