From 28f540f45bbacd939bfd07f213bcad2bf730b1bf Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 18 Feb 1995 01:27:10 +0000 Subject: initial import --- signal/.cvsignore | 4 + signal/Makefile | 40 +++++++++ signal/gsignal.c | 28 ++++++ signal/sigaddset.c | 32 +++++++ signal/sigdelset.c | 32 +++++++ signal/sigempty.c | 32 +++++++ signal/sigfillset.c | 32 +++++++ signal/sigismem.c | 32 +++++++ signal/signal.h | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++ signal/sigsetops.c | 6 ++ signal/sigsetops.h | 34 +++++++ signal/ssignal.c | 29 ++++++ signal/sys/signal.h | 1 + signal/tst-signal.c | 44 ++++++++++ 14 files changed, 594 insertions(+) create mode 100644 signal/.cvsignore create mode 100644 signal/Makefile create mode 100644 signal/gsignal.c create mode 100644 signal/sigaddset.c create mode 100644 signal/sigdelset.c create mode 100644 signal/sigempty.c create mode 100644 signal/sigfillset.c create mode 100644 signal/sigismem.c create mode 100644 signal/signal.h create mode 100644 signal/sigsetops.c create mode 100644 signal/sigsetops.h create mode 100644 signal/ssignal.c create mode 100644 signal/sys/signal.h create mode 100644 signal/tst-signal.c (limited to 'signal') 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 + +#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 + */ + +#ifndef _SIGNAL_H + +#if !defined(__need_sig_atomic_t) && !defined(__need_sigset_t) +#define _SIGNAL_H 1 +#include +#endif + +__BEGIN_DECLS + +#define __need_size_t +#include + +#include +#include /* __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 or need `sig_atomic_t'. */ +#undef __need_sig_atomic_t + +#ifdef _SIGNAL_H + +#include + +/* 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 /* 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 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__ +/* 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 + +/* 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 /* 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 + +/* 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 +#include +#include +#include + +#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 + +#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 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 +#include +#include +#include +#include + +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); +} -- cgit v1.2.3