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