55 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <signal.h>3#include "subcmd-util.h"4#include "sigchain.h"5 6#define SIGCHAIN_MAX_SIGNALS 327 8struct sigchain_signal {9 sigchain_fun *old;10 int n;11 int alloc;12};13static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS];14 15static void check_signum(int sig)16{17 if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS)18 die("BUG: signal out of range: %d", sig);19}20 21static int sigchain_push(int sig, sigchain_fun f)22{23 struct sigchain_signal *s = signals + sig;24 check_signum(sig);25 26 ALLOC_GROW(s->old, s->n + 1, s->alloc);27 s->old[s->n] = signal(sig, f);28 if (s->old[s->n] == SIG_ERR)29 return -1;30 s->n++;31 return 0;32}33 34int sigchain_pop(int sig)35{36 struct sigchain_signal *s = signals + sig;37 check_signum(sig);38 if (s->n < 1)39 return 0;40 41 if (signal(sig, s->old[s->n - 1]) == SIG_ERR)42 return -1;43 s->n--;44 return 0;45}46 47void sigchain_push_common(sigchain_fun f)48{49 sigchain_push(SIGINT, f);50 sigchain_push(SIGHUP, f);51 sigchain_push(SIGTERM, f);52 sigchain_push(SIGQUIT, f);53 sigchain_push(SIGPIPE, f);54}55