Line | Count | Source (jump to first uncovered line) |
1 | | #include "git-compat-util.h" |
2 | | #include "sigchain.h" |
3 | | |
4 | 0 | #define SIGCHAIN_MAX_SIGNALS 32 |
5 | | |
6 | | struct sigchain_signal { |
7 | | sigchain_fun *old; |
8 | | int n; |
9 | | int alloc; |
10 | | }; |
11 | | static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS]; |
12 | | |
13 | | static void check_signum(int sig) |
14 | 0 | { |
15 | 0 | if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS) |
16 | 0 | BUG("signal out of range: %d", sig); |
17 | 0 | } |
18 | | |
19 | | int sigchain_push(int sig, sigchain_fun f) |
20 | 0 | { |
21 | 0 | struct sigchain_signal *s = signals + sig; |
22 | 0 | check_signum(sig); |
23 | |
|
24 | 0 | ALLOC_GROW(s->old, s->n + 1, s->alloc); |
25 | 0 | s->old[s->n] = signal(sig, f); |
26 | 0 | if (s->old[s->n] == SIG_ERR) |
27 | 0 | return -1; |
28 | 0 | s->n++; |
29 | 0 | return 0; |
30 | 0 | } |
31 | | |
32 | | int sigchain_pop(int sig) |
33 | 0 | { |
34 | 0 | struct sigchain_signal *s = signals + sig; |
35 | 0 | check_signum(sig); |
36 | 0 | if (s->n < 1) |
37 | 0 | return 0; |
38 | | |
39 | 0 | if (signal(sig, s->old[s->n - 1]) == SIG_ERR) |
40 | 0 | return -1; |
41 | 0 | s->n--; |
42 | 0 | return 0; |
43 | 0 | } |
44 | | |
45 | | void sigchain_push_common(sigchain_fun f) |
46 | 0 | { |
47 | 0 | sigchain_push(SIGINT, f); |
48 | 0 | sigchain_push(SIGHUP, f); |
49 | 0 | sigchain_push(SIGTERM, f); |
50 | 0 | sigchain_push(SIGQUIT, f); |
51 | 0 | sigchain_push(SIGPIPE, f); |
52 | 0 | } |
53 | | |
54 | | void sigchain_pop_common(void) |
55 | 0 | { |
56 | 0 | sigchain_pop(SIGPIPE); |
57 | 0 | sigchain_pop(SIGQUIT); |
58 | 0 | sigchain_pop(SIGTERM); |
59 | 0 | sigchain_pop(SIGHUP); |
60 | 0 | sigchain_pop(SIGINT); |
61 | 0 | } |