xref: /freebsd/lib/libc/compat-43/sigcompat.c (revision dc36d6f9)
18a16b7a1SPedro F. Giffuni /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
458f0484fSRodney W. Grimes  * Copyright (c) 1989, 1993
558f0484fSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
658f0484fSRodney W. Grimes  *
758f0484fSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
858f0484fSRodney W. Grimes  * modification, are permitted provided that the following conditions
958f0484fSRodney W. Grimes  * are met:
1058f0484fSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
1158f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
1258f0484fSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
1358f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
1458f0484fSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
1658f0484fSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
1758f0484fSRodney W. Grimes  *    without specific prior written permission.
1858f0484fSRodney W. Grimes  *
1958f0484fSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2058f0484fSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2158f0484fSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2258f0484fSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2358f0484fSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2458f0484fSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2558f0484fSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2658f0484fSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2758f0484fSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2858f0484fSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2958f0484fSRodney W. Grimes  * SUCH DAMAGE.
3058f0484fSRodney W. Grimes  */
3158f0484fSRodney W. Grimes 
32d201fe46SDaniel Eischen #include "namespace.h"
3358f0484fSRodney W. Grimes #include <sys/param.h>
345ebe9664SKonstantin Belousov #include <errno.h>
3558f0484fSRodney W. Grimes #include <signal.h>
369a6ceaceSKonstantin Belousov #include <string.h>
37d201fe46SDaniel Eischen #include "un-namespace.h"
38d201fe46SDaniel Eischen #include "libc_private.h"
3958f0484fSRodney W. Grimes 
4051295a4dSJordan K. Hubbard int
sigvec(int signo,struct sigvec * sv,struct sigvec * osv)415e939c7dSCraig Rodrigues sigvec(int signo, struct sigvec *sv, struct sigvec *osv)
4258f0484fSRodney W. Grimes {
432bc2b292SJohn Polstra 	struct sigaction sa, osa;
442bc2b292SJohn Polstra 	struct sigaction *sap, *osap;
4558f0484fSRodney W. Grimes 	int ret;
4658f0484fSRodney W. Grimes 
472bc2b292SJohn Polstra 	if (sv != NULL) {
482bc2b292SJohn Polstra 		sa.sa_handler = sv->sv_handler;
492bc2b292SJohn Polstra 		sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT;
502bc2b292SJohn Polstra 		sigemptyset(&sa.sa_mask);
512bc2b292SJohn Polstra 		sa.sa_mask.__bits[0] = sv->sv_mask;
522bc2b292SJohn Polstra 		sap = &sa;
532bc2b292SJohn Polstra 	} else
542bc2b292SJohn Polstra 		sap = NULL;
552bc2b292SJohn Polstra 	osap = osv != NULL ? &osa : NULL;
56bd6060a1SKonstantin Belousov 	ret = __libc_sigaction(signo, sap, osap);
572bc2b292SJohn Polstra 	if (ret == 0 && osv != NULL) {
582bc2b292SJohn Polstra 		osv->sv_handler = osa.sa_handler;
592bc2b292SJohn Polstra 		osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
602bc2b292SJohn Polstra 		osv->sv_mask = osa.sa_mask.__bits[0];
612bc2b292SJohn Polstra 	}
6258f0484fSRodney W. Grimes 	return (ret);
6358f0484fSRodney W. Grimes }
6458f0484fSRodney W. Grimes 
6551295a4dSJordan K. Hubbard int
sigsetmask(int mask)665e939c7dSCraig Rodrigues sigsetmask(int mask)
6758f0484fSRodney W. Grimes {
683cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
69e25ad0cbSMarcel Moolenaar 	int n;
7058f0484fSRodney W. Grimes 
713cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
723cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
73bd6060a1SKonstantin Belousov 	n = __libc_sigprocmask(SIG_SETMASK, &set, &oset);
74e25ad0cbSMarcel Moolenaar 	if (n)
75e25ad0cbSMarcel Moolenaar 		return (n);
763cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
7758f0484fSRodney W. Grimes }
7858f0484fSRodney W. Grimes 
7951295a4dSJordan K. Hubbard int
sigblock(int mask)805e939c7dSCraig Rodrigues sigblock(int mask)
8158f0484fSRodney W. Grimes {
823cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
83e25ad0cbSMarcel Moolenaar 	int n;
8458f0484fSRodney W. Grimes 
853cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
863cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
87bd6060a1SKonstantin Belousov 	n = __libc_sigprocmask(SIG_BLOCK, &set, &oset);
88e25ad0cbSMarcel Moolenaar 	if (n)
89e25ad0cbSMarcel Moolenaar 		return (n);
903cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
9158f0484fSRodney W. Grimes }
9258f0484fSRodney W. Grimes 
9351295a4dSJordan K. Hubbard int
sigpause(int mask)949a6ceaceSKonstantin Belousov sigpause(int mask)
9558f0484fSRodney W. Grimes {
963cf3c5d9SMarcel Moolenaar 	sigset_t set;
973cf3c5d9SMarcel Moolenaar 
983cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
993cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
100bd6060a1SKonstantin Belousov 	return (__libc_sigsuspend(&set));
10158f0484fSRodney W. Grimes }
1029a6ceaceSKonstantin Belousov 
1039a6ceaceSKonstantin Belousov int
xsi_sigpause(int sig)1049a6ceaceSKonstantin Belousov xsi_sigpause(int sig)
1059a6ceaceSKonstantin Belousov {
1069a6ceaceSKonstantin Belousov 	sigset_t set;
1079a6ceaceSKonstantin Belousov 
108bd6060a1SKonstantin Belousov 	if (__libc_sigprocmask(SIG_BLOCK, NULL, &set) == -1)
1095ebe9664SKonstantin Belousov 		return (-1);
110e2b801ddSKonstantin Belousov 	if (sigdelset(&set, sig) == -1)
111e2b801ddSKonstantin Belousov 		return (-1);
112bd6060a1SKonstantin Belousov 	return (__libc_sigsuspend(&set));
1139a6ceaceSKonstantin Belousov }
1149a6ceaceSKonstantin Belousov 
1159a6ceaceSKonstantin Belousov int
sighold(int sig)1169a6ceaceSKonstantin Belousov sighold(int sig)
1179a6ceaceSKonstantin Belousov {
1189a6ceaceSKonstantin Belousov 	sigset_t set;
1199a6ceaceSKonstantin Belousov 
1209a6ceaceSKonstantin Belousov 	sigemptyset(&set);
121e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
122e2b801ddSKonstantin Belousov 		return (-1);
123bd6060a1SKonstantin Belousov 	return (__libc_sigprocmask(SIG_BLOCK, &set, NULL));
1249a6ceaceSKonstantin Belousov }
1259a6ceaceSKonstantin Belousov 
1269a6ceaceSKonstantin Belousov int
sigignore(int sig)1279a6ceaceSKonstantin Belousov sigignore(int sig)
1289a6ceaceSKonstantin Belousov {
1299a6ceaceSKonstantin Belousov 	struct sigaction sa;
1309a6ceaceSKonstantin Belousov 
1319a6ceaceSKonstantin Belousov 	bzero(&sa, sizeof(sa));
1329a6ceaceSKonstantin Belousov 	sa.sa_handler = SIG_IGN;
133bd6060a1SKonstantin Belousov 	return (__libc_sigaction(sig, &sa, NULL));
1349a6ceaceSKonstantin Belousov }
1359a6ceaceSKonstantin Belousov 
1369a6ceaceSKonstantin Belousov int
sigrelse(int sig)1379a6ceaceSKonstantin Belousov sigrelse(int sig)
1389a6ceaceSKonstantin Belousov {
1399a6ceaceSKonstantin Belousov 	sigset_t set;
1409a6ceaceSKonstantin Belousov 
1419a6ceaceSKonstantin Belousov 	sigemptyset(&set);
142e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
143e2b801ddSKonstantin Belousov 		return (-1);
144bd6060a1SKonstantin Belousov 	return (__libc_sigprocmask(SIG_UNBLOCK, &set, NULL));
1459a6ceaceSKonstantin Belousov }
1469a6ceaceSKonstantin Belousov 
1479a6ceaceSKonstantin Belousov void
sigset(int sig,void (* disp)(int))1489a6ceaceSKonstantin Belousov (*sigset(int sig, void (*disp)(int)))(int)
1499a6ceaceSKonstantin Belousov {
1509a6ceaceSKonstantin Belousov 	sigset_t set, pset;
1519a6ceaceSKonstantin Belousov 	struct sigaction sa, psa;
1529a6ceaceSKonstantin Belousov 
1539a6ceaceSKonstantin Belousov 	sigemptyset(&set);
154e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
155e2b801ddSKonstantin Belousov 		return (SIG_ERR);
156bd6060a1SKonstantin Belousov 	if (__libc_sigprocmask(SIG_BLOCK, NULL, &pset) == -1)
1579a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1589a6ceaceSKonstantin Belousov 	if ((__sighandler_t *)disp == SIG_HOLD) {
159bd6060a1SKonstantin Belousov 		if (__libc_sigprocmask(SIG_BLOCK, &set, &pset) == -1)
1609a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1619a6ceaceSKonstantin Belousov 		if (sigismember(&pset, sig))
1629a6ceaceSKonstantin Belousov 			return (SIG_HOLD);
1639a6ceaceSKonstantin Belousov 		else {
164bd6060a1SKonstantin Belousov 			if (__libc_sigaction(sig, NULL, &psa) == -1)
1659a6ceaceSKonstantin Belousov 				return (SIG_ERR);
1669a6ceaceSKonstantin Belousov 			return (psa.sa_handler);
1679a6ceaceSKonstantin Belousov 		}
1689a6ceaceSKonstantin Belousov 	} else {
169bd6060a1SKonstantin Belousov 		if (__libc_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1)
1709a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1719a6ceaceSKonstantin Belousov 	}
1729a6ceaceSKonstantin Belousov 
1739a6ceaceSKonstantin Belousov 	bzero(&sa, sizeof(sa));
1749a6ceaceSKonstantin Belousov 	sa.sa_handler = disp;
175bd6060a1SKonstantin Belousov 	if (__libc_sigaction(sig, &sa, &psa) == -1)
1769a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1779a6ceaceSKonstantin Belousov 	if (sigismember(&pset, sig))
1789a6ceaceSKonstantin Belousov 		return (SIG_HOLD);
1799a6ceaceSKonstantin Belousov 	else
1809a6ceaceSKonstantin Belousov 		return (psa.sa_handler);
1819a6ceaceSKonstantin Belousov }
182