libbb: introduce bb_signals and bb_signals_recursive,
which sets same handler for many signals. sig_catch is nuked (bb_signals_recursive is more descriptive name). *: use them as appropriate. function old new delta bb_signals_recursive - 95 +95 bb_signals - 52 +52 run_command 258 273 +15 svlogd_main 1368 1377 +9 runsv_main 1746 1752 +6 runsvdir_main 1643 1646 +3 UNSPEC_print 64 66 +2 time_main 1128 1127 -1 ... resize_main 246 210 -36 sig_catch 63 - -63 set_fatal_sighandler 85 14 -71 ------------------------------------------------------------------------------ (add/remove: 2/1 grow/shrink: 5/24 up/down: 182/-548) Total: -366 bytes
This commit is contained in:
80
libbb/signals.c
Normal file
80
libbb/signals.c
Normal file
@ -0,0 +1,80 @@
|
||||
/* 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);
|
||||
}
|
Reference in New Issue
Block a user