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