heirloom-ed

annotate 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
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__ */