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