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