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);
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) {
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);
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",
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)) \