11573Srgrimes/* 21573Srgrimes * Copyright (c) 1989, 1993 31573Srgrimes * The Regents of the University of California. All rights reserved. 41573Srgrimes * 51573Srgrimes * Redistribution and use in source and binary forms, with or without 61573Srgrimes * modification, are permitted provided that the following conditions 71573Srgrimes * are met: 81573Srgrimes * 1. Redistributions of source code must retain the above copyright 91573Srgrimes * notice, this list of conditions and the following disclaimer. 101573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111573Srgrimes * notice, this list of conditions and the following disclaimer in the 121573Srgrimes * documentation and/or other materials provided with the distribution. 131573Srgrimes * 4. Neither the name of the University nor the names of its contributors 141573Srgrimes * may be used to endorse or promote products derived from this software 151573Srgrimes * without specific prior written permission. 161573Srgrimes * 171573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 181573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201573Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 211573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271573Srgrimes * SUCH DAMAGE. 281573Srgrimes */ 291573Srgrimes 301573Srgrimes#if defined(LIBC_SCCS) && !defined(lint) 311573Srgrimesstatic char sccsid[] = "@(#)sigcompat.c 8.1 (Berkeley) 6/2/93"; 321573Srgrimes#endif /* LIBC_SCCS and not lint */ 3392986Sobrien#include <sys/cdefs.h> 3492986Sobrien__FBSDID("$FreeBSD$"); 351573Srgrimes 3671579Sdeischen#include "namespace.h" 371573Srgrimes#include <sys/param.h> 38209932Skib#include <errno.h> 391573Srgrimes#include <signal.h> 40199827Skib#include <string.h> 4171579Sdeischen#include "un-namespace.h" 4271579Sdeischen#include "libc_private.h" 431573Srgrimes 4417141Sjkhint 451573Srgrimessigvec(signo, sv, osv) 461573Srgrimes int signo; 471573Srgrimes struct sigvec *sv, *osv; 481573Srgrimes{ 4952040Sjdp struct sigaction sa, osa; 5052040Sjdp struct sigaction *sap, *osap; 511573Srgrimes int ret; 521573Srgrimes 5352040Sjdp if (sv != NULL) { 5452040Sjdp sa.sa_handler = sv->sv_handler; 5552040Sjdp sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT; 5652040Sjdp sigemptyset(&sa.sa_mask); 5752040Sjdp sa.sa_mask.__bits[0] = sv->sv_mask; 5852040Sjdp sap = &sa; 5952040Sjdp } else 6052040Sjdp sap = NULL; 6152040Sjdp osap = osv != NULL ? &osa : NULL; 6271579Sdeischen ret = _sigaction(signo, sap, osap); 6352040Sjdp if (ret == 0 && osv != NULL) { 6452040Sjdp osv->sv_handler = osa.sa_handler; 6552040Sjdp osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT; 6652040Sjdp osv->sv_mask = osa.sa_mask.__bits[0]; 6752040Sjdp } 681573Srgrimes return (ret); 691573Srgrimes} 701573Srgrimes 7117141Sjkhint 721573Srgrimessigsetmask(mask) 731573Srgrimes int mask; 741573Srgrimes{ 7551794Smarcel sigset_t set, oset; 7651870Smarcel int n; 771573Srgrimes 7851794Smarcel sigemptyset(&set); 7951794Smarcel set.__bits[0] = mask; 8071579Sdeischen n = _sigprocmask(SIG_SETMASK, &set, &oset); 8151870Smarcel if (n) 8251870Smarcel return (n); 8351794Smarcel return (oset.__bits[0]); 841573Srgrimes} 851573Srgrimes 8617141Sjkhint 871573Srgrimessigblock(mask) 881573Srgrimes int mask; 891573Srgrimes{ 9051794Smarcel sigset_t set, oset; 9151870Smarcel int n; 921573Srgrimes 9351794Smarcel sigemptyset(&set); 9451794Smarcel set.__bits[0] = mask; 9571579Sdeischen n = _sigprocmask(SIG_BLOCK, &set, &oset); 9651870Smarcel if (n) 9751870Smarcel return (n); 9851794Smarcel return (oset.__bits[0]); 991573Srgrimes} 1001573Srgrimes 10117141Sjkhint 102199827Skibsigpause(int mask) 1031573Srgrimes{ 10451794Smarcel sigset_t set; 10551794Smarcel 10651794Smarcel sigemptyset(&set); 10751794Smarcel set.__bits[0] = mask; 10856698Sjasone return (_sigsuspend(&set)); 1091573Srgrimes} 110199827Skib 111199827Skibint 112199827Skibxsi_sigpause(int sig) 113199827Skib{ 114199827Skib sigset_t set; 115199827Skib 116210370Skib if (_sigprocmask(SIG_BLOCK, NULL, &set) == -1) 117209932Skib return (-1); 118210370Skib if (sigdelset(&set, sig) == -1) 119210370Skib return (-1); 120199827Skib return (_sigsuspend(&set)); 121199827Skib} 122199827Skib 123199827Skibint 124199827Skibsighold(int sig) 125199827Skib{ 126199827Skib sigset_t set; 127199827Skib 128199827Skib sigemptyset(&set); 129210370Skib if (sigaddset(&set, sig) == -1) 130210370Skib return (-1); 131199827Skib return (_sigprocmask(SIG_BLOCK, &set, NULL)); 132199827Skib} 133199827Skib 134199827Skibint 135199827Skibsigignore(int sig) 136199827Skib{ 137199827Skib struct sigaction sa; 138199827Skib 139199827Skib bzero(&sa, sizeof(sa)); 140199827Skib sa.sa_handler = SIG_IGN; 141199827Skib return (_sigaction(sig, &sa, NULL)); 142199827Skib} 143199827Skib 144199827Skibint 145199827Skibsigrelse(int sig) 146199827Skib{ 147199827Skib sigset_t set; 148199827Skib 149199827Skib sigemptyset(&set); 150210370Skib if (sigaddset(&set, sig) == -1) 151210370Skib return (-1); 152199827Skib return (_sigprocmask(SIG_UNBLOCK, &set, NULL)); 153199827Skib} 154199827Skib 155199827Skibvoid 156199827Skib(*sigset(int sig, void (*disp)(int)))(int) 157199827Skib{ 158199827Skib sigset_t set, pset; 159199827Skib struct sigaction sa, psa; 160199827Skib 161199827Skib sigemptyset(&set); 162210370Skib if (sigaddset(&set, sig) == -1) 163199827Skib return (SIG_ERR); 164210370Skib if (_sigprocmask(SIG_BLOCK, NULL, &pset) == -1) 165210370Skib return (SIG_ERR); 166199827Skib if ((__sighandler_t *)disp == SIG_HOLD) { 167210370Skib if (_sigprocmask(SIG_BLOCK, &set, &pset) == -1) 168199827Skib return (SIG_ERR); 169199827Skib if (sigismember(&pset, sig)) 170199827Skib return (SIG_HOLD); 171199827Skib else { 172210370Skib if (_sigaction(sig, NULL, &psa) == -1) 173199827Skib return (SIG_ERR); 174199827Skib return (psa.sa_handler); 175199827Skib } 176199827Skib } else { 177210370Skib if (_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1) 178199827Skib return (SIG_ERR); 179199827Skib } 180199827Skib 181199827Skib bzero(&sa, sizeof(sa)); 182199827Skib sa.sa_handler = disp; 183210370Skib if (_sigaction(sig, &sa, &psa) == -1) 184199827Skib return (SIG_ERR); 185199827Skib if (sigismember(&pset, sig)) 186199827Skib return (SIG_HOLD); 187199827Skib else 188199827Skib return (psa.sa_handler); 189199827Skib} 190