• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  #ifndef _SIGNAL_H_
29  #define _SIGNAL_H_
30  
31  #include <errno.h>
32  #include <sys/cdefs.h>
33  #include <limits.h>		/* For LONG_BIT */
34  #include <string.h>		/* For memset() */
35  #include <sys/types.h>
36  #include <asm/signal.h>
37  
38  #define __ARCH_SI_UID_T __kernel_uid32_t
39  #include <asm/siginfo.h>
40  #undef __ARCH_SI_UID_T
41  
42  __BEGIN_DECLS
43  
44  typedef int sig_atomic_t;
45  
46  /* _NSIG is used by the SIGRTMAX definition under <asm/signal.h>, however
47   * its definition is part of a #if __KERNEL__ .. #endif block in the original
48   * kernel headers and is thus not part of our cleaned-up versions.
49   *
50   * Looking at the current kernel sources, it is defined as 64 for all
51   * architectures except for the 'mips' one which set it to 128.
52   */
53  #ifndef _NSIG
54  #  define _NSIG  64
55  #endif
56  
57  extern const char* const sys_siglist[];
58  extern const char* const sys_signame[];
59  
sigismember(const sigset_t * set,int signum)60  static __inline__ int sigismember(const sigset_t* set, int signum) {
61    int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
62    if (set == NULL || bit < 0 || bit >= (int) (8*sizeof(sigset_t))) {
63      errno = EINVAL;
64      return -1;
65    }
66    const unsigned long* local_set = (const unsigned long*) set;
67    return (int) ((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1);
68  }
69  
sigaddset(sigset_t * set,int signum)70  static __inline__ int sigaddset(sigset_t* set, int signum) {
71    int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
72    if (set == NULL || bit < 0 || bit >= (int) (8*sizeof(sigset_t))) {
73      errno = EINVAL;
74      return -1;
75    }
76    unsigned long* local_set = (unsigned long*) set;
77    local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
78    return 0;
79  }
80  
sigdelset(sigset_t * set,int signum)81  static __inline__ int sigdelset(sigset_t* set, int signum) {
82    int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
83    if (set == NULL || bit < 0 || bit >= (int) (8*sizeof(sigset_t))) {
84      errno = EINVAL;
85      return -1;
86    }
87    unsigned long* local_set = (unsigned long*) set;
88    local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT));
89    return 0;
90  }
91  
sigemptyset(sigset_t * set)92  static __inline__ int sigemptyset(sigset_t* set) {
93    if (set == NULL) {
94      errno = EINVAL;
95      return -1;
96    }
97    memset(set, 0, sizeof *set);
98    return 0;
99  }
100  
sigfillset(sigset_t * set)101  static __inline__ int sigfillset(sigset_t* set) {
102    if (set == NULL) {
103      errno = EINVAL;
104      return -1;
105    }
106    memset(set, ~0, sizeof *set);
107    return 0;
108  }
109  
110  
111  /* compatibility types */
112  typedef void  (*sig_t)(int);
113  typedef sig_t sighandler_t;
114  
115  /* differentiater between sysv and bsd behaviour 8*/
116  extern __sighandler_t sysv_signal(int, __sighandler_t);
117  extern __sighandler_t bsd_signal(int, __sighandler_t);
118  
119  /* the default is bsd */
signal(int s,__sighandler_t f)120  static __inline__ __sighandler_t signal(int s, __sighandler_t f)
121  {
122      return bsd_signal(s,f);
123  }
124  
125  /* the syscall itself */
126  extern __sighandler_t __signal(int, __sighandler_t, int);
127  
128  extern int sigprocmask(int, const sigset_t *, sigset_t *);
129  extern int sigaction(int, const struct sigaction *, struct sigaction *);
130  
131  extern int sigpending(sigset_t *);
132  extern int sigsuspend(const sigset_t *);
133  extern int sigwait(const sigset_t *set, int *sig);
134  extern int siginterrupt(int  sig, int  flag);
135  
136  extern int raise(int);
137  extern int kill(pid_t, int);
138  extern int killpg(int pgrp, int sig);
139  extern int sigaltstack(const stack_t *ss, stack_t *oss);
140  
141  extern void psiginfo(const siginfo_t* si, const char* message);
142  extern void psignal(int signal_number, const char* message);
143  
144  __END_DECLS
145  
146  #endif /* _SIGNAL_H_ */
147