diff options
Diffstat (limited to 'src/libstddjb/skasigaction.c')
-rw-r--r-- | src/libstddjb/skasigaction.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/libstddjb/skasigaction.c b/src/libstddjb/skasigaction.c new file mode 100644 index 0000000..a673fcb --- /dev/null +++ b/src/libstddjb/skasigaction.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include <signal.h> +#include <skalibs/sysdeps.h> +#include <skalibs/sig.h> + +int skasigaction (int sig, struct skasigaction const *new, struct skasigaction *old) +{ + struct sigaction sanew, saold ; + if (((new->flags & SKASA_MASKALL) ? sigfillset(&sanew.sa_mask) : sigemptyset(&sanew.sa_mask)) == -1) return -1 ; + sanew.sa_handler = new->handler ; + sanew.sa_flags = (new->flags & SKASA_NOCLDSTOP) ? SA_NOCLDSTOP : 0 ; + if (sigaction(sig, &sanew, &saold) == -1) return -1 ; + if (old) + { + register int r = sigismember(&saold.sa_mask, (sig == SIGTERM) ? SIGPIPE : SIGTERM) ; + if (r == -1) return -1 ; + old->flags = 0 ; + if (r) old->flags |= SKASA_MASKALL ; + if (saold.sa_flags & SA_NOCLDSTOP) old->flags |= SKASA_NOCLDSTOP ; + old->handler = saold.sa_handler ; + } + return 0 ; +} |