summaryrefslogtreecommitdiff
path: root/libc/signal
diff options
context:
space:
mode:
Diffstat (limited to 'libc/signal')
-rw-r--r--libc/signal/Makefile3
-rw-r--r--libc/signal/bsd_sig.c34
-rw-r--r--libc/signal/sigblock.c45
-rw-r--r--libc/signal/siggtmsk.c39
-rw-r--r--libc/signal/sigjmp.c35
-rw-r--r--libc/signal/signal.c20
-rw-r--r--libc/signal/sigpause.c37
-rw-r--r--libc/signal/sigstmsk.c46
8 files changed, 258 insertions, 1 deletions
diff --git a/libc/signal/Makefile b/libc/signal/Makefile
index f59f2cd27..9fb8e1d46 100644
--- a/libc/signal/Makefile
+++ b/libc/signal/Makefile
@@ -24,7 +24,8 @@ TOPDIR=../
include $(TOPDIR)Rules.mak
LIBC=$(TOPDIR)libc.a
-CSRC=raise.c
+CSRC=bsd_sig.c raise.c sigblock.c siggtmsk.c sigjmp.c signal.c sigpause.c sigstmsk.c
+
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
diff --git a/libc/signal/bsd_sig.c b/libc/signal/bsd_sig.c
new file mode 100644
index 000000000..509de87cb
--- /dev/null
+++ b/libc/signal/bsd_sig.c
@@ -0,0 +1,34 @@
+#define __USE_BSD_SIGNAL
+
+#include <signal.h>
+
+#undef signal
+
+/* The `sig' bit is set if the interrupt on it
+ * is enabled via siginterrupt (). */
+extern sigset_t _sigintr;
+
+__sighandler_t
+__bsd_signal (int sig, __sighandler_t handler)
+{
+ int ret;
+ struct sigaction action, oaction;
+ action.sa_handler = handler;
+ __sigemptyset (&action.sa_mask);
+ if (!__sigismember (&_sigintr, sig)) {
+#ifdef SA_RESTART
+ action.sa_flags = SA_RESTART;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ else {
+#ifdef SA_INTERRUPT
+ action.sa_flags = SA_INTERRUPT;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ ret = __sigaction (sig, &action, &oaction);
+ return (ret == -1) ? SIG_ERR : oaction.sa_handler;
+}
diff --git a/libc/signal/sigblock.c b/libc/signal/sigblock.c
new file mode 100644
index 000000000..8edfe0df2
--- /dev/null
+++ b/libc/signal/sigblock.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Block signals in MASK, returning the old mask. */
+int sigblock (int mask)
+{
+ register int sig;
+ sigset_t set, oset;
+
+ if (sigemptyset(&set) < 0)
+ return -1;
+
+ for (sig = 1; sig < NSIG; ++sig)
+ if ((mask & sigmask(sig)) && sigaddset(&set, sig) < 0)
+ return -1;
+
+ if (sigprocmask(SIG_BLOCK, &set, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig))
+ mask |= sigmask(sig);
+
+ return mask;
+}
diff --git a/libc/signal/siggtmsk.c b/libc/signal/siggtmsk.c
new file mode 100644
index 000000000..517cb49fb
--- /dev/null
+++ b/libc/signal/siggtmsk.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Get the mask of blocked signals. */
+int siggetmask()
+{
+ sigset_t oset;
+ register int sig;
+ int mask;
+
+ if (sigprocmask(SIG_SETMASK, 0, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig) == 1)
+ mask |= sigmask(sig);
+
+ return mask;
+}
diff --git a/libc/signal/sigjmp.c b/libc/signal/sigjmp.c
new file mode 100644
index 000000000..ec70e0ec9
--- /dev/null
+++ b/libc/signal/sigjmp.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+/* This function is called by the `sigsetjmp' macro
+ before doing a `__setjmp' on ENV[0].__jmpbuf.
+ Always return zero. */
+
+int
+__sigjmp_save (sigjmp_buf env, int savemask)
+{
+ env[0].__mask_was_saved = (savemask &&
+ sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
+ &env[0].__saved_mask) == 0);
+
+ return 0;
+}
diff --git a/libc/signal/signal.c b/libc/signal/signal.c
new file mode 100644
index 000000000..62af55f38
--- /dev/null
+++ b/libc/signal/signal.c
@@ -0,0 +1,20 @@
+#include <string.h>
+#include <signal.h>
+
+__sighandler_t
+__signal (int sig, __sighandler_t handler, int flags)
+{
+ int ret;
+ struct sigaction action, oaction;
+ memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = handler;
+ action.sa_flags = flags;
+ ret = sigaction (sig, &action, &oaction);
+ return (ret == -1) ? SIG_ERR : oaction.sa_handler;
+}
+
+__sighandler_t
+signal (int sig, __sighandler_t handler)
+{
+ return __signal(sig, handler, (SA_ONESHOT | SA_NOMASK | SA_INTERRUPT) & ~SA_RESTART);
+}
diff --git a/libc/signal/sigpause.c b/libc/signal/sigpause.c
new file mode 100644
index 000000000..ff9809482
--- /dev/null
+++ b/libc/signal/sigpause.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <signal.h>
+
+#undef sigpause
+
+/* Set the mask of blocked signals to MASK,
+ wait for a signal to arrive, and then restore the mask. */
+int sigpause(int mask)
+{
+ sigset_t set;
+ int sig;
+
+ sigemptyset(&set);
+ for (sig = 1; sig < NSIG; ++sig)
+ if (mask & sigmask(sig))
+ sigaddset(&set, sig);
+
+ return sigsuspend (&set);
+}
diff --git a/libc/signal/sigstmsk.c b/libc/signal/sigstmsk.c
new file mode 100644
index 000000000..6b1876b32
--- /dev/null
+++ b/libc/signal/sigstmsk.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Set the mask of blocked signals to MASK, returning the old mask. */
+int sigsetmask (int mask)
+{
+ register int sig;
+ sigset_t set, oset;
+
+ if (sigemptyset(&set) < 0)
+ return -1;
+
+ for (sig = 1; sig < NSIG; ++sig)
+ if ((mask & sigmask(sig)) &&
+ sigaddset(&set, sig) < 0)
+ return -1;
+
+ if (sigprocmask(SIG_SETMASK, &set, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig) == 1)
+ mask |= sigmask(sig);
+
+ return mask;
+}