home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigpreempt,v $
- * $Date: 1996/10/30 22:04:51 $
- * $Revision: 1.1 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: sigpreempt,v $
- * Revision 1.1 1996/10/30 22:04:51 unixlib
- * Initial revision
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: sigpreempt,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
-
- /* Signal pre-emption implementation. */
-
- #include <errno.h>
- #include <signal.h>
- #include <unixlib/sigstate.h>
- #include <sys/unix.h>
-
- int unixlib_preempt_signals (struct unixlib_signal_preempt *preempter,
- int signo, int first_code, int last_code,
- sighandler_t (*handler) (int, int, int))
- {
- if (signo <= 0 || signo >= NSIG)
- {
- errno = EINVAL;
- return -1;
- }
- preempter->first = first_code;
- preempter->last = last_code;
- preempter->handler = handler;
- preempter->next = __u->sigpreempt[signo];
- __u->sigpreempt[signo] = preempter;
-
- return 0;
- }
-
- /* Remove PREEMPTER from the chain for SIGNO. */
-
- int
- unixlib_unpreempt_signals (struct unixlib_signal_preempt *preempter, int signo)
- {
- struct unixlib_signal_preempt *p, *lastp;
-
- if (signo <= 0 || signo >= NSIG)
- {
- errno = EINVAL;
- return -1;
- }
-
- for (p = __u->sigpreempt[signo], lastp = NULL;
- p != NULL; lastp = p, p = p->next)
- if (p == preempter)
- {
- if (lastp == NULL)
- __u->sigpreempt[signo] = p->next;
- else
- lastp->next = p->next;
- return 0;
- }
- __u->sigpreempt[signo] = preempter;
- errno = ENOENT;
- return -1;
- }
-