1bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*	$OpenBSD: sigaction.c,v 1.4 2001/01/22 18:01:48 millert Exp $	*/
2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/****************************************************************************
4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 1998,2000 Free Software Foundation, Inc.                   *
5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *                                                                          *
6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Permission is hereby granted, free of charge, to any person obtaining a  *
7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copy of this software and associated documentation files (the            *
8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * "Software"), to deal in the Software without restriction, including      *
9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * without limitation the rights to use, copy, modify, merge, publish,      *
10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * distribute, distribute with modifications, sublicense, and/or sell       *
11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copies of the Software, and to permit persons to whom the Software is    *
12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * furnished to do so, subject to the following conditions:                 *
13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *                                                                          *
14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * The above copyright notice and this permission notice shall be included  *
15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * in all copies or substantial portions of the Software.                   *
16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *                                                                          *
17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *                                                                          *
25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Except as contained in this notice, the name(s) of the above copyright   *
26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * holders shall not be used in advertising or otherwise to promote the     *
27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * sale, use or other dealings in this Software without prior written       *
28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * authorization.                                                           *
29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ****************************************************************************/
30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/****************************************************************************
32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ****************************************************************************/
35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* OPENBSD ORIGINAL: lib/libcurses/base/sigaction.c */
37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h"
39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <errno.h>
40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <signal.h>
41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "sigact.h"
42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* This file provides sigaction() emulation using sigvec() */
44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Use only if this is non POSIX system */
45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#if !HAVE_SIGACTION && HAVE_SIGVEC
47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigaction(int sig, struct sigaction *sigact, struct sigaction *osigact)
50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return sigvec(sig, sigact ? &sigact->sv : NULL,
52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    osigact ? &osigact->sv : NULL);
53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigemptyset (sigset_t *mask)
57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	*mask = 0;
63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 0;
64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigprocmask (int mode, sigset_t *mask, sigset_t *omask)
68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	sigset_t current = sigsetmask(0);
70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (omask)
77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		*omask = current;
78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (mode == SIG_BLOCK)
80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		current |= *mask;
81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	else if (mode == SIG_UNBLOCK)
82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		current &= ~*mask;
83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	else if (mode == SIG_SETMASK)
84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	current = *mask;
85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	sigsetmask(current);
87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 0;
88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigsuspend (sigset_t *mask)
92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
95bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return sigpause(*mask);
98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
101bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigdelset (sigset_t *mask, int sig)
102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
103bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
104bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
106bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
107bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	*mask &= ~sigmask(sig);
108bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 0;
109bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
110bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
111bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
112bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigaddset (sigset_t *mask, int sig)
113bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
114bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
115bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
116bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
117bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
118bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	*mask |= sigmask(sig);
119bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 0;
120bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
121bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
122bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
123bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmansigismember (sigset_t *mask, int sig)
124bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
125bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!mask) {
126bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		errno = EINVAL;
127bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return -1;
128bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
129bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return (*mask & sigmask(sig)) != 0;
130bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
131bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
132bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
133