Coverage Report

Created: 2024-09-08 06:23

/src/git/sigchain.c
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
}