summaryrefslogtreecommitdiffstats
path: root/usr/include/signal.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/include/signal.h')
-rw-r--r--usr/include/signal.h103
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 */