xref: /freebsd/lib/libc/compat-43/sigcompat.c (revision 9a6ceace)
158f0484fSRodney W. Grimes /*
258f0484fSRodney W. Grimes  * Copyright (c) 1989, 1993
358f0484fSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
458f0484fSRodney W. Grimes  *
558f0484fSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
658f0484fSRodney W. Grimes  * modification, are permitted provided that the following conditions
758f0484fSRodney W. Grimes  * are met:
858f0484fSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
958f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
1058f0484fSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
1158f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
1258f0484fSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
1358f0484fSRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
1458f0484fSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
1558f0484fSRodney W. Grimes  *    without specific prior written permission.
1658f0484fSRodney W. Grimes  *
1758f0484fSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1858f0484fSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1958f0484fSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2058f0484fSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2158f0484fSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2258f0484fSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2358f0484fSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2458f0484fSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2558f0484fSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2658f0484fSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2758f0484fSRodney W. Grimes  * SUCH DAMAGE.
2858f0484fSRodney W. Grimes  */
2958f0484fSRodney W. Grimes 
3058f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint)
3158f0484fSRodney W. Grimes static char sccsid[] = "@(#)sigcompat.c	8.1 (Berkeley) 6/2/93";
3258f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */
33333fc21eSDavid E. O'Brien #include <sys/cdefs.h>
34333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$");
3558f0484fSRodney W. Grimes 
36d201fe46SDaniel Eischen #include "namespace.h"
3758f0484fSRodney W. Grimes #include <sys/param.h>
3858f0484fSRodney W. Grimes #include <signal.h>
399a6ceaceSKonstantin Belousov #include <string.h>
40d201fe46SDaniel Eischen #include "un-namespace.h"
41d201fe46SDaniel Eischen #include "libc_private.h"
4258f0484fSRodney W. Grimes 
4351295a4dSJordan K. Hubbard int
4458f0484fSRodney W. Grimes sigvec(signo, sv, osv)
4558f0484fSRodney W. Grimes 	int signo;
4658f0484fSRodney W. Grimes 	struct sigvec *sv, *osv;
4758f0484fSRodney W. Grimes {
482bc2b292SJohn Polstra 	struct sigaction sa, osa;
492bc2b292SJohn Polstra 	struct sigaction *sap, *osap;
5058f0484fSRodney W. Grimes 	int ret;
5158f0484fSRodney W. Grimes 
522bc2b292SJohn Polstra 	if (sv != NULL) {
532bc2b292SJohn Polstra 		sa.sa_handler = sv->sv_handler;
542bc2b292SJohn Polstra 		sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT;
552bc2b292SJohn Polstra 		sigemptyset(&sa.sa_mask);
562bc2b292SJohn Polstra 		sa.sa_mask.__bits[0] = sv->sv_mask;
572bc2b292SJohn Polstra 		sap = &sa;
582bc2b292SJohn Polstra 	} else
592bc2b292SJohn Polstra 		sap = NULL;
602bc2b292SJohn Polstra 	osap = osv != NULL ? &osa : NULL;
61d201fe46SDaniel Eischen 	ret = _sigaction(signo, sap, osap);
622bc2b292SJohn Polstra 	if (ret == 0 && osv != NULL) {
632bc2b292SJohn Polstra 		osv->sv_handler = osa.sa_handler;
642bc2b292SJohn Polstra 		osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
652bc2b292SJohn Polstra 		osv->sv_mask = osa.sa_mask.__bits[0];
662bc2b292SJohn Polstra 	}
6758f0484fSRodney W. Grimes 	return (ret);
6858f0484fSRodney W. Grimes }
6958f0484fSRodney W. Grimes 
7051295a4dSJordan K. Hubbard int
7158f0484fSRodney W. Grimes sigsetmask(mask)
7258f0484fSRodney W. Grimes 	int mask;
7358f0484fSRodney W. Grimes {
743cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
75e25ad0cbSMarcel Moolenaar 	int n;
7658f0484fSRodney W. Grimes 
773cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
783cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
79d201fe46SDaniel Eischen 	n = _sigprocmask(SIG_SETMASK, &set, &oset);
80e25ad0cbSMarcel Moolenaar 	if (n)
81e25ad0cbSMarcel Moolenaar 		return (n);
823cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
8358f0484fSRodney W. Grimes }
8458f0484fSRodney W. Grimes 
8551295a4dSJordan K. Hubbard int
8658f0484fSRodney W. Grimes sigblock(mask)
8758f0484fSRodney W. Grimes 	int mask;
8858f0484fSRodney W. Grimes {
893cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
90e25ad0cbSMarcel Moolenaar 	int n;
9158f0484fSRodney W. Grimes 
923cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
933cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
94d201fe46SDaniel Eischen 	n = _sigprocmask(SIG_BLOCK, &set, &oset);
95e25ad0cbSMarcel Moolenaar 	if (n)
96e25ad0cbSMarcel Moolenaar 		return (n);
973cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
9858f0484fSRodney W. Grimes }
9958f0484fSRodney W. Grimes 
10051295a4dSJordan K. Hubbard int
1019a6ceaceSKonstantin Belousov sigpause(int mask)
10258f0484fSRodney W. Grimes {
1033cf3c5d9SMarcel Moolenaar 	sigset_t set;
1043cf3c5d9SMarcel Moolenaar 
1053cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
1063cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
1079233c4d9SJason Evans 	return (_sigsuspend(&set));
10858f0484fSRodney W. Grimes }
1099a6ceaceSKonstantin Belousov 
1109a6ceaceSKonstantin Belousov int
1119a6ceaceSKonstantin Belousov xsi_sigpause(int sig)
1129a6ceaceSKonstantin Belousov {
1139a6ceaceSKonstantin Belousov 	sigset_t set;
1149a6ceaceSKonstantin Belousov 
1159a6ceaceSKonstantin Belousov 	sigemptyset(&set);
1169a6ceaceSKonstantin Belousov 	sigaddset(&set, sig);
1179a6ceaceSKonstantin Belousov 	return (_sigsuspend(&set));
1189a6ceaceSKonstantin Belousov }
1199a6ceaceSKonstantin Belousov 
1209a6ceaceSKonstantin Belousov int
1219a6ceaceSKonstantin Belousov sighold(int sig)
1229a6ceaceSKonstantin Belousov {
1239a6ceaceSKonstantin Belousov 	sigset_t set;
1249a6ceaceSKonstantin Belousov 
1259a6ceaceSKonstantin Belousov 	sigemptyset(&set);
1269a6ceaceSKonstantin Belousov 	sigaddset(&set, sig);
1279a6ceaceSKonstantin Belousov 	return (_sigprocmask(SIG_BLOCK, &set, NULL));
1289a6ceaceSKonstantin Belousov }
1299a6ceaceSKonstantin Belousov 
1309a6ceaceSKonstantin Belousov int
1319a6ceaceSKonstantin Belousov sigignore(int sig)
1329a6ceaceSKonstantin Belousov {
1339a6ceaceSKonstantin Belousov 	struct sigaction sa;
1349a6ceaceSKonstantin Belousov 
1359a6ceaceSKonstantin Belousov 	bzero(&sa, sizeof(sa));
1369a6ceaceSKonstantin Belousov 	sa.sa_handler = SIG_IGN;
1379a6ceaceSKonstantin Belousov 	return (_sigaction(sig, &sa, NULL));
1389a6ceaceSKonstantin Belousov }
1399a6ceaceSKonstantin Belousov 
1409a6ceaceSKonstantin Belousov int
1419a6ceaceSKonstantin Belousov sigrelse(int sig)
1429a6ceaceSKonstantin Belousov {
1439a6ceaceSKonstantin Belousov 	sigset_t set;
1449a6ceaceSKonstantin Belousov 
1459a6ceaceSKonstantin Belousov 	sigemptyset(&set);
1469a6ceaceSKonstantin Belousov 	sigaddset(&set, sig);
1479a6ceaceSKonstantin Belousov 	return (_sigprocmask(SIG_UNBLOCK, &set, NULL));
1489a6ceaceSKonstantin Belousov }
1499a6ceaceSKonstantin Belousov 
1509a6ceaceSKonstantin Belousov void
1519a6ceaceSKonstantin Belousov (*sigset(int sig, void (*disp)(int)))(int)
1529a6ceaceSKonstantin Belousov {
1539a6ceaceSKonstantin Belousov 	sigset_t set, pset;
1549a6ceaceSKonstantin Belousov 	struct sigaction sa, psa;
1559a6ceaceSKonstantin Belousov 	int error;
1569a6ceaceSKonstantin Belousov 
1579a6ceaceSKonstantin Belousov 	sigemptyset(&set);
1589a6ceaceSKonstantin Belousov 	sigaddset(&set, sig);
1599a6ceaceSKonstantin Belousov 	error = _sigprocmask(SIG_BLOCK, NULL, &pset);
1609a6ceaceSKonstantin Belousov 	if (error == -1)
1619a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1629a6ceaceSKonstantin Belousov 	if ((__sighandler_t *)disp == SIG_HOLD) {
1639a6ceaceSKonstantin Belousov 		error = _sigprocmask(SIG_BLOCK, &set, &pset);
1649a6ceaceSKonstantin Belousov 		if (error == -1)
1659a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1669a6ceaceSKonstantin Belousov 		if (sigismember(&pset, sig))
1679a6ceaceSKonstantin Belousov 			return (SIG_HOLD);
1689a6ceaceSKonstantin Belousov 		else {
1699a6ceaceSKonstantin Belousov 			error = _sigaction(sig, NULL, &psa);
1709a6ceaceSKonstantin Belousov 			if (error == -1)
1719a6ceaceSKonstantin Belousov 				return (SIG_ERR);
1729a6ceaceSKonstantin Belousov 			return (psa.sa_handler);
1739a6ceaceSKonstantin Belousov 		}
1749a6ceaceSKonstantin Belousov 	} else {
1759a6ceaceSKonstantin Belousov 		error = _sigprocmask(SIG_UNBLOCK, &set, &pset);
1769a6ceaceSKonstantin Belousov 		if (error == -1)
1779a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1789a6ceaceSKonstantin Belousov 	}
1799a6ceaceSKonstantin Belousov 
1809a6ceaceSKonstantin Belousov 	bzero(&sa, sizeof(sa));
1819a6ceaceSKonstantin Belousov 	sa.sa_handler = disp;
1829a6ceaceSKonstantin Belousov 	error = _sigaction(sig, &sa, &psa);
1839a6ceaceSKonstantin Belousov 	if (error == -1)
1849a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1859a6ceaceSKonstantin Belousov 	if (sigismember(&pset, sig))
1869a6ceaceSKonstantin Belousov 		return (SIG_HOLD);
1879a6ceaceSKonstantin Belousov 	else
1889a6ceaceSKonstantin Belousov 		return (psa.sa_handler);
1899a6ceaceSKonstantin Belousov }
190