rev |
line source |
meillo@0
|
1 /*
|
meillo@0
|
2 * Copyright (c) 2004 Gunnar Ritter
|
meillo@0
|
3 *
|
meillo@0
|
4 * This software is provided 'as-is', without any express or implied
|
meillo@0
|
5 * warranty. In no event will the authors be held liable for any damages
|
meillo@0
|
6 * arising from the use of this software.
|
meillo@0
|
7 *
|
meillo@0
|
8 * Permission is granted to anyone to use this software for any purpose,
|
meillo@0
|
9 * including commercial applications, and to alter it and redistribute
|
meillo@0
|
10 * it freely, subject to the following restrictions:
|
meillo@0
|
11 *
|
meillo@0
|
12 * 1. The origin of this software must not be misrepresented; you must not
|
meillo@0
|
13 * claim that you wrote the original software. If you use this software
|
meillo@0
|
14 * in a product, an acknowledgment in the product documentation would be
|
meillo@0
|
15 * appreciated but is not required.
|
meillo@0
|
16 *
|
meillo@0
|
17 * 2. Altered source versions must be plainly marked as such, and must not be
|
meillo@0
|
18 * misrepresented as being the original software.
|
meillo@0
|
19 *
|
meillo@0
|
20 * 3. This notice may not be removed or altered from any source distribution.
|
meillo@0
|
21 */
|
meillo@0
|
22 /* Sccsid @(#)sigset.c 1.7 (gritter) 1/22/06 */
|
meillo@0
|
23
|
meillo@0
|
24 #if defined (__FreeBSD__) || defined (__dietlibc__) || defined (__NetBSD__) || \
|
meillo@0
|
25 defined (__OpenBSD__) || defined (__DragonFly__) || defined (__APPLE__)
|
meillo@0
|
26 #include <signal.h>
|
meillo@0
|
27 #include "sigset.h"
|
meillo@0
|
28
|
meillo@0
|
29 void (*sigset(int sig, void (*func)(int)))(int)
|
meillo@0
|
30 {
|
meillo@0
|
31 struct sigaction nact, oact;
|
meillo@0
|
32 sigset_t nset, oset;
|
meillo@0
|
33
|
meillo@0
|
34 if (sig <= 0)
|
meillo@0
|
35 return SIG_ERR;
|
meillo@0
|
36 sigemptyset(&nset);
|
meillo@0
|
37 sigaddset(&nset, sig);
|
meillo@0
|
38 if (sigprocmask(func==SIG_HOLD?SIG_BLOCK:SIG_UNBLOCK, &nset, &oset) < 0)
|
meillo@0
|
39 return SIG_ERR;
|
meillo@0
|
40 nact.sa_handler = func;
|
meillo@0
|
41 nact.sa_flags = 0;
|
meillo@0
|
42 if (sig == SIGCHLD && func == SIG_IGN)
|
meillo@0
|
43 nact.sa_flags |= SA_NOCLDSTOP|SA_NOCLDWAIT;
|
meillo@0
|
44 sigemptyset(&nact.sa_mask);
|
meillo@0
|
45 sigaddset(&nact.sa_mask, sig);
|
meillo@0
|
46 if (sigaction(sig, func==SIG_HOLD?(struct sigaction *)0:&nact, &oact)
|
meillo@0
|
47 == -1)
|
meillo@0
|
48 return SIG_ERR;
|
meillo@0
|
49 if (sigismember(&oset, sig))
|
meillo@0
|
50 return SIG_HOLD;
|
meillo@0
|
51 else
|
meillo@0
|
52 return (oact.sa_handler);
|
meillo@0
|
53 }
|
meillo@0
|
54 #endif /* __FreeBSD__ || __dietlibc__ || __NetBSD__ || __OpenBSD__ ||
|
meillo@0
|
55 __DragonFly__ || __APPLE__ */
|