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$");
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