summaryrefslogtreecommitdiff
path: root/src/signal.c
blob: 37aa26b74a3418479c6313098514af92cc6058e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "signal.h"

#include <stdio.h>
#include <string.h>

sig_atomic_t signal_running;
sig_atomic_t signal_update;

static void
handle_signal_shutdown(int sig)
{
    signal_running = 0;
}

static void
handle_signal_wake(int sig)
{
    signal_update = 1;
}

static int
add_signal(struct sigaction * action, int sig)
{
    int rc;

    rc = sigemptyset(&action->sa_mask);
    if(rc < 0) return rc;
    rc = sigaction(sig, action, 0);
    if(rc < 0) return rc;

    return rc;
}

static void
init_action(struct sigaction * action, void(*cb)(int))
{
    memset(action, 0, sizeof(struct sigaction));

    action->sa_handler = cb;
}

int
signal_setup_actions()
{
    int rc;
    struct sigaction action_sd;
    struct sigaction action_wake;

    signal_running = 1;
    signal_update = 0;

    init_action(&action_sd, handle_signal_shutdown);
    init_action(&action_wake, handle_signal_wake);

    rc = add_signal(&action_sd, SIGINT);
    if(rc < 0) return rc;
    rc = add_signal(&action_sd, SIGTERM);
    if(rc < 0) return rc;

    rc = add_signal(&action_wake, SIGUSR1);
    if(rc < 0) return rc;

    return rc;
}

bool
signal_should_update()
{
    bool r = signal_update;
    signal_update = 0;
    return r;
}