xref: /freebsd/lib/libc/compat-43/sigcompat.c (revision 3157ba21)
1 /*
2  * Copyright (c) 1989, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 #if defined(LIBC_SCCS) && !defined(lint)
31 static char sccsid[] = "@(#)sigcompat.c	8.1 (Berkeley) 6/2/93";
32 #endif /* LIBC_SCCS and not lint */
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35 
36 #include "namespace.h"
37 #include <sys/param.h>
38 #include <signal.h>
39 #include <string.h>
40 #include "un-namespace.h"
41 #include "libc_private.h"
42 
43 int
44 sigvec(signo, sv, osv)
45 	int signo;
46 	struct sigvec *sv, *osv;
47 {
48 	struct sigaction sa, osa;
49 	struct sigaction *sap, *osap;
50 	int ret;
51 
52 	if (sv != NULL) {
53 		sa.sa_handler = sv->sv_handler;
54 		sa.sa_flags = sv->sv_flags ^ SV_INTERRUPT;
55 		sigemptyset(&sa.sa_mask);
56 		sa.sa_mask.__bits[0] = sv->sv_mask;
57 		sap = &sa;
58 	} else
59 		sap = NULL;
60 	osap = osv != NULL ? &osa : NULL;
61 	ret = _sigaction(signo, sap, osap);
62 	if (ret == 0 && osv != NULL) {
63 		osv->sv_handler = osa.sa_handler;
64 		osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
65 		osv->sv_mask = osa.sa_mask.__bits[0];
66 	}
67 	return (ret);
68 }
69 
70 int
71 sigsetmask(mask)
72 	int mask;
73 {
74 	sigset_t set, oset;
75 	int n;
76 
77 	sigemptyset(&set);
78 	set.__bits[0] = mask;
79 	n = _sigprocmask(SIG_SETMASK, &set, &oset);
80 	if (n)
81 		return (n);
82 	return (oset.__bits[0]);
83 }
84 
85 int
86 sigblock(mask)
87 	int mask;
88 {
89 	sigset_t set, oset;
90 	int n;
91 
92 	sigemptyset(&set);
93 	set.__bits[0] = mask;
94 	n = _sigprocmask(SIG_BLOCK, &set, &oset);
95 	if (n)
96 		return (n);
97 	return (oset.__bits[0]);
98 }
99 
100 int
101 sigpause(int mask)
102 {
103 	sigset_t set;
104 
105 	sigemptyset(&set);
106 	set.__bits[0] = mask;
107 	return (_sigsuspend(&set));
108 }
109 
110 int
111 xsi_sigpause(int sig)
112 {
113 	sigset_t set;
114 
115 	sigemptyset(&set);
116 	sigaddset(&set, sig);
117 	return (_sigsuspend(&set));
118 }
119 
120 int
121 sighold(int sig)
122 {
123 	sigset_t set;
124 
125 	sigemptyset(&set);
126 	sigaddset(&set, sig);
127 	return (_sigprocmask(SIG_BLOCK, &set, NULL));
128 }
129 
130 int
131 sigignore(int sig)
132 {
133 	struct sigaction sa;
134 
135 	bzero(&sa, sizeof(sa));
136 	sa.sa_handler = SIG_IGN;
137 	return (_sigaction(sig, &sa, NULL));
138 }
139 
140 int
141 sigrelse(int sig)
142 {
143 	sigset_t set;
144 
145 	sigemptyset(&set);
146 	sigaddset(&set, sig);
147 	return (_sigprocmask(SIG_UNBLOCK, &set, NULL));
148 }
149 
150 void
151 (*sigset(int sig, void (*disp)(int)))(int)
152 {
153 	sigset_t set, pset;
154 	struct sigaction sa, psa;
155 	int error;
156 
157 	sigemptyset(&set);
158 	sigaddset(&set, sig);
159 	error = _sigprocmask(SIG_BLOCK, NULL, &pset);
160 	if (error == -1)
161 		return (SIG_ERR);
162 	if ((__sighandler_t *)disp == SIG_HOLD) {
163 		error = _sigprocmask(SIG_BLOCK, &set, &pset);
164 		if (error == -1)
165 			return (SIG_ERR);
166 		if (sigismember(&pset, sig))
167 			return (SIG_HOLD);
168 		else {
169 			error = _sigaction(sig, NULL, &psa);
170 			if (error == -1)
171 				return (SIG_ERR);
172 			return (psa.sa_handler);
173 		}
174 	} else {
175 		error = _sigprocmask(SIG_UNBLOCK, &set, &pset);
176 		if (error == -1)
177 			return (SIG_ERR);
178 	}
179 
180 	bzero(&sa, sizeof(sa));
181 	sa.sa_handler = disp;
182 	error = _sigaction(sig, &sa, &psa);
183 	if (error == -1)
184 		return (SIG_ERR);
185 	if (sigismember(&pset, sig))
186 		return (SIG_HOLD);
187 	else
188 		return (psa.sa_handler);
189 }
190