81 lines
1.2 KiB
C
81 lines
1.2 KiB
C
|
/* vi: set sw=4 ts=4: */
|
||
|
/*
|
||
|
* Utility routines.
|
||
|
*
|
||
|
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||
|
* Copyright (C) 2006 Rob Landley
|
||
|
* Copyright (C) 2006 Denis Vlasenko
|
||
|
*
|
||
|
* Licensed under GPL version 2, see file LICENSE in this tarball for details.
|
||
|
*/
|
||
|
|
||
|
#include "libbb.h"
|
||
|
|
||
|
void bb_signals(int sigs, void (*f)(int))
|
||
|
{
|
||
|
int sig_no = 0;
|
||
|
int bit = 1;
|
||
|
|
||
|
while (sigs) {
|
||
|
if (sigs & bit) {
|
||
|
sigs &= ~bit;
|
||
|
signal(sig_no, f);
|
||
|
}
|
||
|
sig_no++;
|
||
|
bit <<= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void bb_signals_recursive(int sigs, void (*f)(int))
|
||
|
{
|
||
|
int sig_no = 0;
|
||
|
int bit = 1;
|
||
|
struct sigaction sa;
|
||
|
|
||
|
memset(&sa, 0, sizeof(sa));
|
||
|
sa.sa_handler = f;
|
||
|
/*sa.sa_flags = 0;*/
|
||
|
/*sigemptyset(&sa.sa_mask); - hope memset did it*/
|
||
|
|
||
|
while (sigs) {
|
||
|
if (sigs & bit) {
|
||
|
sigs &= ~bit;
|
||
|
sigaction(sig_no, &sa, NULL);
|
||
|
}
|
||
|
sig_no++;
|
||
|
bit <<= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void sig_block(int sig)
|
||
|
{
|
||
|
sigset_t ss;
|
||
|
sigemptyset(&ss);
|
||
|
sigaddset(&ss, sig);
|
||
|
sigprocmask(SIG_BLOCK, &ss, NULL);
|
||
|
}
|
||
|
|
||
|
void sig_unblock(int sig)
|
||
|
{
|
||
|
sigset_t ss;
|
||
|
sigemptyset(&ss);
|
||
|
sigaddset(&ss, sig);
|
||
|
sigprocmask(SIG_UNBLOCK, &ss, NULL);
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
void sig_blocknone(void)
|
||
|
{
|
||
|
sigset_t ss;
|
||
|
sigemptyset(&ss);
|
||
|
sigprocmask(SIG_SETMASK, &ss, NULL);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void sig_pause(void)
|
||
|
{
|
||
|
sigset_t ss;
|
||
|
sigemptyset(&ss);
|
||
|
sigsuspend(&ss);
|
||
|
}
|