chiark / gitweb /
drop O_CLOEXEC/O_NONBLOCK from files intended for forked clients
[elogind.git] / service.c
index fce42045a9cbaca4775f910a498be6458d45b2e2..ae7fc36a5c4bedd54ac35516443316139e139c0f 100644 (file)
--- a/service.c
+++ b/service.c
@@ -285,6 +285,9 @@ static int service_collect_fds(Service *s, int **fds, unsigned *n_fds) {
                 p = manager_get_unit(UNIT(s)->meta.manager, k);
                 free(k);
 
+                if (!p)
+                        continue;
+
                 if ((r = socket_collect_fds(SOCKET(p), &cfds, &cn_fds)) < 0)
                         goto fail;
 
@@ -736,7 +739,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 = code == CLD_EXITED && status == 0;
         s->failure = s->failure || !success;
 
         if (s->main_pid == pid) {
@@ -803,6 +806,8 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                         /* No further commands for this step, so let's
                          * figure out what to do next */
 
+                        log_debug("%s got final SIGCHLD for state %s", unit_id(u), state_string_table[s->state]);
+
                         switch (s->state) {
 
                         case SERVICE_START_PRE: