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
32da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughes#include <errno.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
34c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#include <limits.h>		/* For LONG_BIT */
35c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#include <string.h>		/* For memset() */
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
3793e7b9f3eaf19aee6eac24b095982f5e25313535Raghu Gandham#include <asm/sigcontext.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
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
53c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turnertypedef int sig_atomic_t;
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
55199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* The arm and x86 kernel header files don't define _NSIG. */
56199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#ifndef _KERNEL__NSIG
57199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _KERNEL__NSIG 64
58c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#endif
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
60199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* Userspace's NSIG is the kernel's _NSIG + 1. */
61199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _NSIG (_KERNEL__NSIG + 1)
62199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define NSIG _NSIG
63199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes
640990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes/* We take a few real-time signals for ourselves. May as well use the same names as glibc. */
650990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMIN (__libc_current_sigrtmin())
660990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes#define SIGRTMAX (__libc_current_sigrtmax())
670990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughesextern int __libc_current_sigrtmin(void);
680990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughesextern int __libc_current_sigrtmax(void);
690990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes
70da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughesextern const char* const sys_siglist[];
71671e236d5fd2cae169c2a31d0a35e66c4fcc5556Elliott Hughesextern const char* const sys_signame[]; /* BSD compatibility. */
72da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughes
73c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sig_t; /* BSD compatibility. */
74c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sighandler_t; /* glibc compatibility. */
75c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
76a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes#define si_timerid si_tid /* glibc compatibility. */
77a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes
78d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__)
79c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
80c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesstruct sigaction {
81c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  unsigned int sa_flags;
82c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  union {
83c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes    sighandler_t sa_handler;
84c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes    void (*sa_sigaction)(int, struct siginfo*, void*);
85c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  };
86c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  sigset_t sa_mask;
87c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  void (*sa_restorer)(void);
88c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes};
89c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
90d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#elif defined(__mips__)
91d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes
92d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughesstruct sigaction {
93d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  unsigned int sa_flags;
94d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  union {
95d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes    sighandler_t sa_handler;
96d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes    void (*sa_sigaction) (int, struct siginfo*, void*);
97d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  };
98d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  sigset_t sa_mask;
99d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes};
100d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes
101c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
10340d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigaction(int, const struct sigaction*, struct sigaction*);
104c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
105c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern sighandler_t signal(int, sighandler_t);
106c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
10740d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int siginterrupt(int, int);
108c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
109c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigaddset(sigset_t*, int);
110c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigdelset(sigset_t*, int);
111c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigemptyset(sigset_t*);
112c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigfillset(sigset_t*);
113c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigismember(const sigset_t*, int);
114c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
11540d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigpending(sigset_t*) __nonnull((1));
11640d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigprocmask(int, const sigset_t*, sigset_t*);
11740d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigsuspend(const sigset_t*) __nonnull((1));
11840d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigwait(const sigset_t*, int*) __nonnull((1, 2));
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int raise(int);
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int kill(pid_t, int);
12240d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int killpg(int, int);
123c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
12440d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigaltstack(const stack_t*, stack_t*);
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
12640d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern void psiginfo(const siginfo_t*, const char*);
12740d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern void psignal(int, const char*);
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SIGNAL_H_ */
132