sigcompat.c revision 331722
1331722Seadler/* 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: stable/11/lib/libc/compat-43/sigcompat.c 331722 2018-03-29 02:50:57Z eadler $"); 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 45288041Srodrigcsigvec(int signo, struct sigvec *sv, struct sigvec *osv) 461573Srgrimes{ 4752040Sjdp struct sigaction sa, osa; 4852040Sjdp struct sigaction *sap, *osap; 491573Srgrimes int ret; 501573Srgrimes 5152040Sjdp if (sv != NULL) { 5252040Sjdp sa.sa_handler = sv->sv_handler; 5352040Sjdp sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT; 5452040Sjdp sigemptyset(&sa.sa_mask); 5552040Sjdp sa.sa_mask.__bits[0] = sv->sv_mask; 5652040Sjdp sap = &sa; 5752040Sjdp } else 5852040Sjdp sap = NULL; 5952040Sjdp osap = osv != NULL ? &osa : NULL; 60287292Skib ret = __libc_sigaction(signo, sap, osap); 6152040Sjdp if (ret == 0 && osv != NULL) { 6252040Sjdp osv->sv_handler = osa.sa_handler; 6352040Sjdp osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT; 6452040Sjdp osv->sv_mask = osa.sa_mask.__bits[0]; 6552040Sjdp } 661573Srgrimes return (ret); 671573Srgrimes} 681573Srgrimes 6917141Sjkhint 70288041Srodrigcsigsetmask(int mask) 711573Srgrimes{ 7251794Smarcel sigset_t set, oset; 7351870Smarcel int n; 741573Srgrimes 7551794Smarcel sigemptyset(&set); 7651794Smarcel set.__bits[0] = mask; 77287292Skib n = __libc_sigprocmask(SIG_SETMASK, &set, &oset); 7851870Smarcel if (n) 7951870Smarcel return (n); 8051794Smarcel return (oset.__bits[0]); 811573Srgrimes} 821573Srgrimes 8317141Sjkhint 84288041Srodrigcsigblock(int mask) 851573Srgrimes{ 8651794Smarcel sigset_t set, oset; 8751870Smarcel int n; 881573Srgrimes 8951794Smarcel sigemptyset(&set); 9051794Smarcel set.__bits[0] = mask; 91287292Skib n = __libc_sigprocmask(SIG_BLOCK, &set, &oset); 9251870Smarcel if (n) 9351870Smarcel return (n); 9451794Smarcel return (oset.__bits[0]); 951573Srgrimes} 961573Srgrimes 9717141Sjkhint 98199827Skibsigpause(int mask) 991573Srgrimes{ 10051794Smarcel sigset_t set; 10151794Smarcel 10251794Smarcel sigemptyset(&set); 10351794Smarcel set.__bits[0] = mask; 104287292Skib return (__libc_sigsuspend(&set)); 1051573Srgrimes} 106199827Skib 107199827Skibint 108199827Skibxsi_sigpause(int sig) 109199827Skib{ 110199827Skib sigset_t set; 111199827Skib 112287292Skib if (__libc_sigprocmask(SIG_BLOCK, NULL, &set) == -1) 113209932Skib return (-1); 114210370Skib if (sigdelset(&set, sig) == -1) 115210370Skib return (-1); 116287292Skib return (__libc_sigsuspend(&set)); 117199827Skib} 118199827Skib 119199827Skibint 120199827Skibsighold(int sig) 121199827Skib{ 122199827Skib sigset_t set; 123199827Skib 124199827Skib sigemptyset(&set); 125210370Skib if (sigaddset(&set, sig) == -1) 126210370Skib return (-1); 127287292Skib return (__libc_sigprocmask(SIG_BLOCK, &set, NULL)); 128199827Skib} 129199827Skib 130199827Skibint 131199827Skibsigignore(int sig) 132199827Skib{ 133199827Skib struct sigaction sa; 134199827Skib 135199827Skib bzero(&sa, sizeof(sa)); 136199827Skib sa.sa_handler = SIG_IGN; 137287292Skib return (__libc_sigaction(sig, &sa, NULL)); 138199827Skib} 139199827Skib 140199827Skibint 141199827Skibsigrelse(int sig) 142199827Skib{ 143199827Skib sigset_t set; 144199827Skib 145199827Skib sigemptyset(&set); 146210370Skib if (sigaddset(&set, sig) == -1) 147210370Skib return (-1); 148287292Skib return (__libc_sigprocmask(SIG_UNBLOCK, &set, NULL)); 149199827Skib} 150199827Skib 151199827Skibvoid 152199827Skib(*sigset(int sig, void (*disp)(int)))(int) 153199827Skib{ 154199827Skib sigset_t set, pset; 155199827Skib struct sigaction sa, psa; 156199827Skib 157199827Skib sigemptyset(&set); 158210370Skib if (sigaddset(&set, sig) == -1) 159199827Skib return (SIG_ERR); 160287292Skib if (__libc_sigprocmask(SIG_BLOCK, NULL, &pset) == -1) 161210370Skib return (SIG_ERR); 162199827Skib if ((__sighandler_t *)disp == SIG_HOLD) { 163287292Skib if (__libc_sigprocmask(SIG_BLOCK, &set, &pset) == -1) 164199827Skib return (SIG_ERR); 165199827Skib if (sigismember(&pset, sig)) 166199827Skib return (SIG_HOLD); 167199827Skib else { 168287292Skib if (__libc_sigaction(sig, NULL, &psa) == -1) 169199827Skib return (SIG_ERR); 170199827Skib return (psa.sa_handler); 171199827Skib } 172199827Skib } else { 173287292Skib if (__libc_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1) 174199827Skib return (SIG_ERR); 175199827Skib } 176199827Skib 177199827Skib bzero(&sa, sizeof(sa)); 178199827Skib sa.sa_handler = disp; 179287292Skib if (__libc_sigaction(sig, &sa, &psa) == -1) 180199827Skib return (SIG_ERR); 181199827Skib if (sigismember(&pset, sig)) 182199827Skib return (SIG_HOLD); 183199827Skib else 184199827Skib return (psa.sa_handler); 185199827Skib} 186