1704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* 2704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * Copyright (C) 2008 The Android Open Source Project 3704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * All rights reserved. 4704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * 5704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 6704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * modification, are permitted provided that the following conditions 7704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * are met: 8704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * * Redistributions of source code must retain the above copyright 9704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 10704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * * Redistributions in binary form must reproduce the above copyright 11704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * notice, this list of conditions and the following disclaimer in 12704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * the documentation and/or other materials provided with the 13704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * distribution. 14704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * 15704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner * SUCH DAMAGE. 27704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner */ 28704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#ifndef _SIGNAL_H_ 29704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#define _SIGNAL_H_ 30704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 31704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <sys/cdefs.h> 32704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <limits.h> /* For LONG_BIT */ 33704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <string.h> /* For memset() */ 34704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <sys/types.h> 35704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <asm/signal.h> 36704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 37704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#define __ARCH_SI_UID_T __kernel_uid32_t 38704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#include <asm/siginfo.h> 39704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#undef __ARCH_SI_UID_T 40704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 41704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner__BEGIN_DECLS 42704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 43704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnertypedef int sig_atomic_t; 44704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 45704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* crepy NIG / _NSIG handling, just to be safe */ 46704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#ifndef NSIG 47704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner# define NSIG _NSIG 48704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#endif 49704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#ifndef _NSIG 50704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner# define _NSIG NSIG 51704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#endif 52704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 53704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern const char * const sys_siglist[]; 54704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 55704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ int sigismember(sigset_t *set, int signum) 56704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 57704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner unsigned long *local_set = (unsigned long *)set; 58704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner signum--; 59704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return (int)((local_set[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1); 60704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 61704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 62704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 63704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ int sigaddset(sigset_t *set, int signum) 64704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 65704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner unsigned long *local_set = (unsigned long *)set; 66704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner signum--; 67704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner local_set[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT); 68704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return 0; 69704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 70704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 71704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 72704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ int sigdelset(sigset_t *set, int signum) 73704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 74704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner unsigned long *local_set = (unsigned long *)set; 75704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner signum--; 76704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner local_set[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT)); 77704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return 0; 78704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 79704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 80704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 81704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ int sigemptyset(sigset_t *set) 82704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 83704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner memset(set, 0, sizeof *set); 84704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return 0; 85704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 86704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 87704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ int sigfillset(sigset_t *set) 88704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 89704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner memset(set, ~0, sizeof *set); 90704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return 0; 91704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 92704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 93704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 94704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* compatibility types */ 95704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnertypedef void (*sig_t)(int); 96704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnertypedef sig_t sighandler_t; 97704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 98704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* differentiater between sysv and bsd behaviour 8*/ 99704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern __sighandler_t sysv_signal(int, __sighandler_t); 100704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern __sighandler_t bsd_signal(int, __sighandler_t); 101704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 102704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* the default is bsd */ 103704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerstatic __inline__ __sighandler_t signal(int s, __sighandler_t f) 104704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner{ 105704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner return bsd_signal(s,f); 106704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner} 107704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 108704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner/* the syscall itself */ 109704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern __sighandler_t __signal(int, __sighandler_t, int); 110704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 111704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int sigprocmask(int, const sigset_t *, sigset_t *); 112704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int sigaction(int, const struct sigaction *, struct sigaction *); 113704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 114704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int sigpending(sigset_t *); 115704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int sigsuspend(const sigset_t *); 116704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int sigwait(const sigset_t *set, int *sig); 117704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int siginterrupt(int sig, int flag); 118704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 119704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int raise(int); 120704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turnerextern int kill(pid_t, int); 121704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 122704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 123704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner__END_DECLS 124704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner 125704614245e9bed17f68574bc9686c02c43923292David 'Digit' Turner#endif /* _SIGNAL_H_ */ 126