summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-05-16 03:55:19 +0200
committerLennart Poettering <lennart@poettering.net>2010-05-16 03:55:19 +0200
commitcb8a8f78a11cedb8cba1abfa9a63b0d3ea8eef93 (patch)
tree478197daa12a47d8be21d0fc458662ead9af2255
parentca139f94c8de427616f54ab38262a47c4a636ffd (diff)
service: consider a process exiting with SIGTERM a clean exit
-rw-r--r--mount.c2
-rw-r--r--service.c2
-rw-r--r--socket.c2
-rw-r--r--util.c17
-rw-r--r--util.h2
5 files changed, 22 insertions, 3 deletions
diff --git a/mount.c b/mount.c
index 2b24ea5c8c..ec03a52f6a 100644
--- a/mount.c
+++ b/mount.c
@@ -900,7 +900,7 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
assert(m);
assert(pid >= 0);
- success = code == CLD_EXITED && status == 0;
+ success = is_clean_exit(code, status);
m->failure = m->failure || !success;
assert(m->control_pid == pid);
diff --git a/service.c b/service.c
index ca25248dfa..bf91561901 100644
--- a/service.c
+++ b/service.c
@@ -1890,7 +1890,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
assert(s);
assert(pid >= 0);
- success = code == CLD_EXITED && status == 0;
+ success = is_clean_exit(code, status);
s->failure = s->failure || !success;
if (s->main_pid == pid) {
diff --git a/socket.c b/socket.c
index aafe43987a..259f2733cc 100644
--- a/socket.c
+++ b/socket.c
@@ -1204,7 +1204,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
assert(s);
assert(pid >= 0);
- success = code == CLD_EXITED && status == 0;
+ success = is_clean_exit(code, status);
s->failure = s->failure || !success;
assert(s->control_pid == pid);
diff --git a/util.c b/util.c
index 95791f941d..5e3654d1d1 100644
--- a/util.c
+++ b/util.c
@@ -1910,6 +1910,23 @@ int make_stdio(int fd) {
return 0;
}
+bool is_clean_exit(int code, int status) {
+
+ if (code == CLD_EXITED)
+ return status == 0;
+
+ /* If a daemon does not implement handlers for some of the
+ * signals that's not considered an unclean shutdown */
+ if (code == CLD_KILLED)
+ return
+ status == SIGHUP ||
+ status == SIGINT ||
+ status == SIGTERM ||
+ status == SIGPIPE;
+
+ return false;
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
diff --git a/util.h b/util.h
index ba27c759e8..d0fc319e03 100644
--- a/util.h
+++ b/util.h
@@ -181,6 +181,8 @@ char *format_timestamp(char *buf, size_t l, usec_t t);
int make_stdio(int fd);
+bool is_clean_exit(int code, int status);
+
#define DEFINE_STRING_TABLE_LOOKUP(name,type) \
const char *name##_to_string(type i) { \
if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \