signal.h revision a0cd9bc3392f56ca488bea61269d7468ae6c5dce
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>
37c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
38d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__) || defined(__mips__)
39d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes/* For 64-bit (and mips), the kernel's struct sigaction doesn't match the POSIX one,
40c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * so we need to expose our own and translate behind the scenes. */
41c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#  define sigaction __kernel_sigaction
4261fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes#  include <linux/signal.h>
43c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#  undef sigaction
44c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#else
45c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes/* For 32-bit, we're stuck with the definitions we already shipped,
46c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes * even though they contain a sigset_t that's too small. */
4761fb3fc770566c7bafe7af8fb93590bcad387fbbElliott Hughes#  include <linux/signal.h>
48c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
52c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turnertypedef int sig_atomic_t;
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
54199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* The arm and x86 kernel header files don't define _NSIG. */
55199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#ifndef _KERNEL__NSIG
56199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _KERNEL__NSIG 64
57c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#endif
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
59199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes/* Userspace's NSIG is the kernel's _NSIG + 1. */
60199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define _NSIG (_KERNEL__NSIG + 1)
61199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes#define NSIG _NSIG
62199346a2abd8b6ba282e1fe291cc3766fa921f40Elliott Hughes
63da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughesextern const char* const sys_siglist[];
64671e236d5fd2cae169c2a31d0a35e66c4fcc5556Elliott Hughesextern const char* const sys_signame[]; /* BSD compatibility. */
65da73f655fcbac6e1a8bfd35303cef6f41187d12bElliott Hughes
66c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sig_t; /* BSD compatibility. */
67c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughestypedef __sighandler_t sighandler_t; /* glibc compatibility. */
68c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
69a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes#define si_timerid si_tid /* glibc compatibility. */
70a0cd9bc3392f56ca488bea61269d7468ae6c5dceElliott Hughes
71d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#if defined(__LP64__)
72c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
73c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesstruct sigaction {
74c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  unsigned int sa_flags;
75c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  union {
76c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes    sighandler_t sa_handler;
77c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes    void (*sa_sigaction)(int, struct siginfo*, void*);
78c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  };
79c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  sigset_t sa_mask;
80c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes  void (*sa_restorer)(void);
81c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes};
82c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
83d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes#elif defined(__mips__)
84d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes
85d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughesstruct sigaction {
86d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  unsigned int sa_flags;
87d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  union {
88d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes    sighandler_t sa_handler;
89d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes    void (*sa_sigaction) (int, struct siginfo*, void*);
90d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  };
91d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes  sigset_t sa_mask;
92d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes};
93d8482b6c7eae54c37bc769030d60c2a5af187f89Elliott Hughes
94c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes#endif
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
9640d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigaction(int, const struct sigaction*, struct sigaction*);
97c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
98c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern sighandler_t signal(int, sighandler_t);
99c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern sighandler_t bsd_signal(int, sighandler_t);
100c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern sighandler_t sysv_signal(int, sighandler_t);
101c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
10240d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int siginterrupt(int, int);
103c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
104c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigaddset(sigset_t*, int);
105c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigdelset(sigset_t*, int);
106c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigemptyset(sigset_t*);
107c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigfillset(sigset_t*);
108c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughesextern int sigismember(const sigset_t*, int);
109c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
11040d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigpending(sigset_t*) __nonnull((1));
11140d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigprocmask(int, const sigset_t*, sigset_t*);
11240d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigsuspend(const sigset_t*) __nonnull((1));
11340d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigwait(const sigset_t*, int*) __nonnull((1, 2));
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int raise(int);
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int kill(pid_t, int);
11740d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int killpg(int, int);
118c7e9b2331771e5e87c34a8ee3dc6cc41d35b02feElliott Hughes
11940d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern int sigaltstack(const stack_t*, stack_t*);
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
12140d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern void psiginfo(const siginfo_t*, const char*);
12240d105ccb3e6283566ce54b693b3088f31aa4f26Elliott Hughesextern void psignal(int, const char*);
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SIGNAL_H_ */
127