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