home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigprocmsk,v $
- * $Date: 1996/10/30 22:04:51 $
- * $Revision: 1.1 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: sigprocmsk,v $
- * Revision 1.1 1996/10/30 22:04:51 unixlib
- * Initial revision
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: sigprocmsk,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
-
- /* signal.c.sigprocmsk: Implementation of the POSIX signal function
- sigprocmask.
-
- Written by Nick Burrett, 5 October 1996. */
-
- #include <errno.h>
- #include <signal.h>
- #include <sys/unix.h>
-
- /* If SET is not NULL, modify the current set of blocked signals
- according to HOW, which may be SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK.
- If OSET is not NULL, store the old set of blocked signals in *OSET.
-
- If invoking sigprocmask causes any pending signals to be unblocked,
- at least one of those signals will be delivered to the process
- before sigprocmask returns. The order in which pending signals
- are delivered is not specified. */
-
- int sigprocmask (int how, const sigset_t *nset, sigset_t *oset)
- {
- unsigned int mask;
- sigset_t set;
-
- if (oset != NULL)
- *oset = __u->sigstate.blocked;
-
- if (nset == NULL)
- return 0;
-
- set = *nset;
-
- /* Don't block SIGKILL or SIGSTOP. */
- if (sigismember (&set, SIGKILL))
- sigdelset (&set, SIGKILL);
-
- if (sigismember (&set, SIGSTOP))
- sigdelset (&set, SIGSTOP);
-
- mask = (unsigned int)set;
-
- if (how == SIG_BLOCK)
- {
- /* This will always block more signals,
- so we don't have to worry about delivering
- pending signals. */
- __u->sigstate.blocked &= mask;
- }
- else if (how == SIG_UNBLOCK)
- {
- __u->sigstate.blocked &= ~mask;
- /* Cause delivery of some pending signals. */
- __unixlib_raise_signal (0, 0, 0, 0);
- }
- else if (how == SIG_SETMASK)
- {
- __u->sigstate.blocked = mask;
- /* The new mask might have unblocked a few signals so try and
- deliver the pending ones. */
- __unixlib_raise_signal (0, 0, 0, 0);
- }
- else
- {
- errno = EINVAL;
- return -1;
- }
- return 0;
- }
-