Coverage Report

Created: 2024-09-16 06:12

/src/git/sigchain.c
Line
Count
Source (jump to first uncovered line)
1
#include "git-compat-util.h"
2
#include "sigchain.h"
3
4
5
#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
5
{
15
5
  if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS)
16
0
    BUG("signal out of range: %d", sig);
17
5
}
18
19
int sigchain_push(int sig, sigchain_fun f)
20
5
{
21
5
  struct sigchain_signal *s = signals + sig;
22
5
  check_signum(sig);
23
24
5
  ALLOC_GROW(s->old, s->n + 1, s->alloc);
25
5
  s->old[s->n] = signal(sig, f);
26
5
  if (s->old[s->n] == SIG_ERR)
27
0
    return -1;
28
5
  s->n++;
29
5
  return 0;
30
5
}
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
1
{
47
1
  sigchain_push(SIGINT, f);
48
1
  sigchain_push(SIGHUP, f);
49
1
  sigchain_push(SIGTERM, f);
50
1
  sigchain_push(SIGQUIT, f);
51
1
  sigchain_push(SIGPIPE, f);
52
1
}
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
}