Home | History | Annotate | Download | only in include
      1 /*
      2  * Derived from gdk/platforms/android-14/arch-arm/usr/include/signal.h
      3  *
      4  * Copyright (C) 2008 The Android Open Source Project
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *  * Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  *  * Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in
     14  *    the documentation and/or other materials provided with the
     15  *    distribution.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     21  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     23  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     24  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     27  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28  * SUCH DAMAGE.
     29  */
     30 #ifndef _SIGNAL_PORTABLE_H_
     31 #define _SIGNAL_PORTABLE_H_
     32 
     33 #include <portability.h>
     34 #include <sys/cdefs.h>
     35 #include <limits.h>             /* For LONG_BIT */
     36 #include <string.h>             /* For memset() */
     37 #include <signal.h>
     38 #include <time.h>
     39 #include <sys/types.h>
     40 #include <asm/signal_portable.h>
     41 #include <asm/sigcontext_portable.h>
     42 
     43 #define __ARCH_SI_UID_T __kernel_uid32_t
     44 #include <asm/siginfo_portable.h>
     45 #undef __ARCH_SI_UID_T
     46 
     47 __BEGIN_DECLS
     48 
     49 typedef int sig_atomic_t;
     50 
     51 #if 0
     52 /* _NSIG is used by the SIGRTMAX definition under <asm/signal.h>, however
     53  * its definition is part of a #if __KERNEL__ .. #endif block in the original
     54  * kernel headers and is thus not part of our cleaned-up versions.
     55  *
     56  * Looking at the current kernel sources, it is defined as 64 for all
     57  * architectures except for the 'mips' one which set it to 128.
     58  */
     59 #ifndef _NSIG_PORTABLE
     60 #  define _NSIG_PORTABLE  64
     61 #endif
     62 #endif
     63 
     64 extern const char * const sys_siglist[];
     65 extern const char * const sys_signame[];
     66 
     67 static __inline__ int WRAP(sigismember)(sigset_portable_t *set, int signum)
     68 {
     69     unsigned long *local_set = (unsigned long *)set;
     70     signum--;
     71     return (int)((local_set[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1);
     72 }
     73 
     74 
     75 static __inline__ int WRAP(sigaddset)(sigset_portable_t *set, int signum)
     76 {
     77     unsigned long *local_set = (unsigned long *)set;
     78     signum--;
     79     local_set[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT);
     80     return 0;
     81 }
     82 
     83 
     84 static __inline__ int WRAP(sigdelset)(sigset_portable_t *set, int signum)
     85 {
     86     unsigned long *local_set = (unsigned long *)set;
     87     signum--;
     88     local_set[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT));
     89     return 0;
     90 }
     91 
     92 
     93 static __inline__ int WRAP(sigemptyset)(sigset_portable_t *set)
     94 {
     95     memset(set, 0, sizeof *set);
     96     return 0;
     97 }
     98 
     99 static __inline__ int WRAP(sigfillset)(sigset_portable_t *set)
    100 {
    101     memset(set, ~0, sizeof *set);
    102     return 0;
    103 }
    104 
    105 /* compatibility types */
    106 typedef void            (*sig_portable_t)(int);
    107 typedef sig_portable_t   sighandler_portable_t;
    108 
    109 /* Extended compatibility types, for processing a siginfo_t argument */
    110 typedef void            (*sig3_portable_t)(int, siginfo_portable_t *, void *);
    111 typedef sig3_portable_t   sig3handler_portable_t;
    112 
    113 /* differentiater between sysv and bsd behaviour 8*/
    114 extern __sighandler_t sysv_signal(int, __sighandler_portable_t);
    115 extern __sighandler_t bsd_signal(int, __sighandler_portable_t);
    116 
    117 #if 0
    118 /* the default is bsd */
    119 static __inline__ __sighandler_portable_t WRAP(signal)(int s, sighandler_portable_t f)
    120 {
    121     return bsd_signal(s,f);
    122 }
    123 #endif
    124 
    125 /* the portable mapped syscall itself */
    126 extern __sighandler_portable_t WRAP(__signal)(int, __sighandler_portable_t);
    127 
    128 extern int WRAP(sigprocmask)(int, const sigset_portable_t *, sigset_portable_t *);
    129 
    130 extern int WRAP(sigaction)(int, const struct sigaction_portable *,
    131                               struct sigaction_portable *);
    132 
    133 extern int WRAP(sigpending)(sigset_portable_t *);
    134 extern int WRAP(sigsuspend)(const sigset_portable_t *);
    135 extern int WRAP(sigwait)(const sigset_portable_t *set, int *sig);
    136 extern int WRAP(siginterrupt)(int  sig, int  flag);
    137 
    138 extern int WRAP(raise)(int);
    139 extern int WRAP(kill)(pid_t, int);
    140 extern int WRAP(killpg)(int pgrp, int sig);
    141 extern int WRAP(tkill)(int tid, int portable_signum);
    142 extern int WRAP(sigaltstack)(const portable_stack_t *ss, portable_stack_t *oss);
    143 extern int WRAP(timer_create)(clockid_t, struct sigevent *, timer_t *);
    144 
    145 #if 0
    146 extern int WRAP(signalfd)(int fd, const sigset_portable_t *portable_sigmask, int flags);
    147 #endif
    148 
    149 extern __hidden int do_signalfd4_portable(int fd, const sigset_portable_t *portable_sigmask,
    150                                           int portable_sigsetsize, int flags);
    151 
    152 extern __hidden int read_signalfd_mapper(int fd, void *buf, size_t count);
    153 extern __hidden char *map_portable_signum_to_name(int portable_signum);
    154 extern __hidden char *map_mips_signum_to_name(int mips_signum);
    155 extern __hidden int signum_pton(int portable_signum);
    156 extern __hidden int signum_ntop(int mips_signum);
    157 
    158 typedef int (*sigmask_fn)(int, const sigset_t *, sigset_t *);
    159 typedef int (*rt_sigmask_fn)(int, const sigset_t *, sigset_t *, size_t);
    160 typedef int (*sigaction_fn)(int, const struct sigaction *, struct sigaction *);
    161 typedef int (*rt_sigaction_fn)(int, const struct sigaction *, struct sigaction *, size_t);
    162 
    163 
    164 extern __hidden int do_sigmask(int portable_how, const sigset_portable_t *portable_sigset,
    165                                sigset_portable_t *portable_oldset, sigmask_fn fn,
    166                                rt_sigmask_fn rt_fn);
    167 
    168 
    169 /* These functions are called from syscall.c and experimental Bionic linker. */
    170 extern int WRAP(__rt_sigaction)(int portable_signum,
    171                                 const struct sigaction_portable *act,
    172                                 struct sigaction_portable *oldact,
    173                                 size_t sigsetsize);
    174 
    175 extern int WRAP(__rt_sigprocmask)(int portable_how,
    176                                   const sigset_portable_t *portable_sigset,
    177                                   sigset_portable_t *portable_oldset,
    178                                   size_t sigsetsize);
    179 
    180 extern int WRAP(__rt_sigtimedwait)(const sigset_portable_t *portable_sigset,
    181                                    siginfo_portable_t *portable_siginfo,
    182                                    const struct timespec *timeout,
    183                                    size_t portable_sigsetsize);
    184 
    185 
    186 /* These functions are only called from syscall.c; not experimental Bionic linker. */
    187 extern __hidden int WRAP(rt_sigqueueinfo)(pid_t pid, int sig, siginfo_portable_t *uinfo);
    188 
    189 extern __hidden int WRAP(rt_tgsigqueueinfo)(pid_t tgid, pid_t pid, int sig,
    190                                                siginfo_portable_t *uinfo);
    191 
    192 
    193 /* Called by clone when memory and signal handlers aren't compatable. */
    194 extern __hidden void signal_disable_mapping(void);
    195 
    196 __END_DECLS
    197 
    198 #endif /* _SIGNAL_PORTABLE_H_ */
    199