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