aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2002-11-15 07:33:51 +0000
committerH. Peter Anvin <hpa@zytor.com>2002-11-15 07:33:51 +0000
commit99f7621951a63681f478bd28a518924829f77054 (patch)
tree195dc1d9aa4f8063df4895f48e864133cd23811a
parent75fc627977994868206aa366caa98daf904a16dc (diff)
downloadklibc-99f7621951a63681f478bd28a518924829f77054.tar.gz
Clean up signal handling slightlyklibc-0.71
-rw-r--r--include/signal.h28
-rw-r--r--klibc/Makefile2
-rw-r--r--klibc/__signal.c22
-rw-r--r--klibc/bsd_signal.c11
-rw-r--r--klibc/include/signal.h28
-rw-r--r--klibc/signal.c15
6 files changed, 66 insertions, 40 deletions
diff --git a/include/signal.h b/include/signal.h
index d417e40c16f0c..8b99573446119 100644
--- a/include/signal.h
+++ b/include/signal.h
@@ -27,35 +27,37 @@ __extern const char * const sys_siglist[];
/* 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)
+static __inline__ int sigemptyset(sigset_t *__set)
{
- memset(set, 0, sizeof *set);
+ memset(__set, 0, sizeof *__set);
return 0;
}
-static __inline__ int sigfillset(sigset_t *set)
+static __inline__ int sigfillset(sigset_t *__set)
{
- memset(set, ~0, sizeof *set);
+ memset(__set, ~0, sizeof *__set);
return 0;
}
-static __inline__ int sigaddset(sigset_t *set, int signum)
+static __inline__ int sigaddset(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- lset[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT);
+ unsigned long *__lset = (unsigned long *)__set;
+ __lset[__signum/LONG_BIT] |= 1UL << (__signum%LONG_BIT);
return 0;
}
-static __inline__ int sigdelset(sigset_t *set, int signum)
+static __inline__ int sigdelset(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- lset[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT));
+ unsigned long *__lset = (unsigned long *)__set;
+ __lset[__signum/LONG_BIT] &= ~(1UL << (__signum%LONG_BIT));
return 0;
}
-static __inline__ int sigismember(sigset_t *set, int signum)
+static __inline__ int sigismember(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- return (int)((lset[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1);
+ unsigned long *__lset = (unsigned long *)__set;
+ return (int)((__lset[__signum/LONG_BIT] >> (__signum%LONG_BIT)) & 1);
}
+__extern __sighandler_t __signal(int, __sighandler_t, int);
__extern __sighandler_t 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 *);
diff --git a/klibc/Makefile b/klibc/Makefile
index 07fd3786c1a42..81fe510a4d564 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -21,7 +21,7 @@ LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \
printf.o vprintf.o fprintf.o vfprintf.o perror.o \
fopen.o fread.o fread2.o fwrite.o fwrite2.o fputc.o fputs.o puts.o \
sleep.o usleep.o raise.o abort.o assert.o alarm.o pause.o \
- signal.o siglist.o siglongjmp.o \
+ __signal.o signal.o bsd_signal.o siglist.o siglongjmp.o \
sigaction.o sigpending.o sigprocmask.o sigsuspend.o \
brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o \
memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \
diff --git a/klibc/__signal.c b/klibc/__signal.c
new file mode 100644
index 0000000000000..b5081d386b498
--- /dev/null
+++ b/klibc/__signal.c
@@ -0,0 +1,22 @@
+/*
+ * __signal.c
+ */
+
+#include <signal.h>
+
+__sighandler_t __signal(int signum, __sighandler_t handler, int flags)
+{
+ struct sigaction sa;
+
+ sa.sa_handler = handler;
+ sa.sa_flags = flags;
+ sigemptyset(&sa.sa_mask);
+
+ if ( sigaction(signum, &sa, &sa) ) {
+ return (__sighandler_t)SIG_ERR;
+ } else {
+ return (__sighandler_t)sa.sa_handler;
+ }
+}
+
+
diff --git a/klibc/bsd_signal.c b/klibc/bsd_signal.c
new file mode 100644
index 0000000000000..9acc867a36353
--- /dev/null
+++ b/klibc/bsd_signal.c
@@ -0,0 +1,11 @@
+/*
+ * bsd_signal.c
+ */
+
+#include <signal.h>
+
+__sighandler_t bsd_signal(int signum, __sighandler_t handler)
+{
+ /* BSD signal() semantics */
+ return __signal(signum, handler, SA_RESTART);
+}
diff --git a/klibc/include/signal.h b/klibc/include/signal.h
index d417e40c16f0c..8b99573446119 100644
--- a/klibc/include/signal.h
+++ b/klibc/include/signal.h
@@ -27,35 +27,37 @@ __extern const char * const sys_siglist[];
/* 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)
+static __inline__ int sigemptyset(sigset_t *__set)
{
- memset(set, 0, sizeof *set);
+ memset(__set, 0, sizeof *__set);
return 0;
}
-static __inline__ int sigfillset(sigset_t *set)
+static __inline__ int sigfillset(sigset_t *__set)
{
- memset(set, ~0, sizeof *set);
+ memset(__set, ~0, sizeof *__set);
return 0;
}
-static __inline__ int sigaddset(sigset_t *set, int signum)
+static __inline__ int sigaddset(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- lset[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT);
+ unsigned long *__lset = (unsigned long *)__set;
+ __lset[__signum/LONG_BIT] |= 1UL << (__signum%LONG_BIT);
return 0;
}
-static __inline__ int sigdelset(sigset_t *set, int signum)
+static __inline__ int sigdelset(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- lset[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT));
+ unsigned long *__lset = (unsigned long *)__set;
+ __lset[__signum/LONG_BIT] &= ~(1UL << (__signum%LONG_BIT));
return 0;
}
-static __inline__ int sigismember(sigset_t *set, int signum)
+static __inline__ int sigismember(sigset_t *__set, int __signum)
{
- unsigned long *lset = (unsigned long *)set;
- return (int)((lset[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1);
+ unsigned long *__lset = (unsigned long *)__set;
+ return (int)((__lset[__signum/LONG_BIT] >> (__signum%LONG_BIT)) & 1);
}
+__extern __sighandler_t __signal(int, __sighandler_t, int);
__extern __sighandler_t 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 *);
diff --git a/klibc/signal.c b/klibc/signal.c
index 9dd5abd409049..982d0c659d255 100644
--- a/klibc/signal.c
+++ b/klibc/signal.c
@@ -6,17 +6,6 @@
__sighandler_t signal(int signum, __sighandler_t handler)
{
- struct sigaction sa;
-
- sa.sa_handler = handler;
- sa.sa_flags = SA_RESETHAND; /* SysV/Linux signal() semantic */
- sigemptyset(&sa.sa_mask);
-
- if ( sigaction(signum, &sa, &sa) ) {
- return (__sighandler_t)SIG_ERR;
- } else {
- return (__sighandler_t)sa.sa_handler;
- }
+ /* Linux/SysV signal() semantics */
+ return __signal(signum, handler, SA_RESETHAND);
}
-
-