diff options
author | Tony Lindgren <tony@atomide.com> | 2016-01-25 19:46:21 +0100 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2016-01-25 19:46:21 +0100 |
commit | 7e3b1207705c10ada363bbc7d0235730ce1f5b79 (patch) | |
tree | cd1eb567acb4e72c1bdfbe8b59746c73b8627ee5 /tools/lib/subcmd/sigchain.c | |
parent | ARM: omap2plus_defconfig: Enable ARM_KERNMEM_PERMS and few loadable modules (diff) | |
parent | ARM: OMAP: Add PWM dmtimer platform data quirks (diff) | |
download | linux-7e3b1207705c10ada363bbc7d0235730ce1f5b79.tar.xz linux-7e3b1207705c10ada363bbc7d0235730ce1f5b79.zip |
Merge branch 'enable-devices' into omap-for-v4.5/fixes
Diffstat (limited to 'tools/lib/subcmd/sigchain.c')
-rw-r--r-- | tools/lib/subcmd/sigchain.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tools/lib/subcmd/sigchain.c b/tools/lib/subcmd/sigchain.c new file mode 100644 index 000000000000..3537c348a18e --- /dev/null +++ b/tools/lib/subcmd/sigchain.c @@ -0,0 +1,53 @@ +#include <signal.h> +#include "subcmd-util.h" +#include "sigchain.h" + +#define SIGCHAIN_MAX_SIGNALS 32 + +struct sigchain_signal { + sigchain_fun *old; + int n; + int alloc; +}; +static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS]; + +static void check_signum(int sig) +{ + if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS) + die("BUG: signal out of range: %d", sig); +} + +static int sigchain_push(int sig, sigchain_fun f) +{ + struct sigchain_signal *s = signals + sig; + check_signum(sig); + + ALLOC_GROW(s->old, s->n + 1, s->alloc); + s->old[s->n] = signal(sig, f); + if (s->old[s->n] == SIG_ERR) + return -1; + s->n++; + return 0; +} + +int sigchain_pop(int sig) +{ + struct sigchain_signal *s = signals + sig; + check_signum(sig); + if (s->n < 1) + return 0; + + if (signal(sig, s->old[s->n - 1]) == SIG_ERR) + return -1; + s->n--; + return 0; +} + +void sigchain_push_common(sigchain_fun f) +{ + sigchain_push(SIGINT, f); + sigchain_push(SIGHUP, f); + sigchain_push(SIGTERM, f); + sigchain_push(SIGQUIT, f); + sigchain_push(SIGPIPE, f); +} |