Home | History | Annotate | Download | only in current
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #ifndef _SIGNAL_H_
     30 #define _SIGNAL_H_
     31 
     32 #include <sys/cdefs.h>
     33 #include <sys/types.h>
     34 
     35 #include <asm/sigcontext.h>
     36 #include <bits/pthread_types.h>
     37 #include <bits/timespec.h>
     38 #include <limits.h>
     39 
     40 #if defined(__LP64__) || defined(__mips__)
     41 /* For 64-bit (and mips), the kernel's struct sigaction doesn't match the POSIX one,
     42  * so we need to expose our own and translate behind the scenes. */
     43 #  define sigaction __kernel_sigaction
     44 #  include <linux/signal.h>
     45 #  undef sigaction
     46 #else
     47 /* For 32-bit, we're stuck with the definitions we already shipped,
     48  * even though they contain a sigset_t that's too small. */
     49 #  include <linux/signal.h>
     50 #endif
     51 
     52 #include <sys/ucontext.h>
     53 #define __BIONIC_HAVE_UCONTEXT_T
     54 
     55 __BEGIN_DECLS
     56 
     57 #if defined(__clang__)
     58 #pragma clang diagnostic push
     59 #pragma clang diagnostic ignored "-Wnullability-completeness"
     60 #endif
     61 
     62 typedef int sig_atomic_t;
     63 
     64 /* The arm and x86 kernel header files don't define _NSIG. */
     65 #ifndef _KERNEL__NSIG
     66 #define _KERNEL__NSIG 64
     67 #endif
     68 
     69 /* Userspace's NSIG is the kernel's _NSIG + 1. */
     70 #define _NSIG (_KERNEL__NSIG + 1)
     71 #define NSIG _NSIG
     72 
     73 /* The kernel headers define SIG_DFL (0) and SIG_IGN (1) but not SIG_HOLD, since
     74  * SIG_HOLD is only used by the deprecated SysV signal API.
     75  */
     76 #define SIG_HOLD __BIONIC_CAST(reinterpret_cast, sighandler_t, 2)
     77 
     78 /* We take a few real-time signals for ourselves. May as well use the same names as glibc. */
     79 #define SIGRTMIN (__libc_current_sigrtmin())
     80 #define SIGRTMAX (__libc_current_sigrtmax())
     81 int __libc_current_sigrtmin(void) __INTRODUCED_IN(21);
     82 int __libc_current_sigrtmax(void) __INTRODUCED_IN(21);
     83 
     84 extern const char* const sys_siglist[_NSIG];
     85 extern const char* const sys_signame[_NSIG]; /* BSD compatibility. */
     86 
     87 typedef __sighandler_t sig_t; /* BSD compatibility. */
     88 typedef __sighandler_t sighandler_t; /* glibc compatibility. */
     89 
     90 #define si_timerid si_tid /* glibc compatibility. */
     91 
     92 #if defined(__LP64__)
     93 
     94 struct sigaction {
     95   unsigned int sa_flags;
     96   union {
     97     sighandler_t sa_handler;
     98     void (*sa_sigaction)(int, struct siginfo*, void*);
     99   };
    100   sigset_t sa_mask;
    101   void (*sa_restorer)(void);
    102 };
    103 
    104 #elif defined(__mips__)
    105 
    106 struct sigaction {
    107   unsigned int sa_flags;
    108   union {
    109     sighandler_t sa_handler;
    110     void (*sa_sigaction) (int, struct siginfo*, void*);
    111   };
    112   sigset_t sa_mask;
    113 };
    114 
    115 #endif
    116 
    117 int sigaction(int, const struct sigaction*, struct sigaction*);
    118 
    119 int siginterrupt(int, int);
    120 
    121 #if __ANDROID_API__ >= __ANDROID_API_L__
    122 sighandler_t signal(int, sighandler_t) __INTRODUCED_IN(21);
    123 int sigaddset(sigset_t*, int) __INTRODUCED_IN(21);
    124 int sigdelset(sigset_t*, int) __INTRODUCED_IN(21);
    125 int sigemptyset(sigset_t*) __INTRODUCED_IN(21);
    126 int sigfillset(sigset_t*) __INTRODUCED_IN(21);
    127 int sigismember(const sigset_t*, int) __INTRODUCED_IN(21);
    128 #else
    129 // Implemented as static inlines before 21.
    130 #endif
    131 
    132 int sigpending(sigset_t* _Nonnull);
    133 int sigprocmask(int, const sigset_t*, sigset_t*);
    134 int sigsuspend(const sigset_t* _Nonnull);
    135 int sigwait(const sigset_t* _Nonnull, int* _Nonnull);
    136 
    137 int sighold(int)
    138   __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
    139   __INTRODUCED_IN(26);
    140 int sigignore(int)
    141   __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN(26);
    142 int sigpause(int)
    143   __attribute__((deprecated("use sigsuspend() instead"))) __INTRODUCED_IN(26);
    144 int sigrelse(int)
    145   __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
    146   __INTRODUCED_IN(26);
    147 sighandler_t sigset(int, sighandler_t)
    148   __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN(26);
    149 
    150 int raise(int);
    151 int kill(pid_t, int);
    152 int killpg(int, int);
    153 int tgkill(int tgid, int tid, int sig) __INTRODUCED_IN_32(16);
    154 
    155 int sigaltstack(const stack_t*, stack_t*);
    156 
    157 void psiginfo(const siginfo_t*, const char*) __INTRODUCED_IN(17);
    158 void psignal(int, const char*) __INTRODUCED_IN(17);
    159 
    160 int pthread_kill(pthread_t, int);
    161 int pthread_sigmask(int, const sigset_t*, sigset_t*);
    162 
    163 int sigqueue(pid_t, int, const union sigval) __INTRODUCED_IN(23);
    164 int sigtimedwait(const sigset_t* _Nonnull, siginfo_t*, const struct timespec*) __INTRODUCED_IN(23);
    165 int sigwaitinfo(const sigset_t* _Nonnull, siginfo_t*) __INTRODUCED_IN(23);
    166 
    167 #if defined(__clang__)
    168 #pragma clang diagnostic pop
    169 #endif
    170 
    171 __END_DECLS
    172 
    173 #include <android/legacy_signal_inlines.h>
    174 
    175 #endif /* _SIGNAL_H_ */
    176