xref: /freebsd/lib/libc/compat-43/sigcompat.c (revision fbbd9655)
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.
13fbbd9655SWarner Losh  * 3. 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>
385ebe9664SKonstantin Belousov #include <errno.h>
3958f0484fSRodney W. Grimes #include <signal.h>
409a6ceaceSKonstantin Belousov #include <string.h>
41d201fe46SDaniel Eischen #include "un-namespace.h"
42d201fe46SDaniel Eischen #include "libc_private.h"
4358f0484fSRodney W. Grimes 
4451295a4dSJordan K. Hubbard int
455e939c7dSCraig Rodrigues sigvec(int signo, struct sigvec *sv, struct sigvec *osv)
4658f0484fSRodney W. Grimes {
472bc2b292SJohn Polstra 	struct sigaction sa, osa;
482bc2b292SJohn Polstra 	struct sigaction *sap, *osap;
4958f0484fSRodney W. Grimes 	int ret;
5058f0484fSRodney W. Grimes 
512bc2b292SJohn Polstra 	if (sv != NULL) {
522bc2b292SJohn Polstra 		sa.sa_handler = sv->sv_handler;
532bc2b292SJohn Polstra 		sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT;
542bc2b292SJohn Polstra 		sigemptyset(&sa.sa_mask);
552bc2b292SJohn Polstra 		sa.sa_mask.__bits[0] = sv->sv_mask;
562bc2b292SJohn Polstra 		sap = &sa;
572bc2b292SJohn Polstra 	} else
582bc2b292SJohn Polstra 		sap = NULL;
592bc2b292SJohn Polstra 	osap = osv != NULL ? &osa : NULL;
60bd6060a1SKonstantin Belousov 	ret = __libc_sigaction(signo, sap, osap);
612bc2b292SJohn Polstra 	if (ret == 0 && osv != NULL) {
622bc2b292SJohn Polstra 		osv->sv_handler = osa.sa_handler;
632bc2b292SJohn Polstra 		osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
642bc2b292SJohn Polstra 		osv->sv_mask = osa.sa_mask.__bits[0];
652bc2b292SJohn Polstra 	}
6658f0484fSRodney W. Grimes 	return (ret);
6758f0484fSRodney W. Grimes }
6858f0484fSRodney W. Grimes 
6951295a4dSJordan K. Hubbard int
705e939c7dSCraig Rodrigues sigsetmask(int mask)
7158f0484fSRodney W. Grimes {
723cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
73e25ad0cbSMarcel Moolenaar 	int n;
7458f0484fSRodney W. Grimes 
753cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
763cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
77bd6060a1SKonstantin Belousov 	n = __libc_sigprocmask(SIG_SETMASK, &set, &oset);
78e25ad0cbSMarcel Moolenaar 	if (n)
79e25ad0cbSMarcel Moolenaar 		return (n);
803cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
8158f0484fSRodney W. Grimes }
8258f0484fSRodney W. Grimes 
8351295a4dSJordan K. Hubbard int
845e939c7dSCraig Rodrigues sigblock(int mask)
8558f0484fSRodney W. Grimes {
863cf3c5d9SMarcel Moolenaar 	sigset_t set, oset;
87e25ad0cbSMarcel Moolenaar 	int n;
8858f0484fSRodney W. Grimes 
893cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
903cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
91bd6060a1SKonstantin Belousov 	n = __libc_sigprocmask(SIG_BLOCK, &set, &oset);
92e25ad0cbSMarcel Moolenaar 	if (n)
93e25ad0cbSMarcel Moolenaar 		return (n);
943cf3c5d9SMarcel Moolenaar 	return (oset.__bits[0]);
9558f0484fSRodney W. Grimes }
9658f0484fSRodney W. Grimes 
9751295a4dSJordan K. Hubbard int
989a6ceaceSKonstantin Belousov sigpause(int mask)
9958f0484fSRodney W. Grimes {
1003cf3c5d9SMarcel Moolenaar 	sigset_t set;
1013cf3c5d9SMarcel Moolenaar 
1023cf3c5d9SMarcel Moolenaar 	sigemptyset(&set);
1033cf3c5d9SMarcel Moolenaar 	set.__bits[0] = mask;
104bd6060a1SKonstantin Belousov 	return (__libc_sigsuspend(&set));
10558f0484fSRodney W. Grimes }
1069a6ceaceSKonstantin Belousov 
1079a6ceaceSKonstantin Belousov int
1089a6ceaceSKonstantin Belousov xsi_sigpause(int sig)
1099a6ceaceSKonstantin Belousov {
1109a6ceaceSKonstantin Belousov 	sigset_t set;
1119a6ceaceSKonstantin Belousov 
112bd6060a1SKonstantin Belousov 	if (__libc_sigprocmask(SIG_BLOCK, NULL, &set) == -1)
1135ebe9664SKonstantin Belousov 		return (-1);
114e2b801ddSKonstantin Belousov 	if (sigdelset(&set, sig) == -1)
115e2b801ddSKonstantin Belousov 		return (-1);
116bd6060a1SKonstantin Belousov 	return (__libc_sigsuspend(&set));
1179a6ceaceSKonstantin Belousov }
1189a6ceaceSKonstantin Belousov 
1199a6ceaceSKonstantin Belousov int
1209a6ceaceSKonstantin Belousov sighold(int sig)
1219a6ceaceSKonstantin Belousov {
1229a6ceaceSKonstantin Belousov 	sigset_t set;
1239a6ceaceSKonstantin Belousov 
1249a6ceaceSKonstantin Belousov 	sigemptyset(&set);
125e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
126e2b801ddSKonstantin Belousov 		return (-1);
127bd6060a1SKonstantin Belousov 	return (__libc_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;
137bd6060a1SKonstantin Belousov 	return (__libc_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);
146e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
147e2b801ddSKonstantin Belousov 		return (-1);
148bd6060a1SKonstantin Belousov 	return (__libc_sigprocmask(SIG_UNBLOCK, &set, NULL));
1499a6ceaceSKonstantin Belousov }
1509a6ceaceSKonstantin Belousov 
1519a6ceaceSKonstantin Belousov void
1529a6ceaceSKonstantin Belousov (*sigset(int sig, void (*disp)(int)))(int)
1539a6ceaceSKonstantin Belousov {
1549a6ceaceSKonstantin Belousov 	sigset_t set, pset;
1559a6ceaceSKonstantin Belousov 	struct sigaction sa, psa;
1569a6ceaceSKonstantin Belousov 
1579a6ceaceSKonstantin Belousov 	sigemptyset(&set);
158e2b801ddSKonstantin Belousov 	if (sigaddset(&set, sig) == -1)
159e2b801ddSKonstantin Belousov 		return (SIG_ERR);
160bd6060a1SKonstantin Belousov 	if (__libc_sigprocmask(SIG_BLOCK, NULL, &pset) == -1)
1619a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1629a6ceaceSKonstantin Belousov 	if ((__sighandler_t *)disp == SIG_HOLD) {
163bd6060a1SKonstantin Belousov 		if (__libc_sigprocmask(SIG_BLOCK, &set, &pset) == -1)
1649a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1659a6ceaceSKonstantin Belousov 		if (sigismember(&pset, sig))
1669a6ceaceSKonstantin Belousov 			return (SIG_HOLD);
1679a6ceaceSKonstantin Belousov 		else {
168bd6060a1SKonstantin Belousov 			if (__libc_sigaction(sig, NULL, &psa) == -1)
1699a6ceaceSKonstantin Belousov 				return (SIG_ERR);
1709a6ceaceSKonstantin Belousov 			return (psa.sa_handler);
1719a6ceaceSKonstantin Belousov 		}
1729a6ceaceSKonstantin Belousov 	} else {
173bd6060a1SKonstantin Belousov 		if (__libc_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1)
1749a6ceaceSKonstantin Belousov 			return (SIG_ERR);
1759a6ceaceSKonstantin Belousov 	}
1769a6ceaceSKonstantin Belousov 
1779a6ceaceSKonstantin Belousov 	bzero(&sa, sizeof(sa));
1789a6ceaceSKonstantin Belousov 	sa.sa_handler = disp;
179bd6060a1SKonstantin Belousov 	if (__libc_sigaction(sig, &sa, &psa) == -1)
1809a6ceaceSKonstantin Belousov 		return (SIG_ERR);
1819a6ceaceSKonstantin Belousov 	if (sigismember(&pset, sig))
1829a6ceaceSKonstantin Belousov 		return (SIG_HOLD);
1839a6ceaceSKonstantin Belousov 	else
1849a6ceaceSKonstantin Belousov 		return (psa.sa_handler);
1859a6ceaceSKonstantin Belousov }
186