25 }; |
25 }; |
26 |
26 |
27 void signals_loopexit (int signal, short event, void *arg) |
27 void signals_loopexit (int signal, short event, void *arg) |
28 { |
28 { |
29 struct signals *signals = arg; |
29 struct signals *signals = arg; |
30 |
30 |
|
31 (void) signal; |
31 (void) event; |
32 (void) event; |
32 |
33 |
33 log_info("caught %s: exiting", /* strsignal(signal) */ "xxx"); |
34 log_info("caught %s: exiting", /* strsignal(signal) */ "xxx"); |
34 |
35 |
35 if (event_base_loopexit(signals->ev_base, NULL)) |
36 if (event_base_loopexit(signals->ev_base, NULL)) |
46 (void) signals; |
47 (void) signals; |
47 |
48 |
48 /* ignore */ |
49 /* ignore */ |
49 } |
50 } |
50 |
51 |
51 err_t signals_create (struct signals **signals_ptr, struct event_base *ev_base) |
52 err_t signals_create (struct signals **signals_ptr, struct event_base *ev_base, error_t *err) |
52 { |
53 { |
53 struct signals *signals; |
54 struct signals *signals; |
54 |
55 |
55 if ((signals = calloc(1, sizeof(*signals))) == NULL) |
56 if ((signals = calloc(1, sizeof(*signals))) == NULL) |
56 return ERR_CALLOC; |
57 return SET_ERROR(err, &general_errors, ERR_MEM); |
57 |
58 |
58 // simple attributes |
59 // simple attributes |
59 signals->ev_base = ev_base; |
60 signals->ev_base = ev_base; |
60 |
61 |
61 // done |
62 // done |
81 |
82 |
82 // ok |
83 // ok |
83 return SUCCESS; |
84 return SUCCESS; |
84 } |
85 } |
85 |
86 |
86 err_t signal_ignore (int signum, struct error_info *err) |
87 err_t signal_ignore (int signum, error_t *err) |
87 { |
88 { |
88 struct sigaction act = { |
89 struct sigaction act = { |
89 .sa_handler = SIG_IGN, |
90 .sa_handler = SIG_IGN, |
90 }; |
91 }; |
91 |
92 |
92 // signall the handler |
93 // signall the handler |
93 if (sigaction(signum, &act, NULL)) |
94 if (sigaction(signum, &act, NULL)) |
94 RETURN_SET_ERROR_ERRNO(err, ERR_SIGACTION); |
95 return SET_ERROR_ERRNO(err, &libc_errors, ERR_SIGACTION); |
95 |
96 |
96 // ok |
97 // ok |
97 return SUCCESS; |
98 return SUCCESS; |
98 } |
99 } |
99 |
100 |
100 struct signals *signals_default (struct event_base *ev_base) |
101 struct signals *signals_default (struct event_base *ev_base) |
101 { |
102 { |
102 struct signals *signals = NULL; |
103 struct signals *signals = NULL; |
103 struct error_info err; |
104 error_t err; |
104 |
105 |
105 // alloc signals |
106 // alloc signals |
106 if (signals_create(&signals, ev_base)) |
107 if (signals_create(&signals, ev_base, &err)) |
107 return NULL; |
108 return NULL; |
108 |
109 |
109 // add the set of default signals |
110 // add the set of default signals |
110 if (signal_ignore(SIGPIPE, &err)) |
111 if (signal_ignore(SIGPIPE, &err)) |
111 log_error(&err, "signal_ignore(SIGPIPE)"); |
112 log_error(&err, "signal_ignore(SIGPIPE)"); |