diff options
Diffstat (limited to 'usr/include/signal.h')
-rw-r--r-- | usr/include/signal.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/usr/include/signal.h b/usr/include/signal.h new file mode 100644 index 0000000..a513282 --- /dev/null +++ b/usr/include/signal.h @@ -0,0 +1,103 @@ +/* + * signal.h + */ + +#ifndef _SIGNAL_H +#define _SIGNAL_H + +#include <klibc/compiler.h> +#include <klibc/extern.h> +#include <string.h> /* For memset() */ +#include <limits.h> /* For LONG_BIT */ +#include <sys/types.h> + +#include <klibc/archsignal.h> /* Includes <asm/signal.h> if appropriate */ + +/* glibc seems to use sig_atomic_t as "int" pretty much on all architectures. + Do the same, but allow the architecture to override. */ +#ifndef _KLIBC_HAS_ARCH_SIG_ATOMIC_T +typedef int sig_atomic_t; +#endif + +/* Some architectures don't define these */ +#ifndef SA_RESETHAND +# define SA_RESETHAND SA_ONESHOT +#endif +#ifndef SA_NODEFER +# define SA_NODEFER SA_NOMASK +#endif +/* Some architectures define NSIG and not _NSIG or vice versa */ +#ifndef NSIG +# define NSIG _NSIG +#endif +#ifndef _NSIG +# define _NSIG NSIG +#endif + +/* If we don't have any real-time signals available to userspace, + hide them all */ +#if SIGRTMAX <= SIGRTMIN +# undef SIGRTMIN +# undef SIGRTMAX +#endif + +/* The kernel header files are inconsistent whether or not + SIGRTMAX is inclusive or exclusive. POSIX seems to state that + it's inclusive, however. */ +#if SIGRTMAX >= _NSIG +# undef SIGRTMAX +# define SIGRTMAX (_NSIG-1) +#endif + +__extern const char *const sys_siglist[_NSIG]; +__extern const char *const sys_sigabbrev[_NSIG]; + +/* This assumes sigset_t is either an unsigned long or an array of such, + and that _NSIG_BPW in the kernel is always LONG_BIT */ + +static __inline__ int sigemptyset(sigset_t * __set) +{ + memset(__set, 0, sizeof *__set); + return 0; +} +static __inline__ int sigfillset(sigset_t * __set) +{ + memset(__set, ~0, sizeof *__set); + return 0; +} +static __inline__ int sigaddset(sigset_t * __set, int __signum) +{ + unsigned long *__lset = (unsigned long *)__set; + __signum--; /* Signal 0 is not in the set */ + __lset[__signum / LONG_BIT] |= 1UL << (__signum % LONG_BIT); + return 0; +} +static __inline__ int sigdelset(sigset_t * __set, int __signum) +{ + unsigned long *__lset = (unsigned long *)__set; + __signum--; /* Signal 0 is not in the set */ + __lset[__signum / LONG_BIT] &= ~(1UL << (__signum % LONG_BIT)); + return 0; +} +static __inline__ int sigismember(sigset_t * __set, int __signum) +{ + unsigned long *__lset = (unsigned long *)__set; + __signum--; /* Signal 0 is not in the set */ + return (int)((__lset[__signum / LONG_BIT] >> (__signum % LONG_BIT)) & + 1); +} + +__extern __sighandler_t __signal(int, __sighandler_t, int); +#ifndef signal +__extern __sighandler_t signal(int, __sighandler_t); +#endif +__extern __sighandler_t sysv_signal(int, __sighandler_t); +__extern __sighandler_t bsd_signal(int, __sighandler_t); +__extern int sigaction(int, const struct sigaction *, struct sigaction *); +__extern int sigprocmask(int, const sigset_t *, sigset_t *); +__extern int sigpending(sigset_t *); +__extern int sigsuspend(const sigset_t *); +__extern int raise(int); +__extern int kill(pid_t, int); + +#endif /* _SIGNAL_H */ |