diff options
author | H. Peter Anvin <hpa@zytor.com> | 2002-11-15 07:33:51 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2002-11-15 07:33:51 +0000 |
commit | 99f7621951a63681f478bd28a518924829f77054 (patch) | |
tree | 195dc1d9aa4f8063df4895f48e864133cd23811a | |
parent | 75fc627977994868206aa366caa98daf904a16dc (diff) | |
download | klibc-99f7621951a63681f478bd28a518924829f77054.tar.gz |
Clean up signal handling slightlyklibc-0.71
-rw-r--r-- | include/signal.h | 28 | ||||
-rw-r--r-- | klibc/Makefile | 2 | ||||
-rw-r--r-- | klibc/__signal.c | 22 | ||||
-rw-r--r-- | klibc/bsd_signal.c | 11 | ||||
-rw-r--r-- | klibc/include/signal.h | 28 | ||||
-rw-r--r-- | klibc/signal.c | 15 |
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); } - - |