Clean up signal handling slightly

diff --git a/include/signal.h b/include/signal.h
index d417e40..8b99573 100644
--- a/include/signal.h
+++ b/include/signal.h
@@ -27,35 +27,37 @@
 /* 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 07fd378..81fe510 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -21,7 +21,7 @@
 	  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 0000000..b5081d3
--- /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 0000000..9acc867
--- /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 d417e40..8b99573 100644
--- a/klibc/include/signal.h
+++ b/klibc/include/signal.h
@@ -27,35 +27,37 @@
 /* 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 9dd5abd..982d0c6 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);
 }
-
-