summary refs log tree commit diff
path: root/signal
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
committerRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
commit28f540f45bbacd939bfd07f213bcad2bf730b1bf (patch)
tree15f07c4c43d635959c6afee96bde71fb1b3614ee /signal
downloadglibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.gz
glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.xz
glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.zip
initial import
Diffstat (limited to 'signal')
-rw-r--r--signal/.cvsignore4
-rw-r--r--signal/Makefile40
-rw-r--r--signal/gsignal.c28
-rw-r--r--signal/sigaddset.c32
-rw-r--r--signal/sigdelset.c32
-rw-r--r--signal/sigempty.c32
-rw-r--r--signal/sigfillset.c32
-rw-r--r--signal/sigismem.c32
-rw-r--r--signal/signal.h248
-rw-r--r--signal/sigsetops.c6
-rw-r--r--signal/sigsetops.h34
-rw-r--r--signal/ssignal.c29
-rw-r--r--signal/sys/signal.h1
-rw-r--r--signal/tst-signal.c44
14 files changed, 594 insertions, 0 deletions
diff --git a/signal/.cvsignore b/signal/.cvsignore
new file mode 100644
index 0000000000..1f69fd919a
--- /dev/null
+++ b/signal/.cvsignore
@@ -0,0 +1,4 @@
+*.gz *.Z *.tar *.tgz
+=*
+TODO COPYING* AUTHORS copyr-* copying.*
+glibc-*
diff --git a/signal/Makefile b/signal/Makefile
new file mode 100644
index 0000000000..a6e89ad43c
--- /dev/null
+++ b/signal/Makefile
@@ -0,0 +1,40 @@
+# Copyright (C) 1991, 1992, 1993, 1994, 1995 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.
+
+#
+#	Makefile for signal routines.
+#
+subdir	:= signal
+
+headers	:= signal.h sys/signal.h signum.h sigcontext.h sigaction.h sigset.h
+
+routines	:= signal raise killpg \
+		   sigaction sigprocmask kill \
+		   sigpending sigsuspend \
+		   sigblock sigsetmask sigpause sigvec \
+		   sigstack sigaltstack sigintr \
+		   sigsetops sigempty sigfillset sigaddset sigdelset sigismem \
+		   sigreturn \
+		   gsignal ssignal
+
+tests		:= tst-signal
+
+distribute	:= sigsetops.h
+
+
+include ../Rules
diff --git a/signal/gsignal.c b/signal/gsignal.c
new file mode 100644
index 0000000000..f5b79a991d
--- /dev/null
+++ b/signal/gsignal.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1991, 1995 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 <signal.h>
+
+#undef	gsignal
+
+int
+gsignal (sig)
+     int sig;
+{
+  return raise (sig);
+}
diff --git a/signal/sigaddset.c b/signal/sigaddset.c
new file mode 100644
index 0000000000..b9ac34dd5b
--- /dev/null
+++ b/signal/sigaddset.c
@@ -0,0 +1,32 @@
+/* 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 "sigsetops.h"
+
+/* Add SIGNO to SET.  */
+int
+DEFUN(sigaddset, (set, signo), sigset_t *set AND int signo)
+{
+  if (set == NULL || signo <= 0 || signo >= NSIG)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  return __sigaddset (set, signo);
+}
diff --git a/signal/sigdelset.c b/signal/sigdelset.c
new file mode 100644
index 0000000000..07e880f9c4
--- /dev/null
+++ b/signal/sigdelset.c
@@ -0,0 +1,32 @@
+/* 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 "sigsetops.h"
+
+/* Add SIGNO to SET.  */
+int
+DEFUN(sigdelset, (set, signo), sigset_t *set AND int signo)
+{
+  if (set == NULL || signo <= 0 || signo >= NSIG)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  return __sigdelset (set, signo);
+}
diff --git a/signal/sigempty.c b/signal/sigempty.c
new file mode 100644
index 0000000000..0ec129ded4
--- /dev/null
+++ b/signal/sigempty.c
@@ -0,0 +1,32 @@
+/* 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 "sigsetops.h"
+
+/* Clear all signals from SET.  */
+int
+DEFUN(sigemptyset, (set), sigset_t *set)
+{
+  if (set == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  return __sigemptyset (set);
+}
diff --git a/signal/sigfillset.c b/signal/sigfillset.c
new file mode 100644
index 0000000000..88c1833b55
--- /dev/null
+++ b/signal/sigfillset.c
@@ -0,0 +1,32 @@
+/* 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 "sigsetops.h"
+
+/* Set all signals in SET.  */
+int
+DEFUN(sigfillset, (set), sigset_t *set)
+{
+  if (set == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  return __sigfillset (set);
+}
diff --git a/signal/sigismem.c b/signal/sigismem.c
new file mode 100644
index 0000000000..36c04db5e2
--- /dev/null
+++ b/signal/sigismem.c
@@ -0,0 +1,32 @@
+/* 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 "sigsetops.h"
+
+/* Return 1 if SIGNO is in SET, 0 if not.  */
+int
+DEFUN(sigismember, (set, signo), CONST sigset_t *set AND int signo)
+{
+  if (set == NULL || signo <= 0 || signo >= NSIG)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  return __sigismember (set, signo);
+}
diff --git a/signal/signal.h b/signal/signal.h
new file mode 100644
index 0000000000..a6db005721
--- /dev/null
+++ b/signal/signal.h
@@ -0,0 +1,248 @@
+/* Copyright (C) 1991, 1992, 1993, 1994 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, 1992 Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/*
+ *	ANSI Standard: 4.7 SIGNAL HANDLING <signal.h>
+ */
+
+#ifndef	_SIGNAL_H
+
+#if	!defined(__need_sig_atomic_t) && !defined(__need_sigset_t)
+#define	_SIGNAL_H	1
+#include <features.h>
+#endif
+
+__BEGIN_DECLS
+
+#define	 __need_size_t
+#include <stddef.h>
+
+#include <gnu/types.h>
+#include <sigset.h>		/* __sigset_t, __sig_atomic_t.  */
+
+#if	!defined(__sig_atomic_t_defined) &&	\
+  (defined(_SIGNAL_H) || defined(__need_sig_atomic_t))
+/* An integral type that can be modified atomically, without the
+   possibility of a signal arriving in the middle of the operation.  */
+typedef __sig_atomic_t sig_atomic_t;
+#endif /* `sig_atomic_t' undefined and <signal.h> or need `sig_atomic_t'.  */
+#undef	__need_sig_atomic_t
+
+#ifdef	_SIGNAL_H
+
+#include <signum.h>
+
+/* Type of a signal handler.  */
+typedef void (*__sighandler_t) __P ((int));
+
+/* Set the handler for the signal SIG to HANDLER,
+   returning the old handler, or SIG_ERR on error.  */
+extern __sighandler_t signal __P ((int __sig, __sighandler_t __handler));
+
+/* Send signal SIG to process number PID.  If PID is zero,
+   send SIG to all processes in the current process's process group.
+   If PID is < -1, send SIG to all processes in process group - PID.  */
+extern int __kill __P ((__pid_t __pid, int __sig));
+#ifdef	__USE_POSIX
+extern int kill __P ((__pid_t __pid, int __sig));
+#endif /* Use POSIX.  */
+
+#ifdef	__USE_BSD
+/* Send SIG to all processes in process group PGRP.
+   If PGRP is zero, send SIG to all processes in
+   the current process's process group.  */
+extern int killpg __P ((__pid_t __pgrp, int __sig));
+#endif /* Use BSD.  */
+
+/* Raise signal SIG, i.e., send SIG to yourself.  */
+extern int raise __P ((int __sig));
+
+#ifdef	__USE_SVID
+/* SVID names for the same things.  */
+extern __sighandler_t ssignal __P ((int __sig, __sighandler_t __handler));
+extern int gsignal __P ((int __sig));
+#endif /* Use SVID.  */
+
+#ifdef	__USE_MISC
+/* Print a message describing the meaning of the given signal number.  */
+extern void psignal __P ((int __sig, __const char *__s));
+#endif /* Use misc.  */
+
+
+/* Block signals in MASK, returning the old mask.  */
+extern int __sigblock __P ((int __mask));
+
+/* Set the mask of blocked signals to MASK, returning the old mask.  */
+extern int __sigsetmask __P ((int __mask));
+
+/* Set the mask of blocked signals to MASK,
+   wait for a signal to arrive, and then restore the mask.  */
+extern int __sigpause __P ((int __mask));
+
+#ifdef	__USE_BSD
+#define	sigmask(sig)	__sigmask(sig)
+
+extern int sigblock __P ((int __mask));
+extern int sigsetmask __P ((int __mask));
+extern int sigpause __P ((int __mask));
+#endif /* Use BSD.  */
+
+
+#ifdef	__USE_MISC
+#define	NSIG	_NSIG
+#endif
+
+#ifdef	__USE_GNU
+typedef __sighandler_t sighandler_t;
+#endif
+
+#endif /* <signal.h> included.  */
+
+
+#ifdef	__USE_POSIX
+
+#if	!defined(__sigset_t_defined) &&	\
+   (defined(_SIGNAL_H) || defined(__need_sigset_t))
+typedef __sigset_t sigset_t;
+#define	__sigset_t_defined	1
+#endif /* `sigset_t' not defined and <signal.h> or need `sigset_t'.  */
+#undef	__need_sigset_t
+
+#ifdef	_SIGNAL_H
+
+/* Clear all signals from SET.  */
+extern int sigemptyset __P ((sigset_t *__set));
+
+/* Set all signals in SET.  */
+extern int sigfillset __P ((sigset_t *__set));
+
+/* Add SIGNO to SET.  */
+extern int sigaddset __P ((sigset_t *__set, int __signo));
+
+/* Remove SIGNO from SET.  */
+extern int sigdelset __P ((sigset_t *__set, int __signo));
+
+/* Return 1 if SIGNO is in SET, 0 if not.  */
+extern int sigismember __P ((__const sigset_t *__set, int signo));
+
+#ifdef	__OPTIMIZE__
+/* <sigset.h> defines the __ versions as macros that do the work.  */
+#define	sigemptyset(set)	__sigemptyset(set)
+#define	sigfillset(set)		__sigfillset(set)
+#define	sigaddset(set, signo)	__sigaddset(set, signo)
+#define	sigdelset(set, signo)	__sigdelset(set, signo)
+#define	sigismember(set, signo)	__sigismember(set, signo)
+#endif
+
+/* Get the system-specific definitions of `struct sigaction'
+   and the `SA_*' and `SIG_*'. constants.  */
+#include <sigaction.h>
+
+/* Get and/or change the set of blocked signals.  */
+extern int __sigprocmask __P ((int __how,
+			       __const sigset_t *__set, sigset_t *__oset));
+extern int sigprocmask __P ((int __how,
+			     __const sigset_t *__set, sigset_t *__oset));
+
+/* Change the set of blocked signals to SET,
+   wait until a signal arrives, and restore the set of blocked signals.  */
+extern int sigsuspend __P ((__const sigset_t *__set));
+
+/* Get and/or set the action for signal SIG.  */
+extern int __sigaction __P ((int __sig, __const struct sigaction *__act,
+			     struct sigaction *__oact));
+extern int sigaction __P ((int __sig, __const struct sigaction *__act,
+			   struct sigaction *__oact));
+
+/* Put in SET all signals that are blocked and waiting to be delivered.  */
+extern int sigpending __P ((sigset_t *__set));
+
+#endif /* <signal.h> included.  */
+
+#endif /* Use POSIX.  */
+
+#if	defined(_SIGNAL_H) && defined(__USE_BSD)
+
+/* Structure passed to `sigvec'.  */
+struct sigvec
+  {
+    __sighandler_t sv_handler;	/* Signal handler.  */
+    int sv_mask;		/* Mask of signals to be blocked.  */
+
+    int sv_flags;		/* Flags (see below).  */
+#define	sv_onstack	sv_flags /* 4.2 BSD compatibility.  */
+  };
+
+/* Bits in `sv_flags'.  */
+#define	SV_ONSTACK	(1 << 0)/* Take the signal on the signal stack.  */
+#define	SV_INTERRUPT	(1 << 1)/* Do not restart system calls.  */
+#define	SV_RESETHAND	(1 << 2)/* Reset handler to SIG_DFL on receipt.  */
+
+
+/* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member
+   of VEC.  The signals in `sv_mask' will be blocked while the handler runs.
+   If the SV_RESETHAND bit is set in `sv_flags', the handler for SIG will be
+   reset to SIG_DFL before `sv_handler' is entered.  If OVEC is non-NULL,
+   it is filled in with the old information for SIG.  */
+extern int __sigvec __P ((int __sig, __const struct sigvec *__vec,
+			  struct sigvec *__ovec));
+extern int sigvec __P ((int __sig, __const struct sigvec *__vec,
+			struct sigvec *__ovec));
+
+
+/* If INTERRUPT is nonzero, make signal SIG interrupt system calls
+   (causing them to fail with EINTR); if INTERRUPT is zero, make system
+   calls be restarted after signal SIG.  */
+extern int siginterrupt __P ((int __sig, int __interrupt));
+
+
+/* Structure describing a signal stack.  */
+struct sigstack
+  {
+    __ptr_t ss_sp;		/* Signal stack pointer.  */
+    int ss_onstack;		/* Nonzero if executing on this stack.  */
+  };
+
+/* Run signals handlers on the stack specified by SS (if not NULL).
+   If OSS is not NULL, it is filled in with the old signal stack status.  */
+extern int sigstack __P ((__const struct sigstack *__ss,
+			  struct sigstack *__oss));
+
+/* Alternate interface.  */
+struct sigaltstack
+  {
+    __ptr_t ss_sp;
+    size_t ss_size;
+    int ss_flags;
+  };
+
+extern int sigaltstack __P ((__const struct sigaltstack *__ss,
+			     struct sigaltstack *__oss));
+
+/* Get machine-dependent `struct sigcontext' and signal subcodes.  */
+#include <sigcontext.h>
+
+/* Restore the state saved in SCP.  */
+extern int __sigreturn __P ((struct sigcontext *__scp));
+extern int sigreturn __P ((struct sigcontext *__scp));
+
+#endif /* signal.h included and use BSD.  */
+
+__END_DECLS
+
+#endif /* signal.h  */
diff --git a/signal/sigsetops.c b/signal/sigsetops.c
new file mode 100644
index 0000000000..758ddd1e22
--- /dev/null
+++ b/signal/sigsetops.c
@@ -0,0 +1,6 @@
+/* Define the real-function versions of all inline functions
+   defined in signal.h (or sigset.h).  */
+
+#define _EXTERN_INLINE
+
+#include "signal.h"
diff --git a/signal/sigsetops.h b/signal/sigsetops.h
new file mode 100644
index 0000000000..972aa69c63
--- /dev/null
+++ b/signal/sigsetops.h
@@ -0,0 +1,34 @@
+/* Copyright (C) 1991, 1995 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.  */
+
+/* Definitions relevant to functions that operate on `sigset_t's.  */
+
+#include <ansidecl.h>
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+
+#define	BITS		(_NSIG - 1)
+#define	ELT(signo)	(((signo) - 1) / BITS)
+#define	MASK(signo)	(1 << (((signo) - 1) % BITS))
+
+#undef	sigemptyset
+#undef	sigfillset
+#undef	sigaddset
+#undef	sigdelset
+#undef	sigismember
diff --git a/signal/ssignal.c b/signal/ssignal.c
new file mode 100644
index 0000000000..54ab7f0f45
--- /dev/null
+++ b/signal/ssignal.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1991, 1992, 1995 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 <signal.h>
+
+#undef	ssignal
+
+__sighandler_t 
+ssignal (sig, func)
+     int sig;
+     __sighandler_t func;
+{
+  return signal (sig, func);
+}
diff --git a/signal/sys/signal.h b/signal/sys/signal.h
new file mode 100644
index 0000000000..2e602dad89
--- /dev/null
+++ b/signal/sys/signal.h
@@ -0,0 +1 @@
+#include <signal.h>
diff --git a/signal/tst-signal.c b/signal/tst-signal.c
new file mode 100644
index 0000000000..f622842f7a
--- /dev/null
+++ b/signal/tst-signal.c
@@ -0,0 +1,44 @@
+#include <ansidecl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int win = 0;
+
+void
+DEFUN(handler, (sig), int sig)
+{
+  printf("Received signal %d (%s).\n", sig, strsignal(sig));
+  win = 1;
+}
+
+int
+DEFUN_VOID(main)
+{
+  if (signal(SIGTERM, handler) == SIG_ERR)
+    {
+      perror("signal: SIGTERM");
+      exit(EXIT_FAILURE);
+    }
+
+  puts("Set handler.");
+
+  printf("Sending myself signal %d.\n", SIGTERM);
+  fflush(stdout);
+
+  if (raise(SIGTERM) < 0)
+    {
+      perror("raise: SIGTERM");
+      exit(EXIT_FAILURE);
+    }
+
+  if (!win)
+    {
+      puts("Didn't get any signal.  Test FAILED!");
+      exit(EXIT_FAILURE);
+    }
+
+  puts("Got a signal.  Test succeeded.");
+  exit(EXIT_SUCCESS);
+}