reset signal handlers on startup

This commit is contained in:
Lennart Poettering
2010-01-27 06:19:28 +01:00
parent 47a71eed0f
commit 2a987ee8c9
3 changed files with 27 additions and 0 deletions
+3
View File
@@ -15,6 +15,7 @@
#include "macro.h"
#include "strv.h"
#include "log.h"
#include "util.h"
Manager* manager_new(void) {
Manager *m;
@@ -41,6 +42,8 @@ Manager* manager_new(void) {
if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
goto fail;
assert_se(reset_all_signal_handlers() == 0);
assert_se(sigemptyset(&mask) == 0);
assert_se(sigaddset(&mask, SIGCHLD) == 0);
assert_se(sigaddset(&mask, SIGINT) == 0);
+22
View File
@@ -468,3 +468,25 @@ char *path_make_absolute(const char *p, const char *prefix) {
return r;
}
int reset_all_signal_handlers(void) {
int sig;
for (sig = 1; sig < _NSIG; sig++) {
struct sigaction sa;
if (sig == SIGKILL || sig == SIGSTOP)
continue;
zero(sa);
sa.sa_handler = SIG_DFL;
/* On Linux the first two RT signals are reserved by
* glibc, and sigaction() will return EINVAL for them. */
if ((sigaction(sig, &sa, NULL) < 0))
if (errno != EINVAL)
return -errno;
}
return 0;
}
+2
View File
@@ -99,4 +99,6 @@ bool is_path(const char *p);
bool path_is_absolute(const char *p);
char *path_make_absolute(const char *p, const char *prefix);
int reset_all_signal_handlers(void);
#endif