heirloom-ed

view sigset.c @ 0:1493bea5ac22

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