chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
extend examples a bit
[elogind.git]
/
manager.c
diff --git
a/manager.c
b/manager.c
index e9ae40ca7436bb0c642e0237f5410683cfb45196..f15cf79869f3a23028e60025037c759661612ca2 100644
(file)
--- a/
manager.c
+++ b/
manager.c
@@
-15,6
+15,7
@@
#include "macro.h"
#include "strv.h"
#include "log.h"
#include "macro.h"
#include "strv.h"
#include "log.h"
+#include "util.h"
Manager* manager_new(void) {
Manager *m;
Manager* manager_new(void) {
Manager *m;
@@
-41,8
+42,14
@@
Manager* manager_new(void) {
if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
goto fail;
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(sigemptyset(&mask) == 0);
assert_se(sigaddset(&mask, SIGCHLD) == 0);
+ assert_se(sigaddset(&mask, SIGINT) == 0);
+ assert_se(sigaddset(&mask, SIGTERM) == 0);
+ assert_se(sigaddset(&mask, SIGWINCH) == 0);
+ assert_se(sigaddset(&mask, SIGHUP) == 0);
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
m->signal_watch.type = WATCH_SIGNAL_FD;
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
m->signal_watch.type = WATCH_SIGNAL_FD;
@@
-977,7
+984,7
@@
static int manager_dispatch_sigchld(Manager *m) {
return 0;
}
return 0;
}
-static int manager_process_signal_fd(Manager *m) {
+static int manager_process_signal_fd(Manager *m
, bool *quit
) {
ssize_t n;
struct signalfd_siginfo sfsi;
bool sigchld = false;
ssize_t n;
struct signalfd_siginfo sfsi;
bool sigchld = false;
@@
-996,8
+1003,20
@@
static int manager_process_signal_fd(Manager *m) {
return -errno;
}
return -errno;
}
- if (sfsi.ssi_signo == SIGCHLD)
+ switch (sfsi.ssi_signo) {
+
+ case SIGCHLD:
sigchld = true;
sigchld = true;
+ break;
+
+ case SIGINT:
+ case SIGTERM:
+ *quit = true;
+ return 0;
+
+ default:
+ log_info("Got unhandled signal <%s>.", strsignal(sfsi.ssi_signo));
+ }
}
if (sigchld)
}
if (sigchld)
@@
-1006,7
+1025,7
@@
static int manager_process_signal_fd(Manager *m) {
return 0;
}
return 0;
}
-static int process_event(Manager *m, struct epoll_event *ev) {
+static int process_event(Manager *m, struct epoll_event *ev
, bool *quit
) {
int r;
Watch *w;
int r;
Watch *w;
@@
-1023,7
+1042,7
@@
static int process_event(Manager *m, struct epoll_event *ev) {
if (ev->events != POLLIN)
return -EINVAL;
if (ev->events != POLLIN)
return -EINVAL;
- if ((r = manager_process_signal_fd(m)) < 0)
+ if ((r = manager_process_signal_fd(m
, quit
)) < 0)
return r;
break;
return r;
break;
@@
-1060,6
+1079,7
@@
static int process_event(Manager *m, struct epoll_event *ev) {
int manager_loop(Manager *m) {
int r;
int manager_loop(Manager *m) {
int r;
+ bool quit = false;
assert(m);
assert(m);
@@
-1077,8
+1097,12
@@
int manager_loop(Manager *m) {
return -errno;
}
return -errno;
}
- for (i = 0; i < n; i++)
- if ((r = process_event(m, events + i)) < 0)
+ for (i = 0; i < n; i++)
{
+ if ((r = process_event(m, events + i
, &quit
)) < 0)
return r;
return r;
+
+ if (quit)
+ return 0;
+ }
}
}
}
}