chiark / gitweb /
manager: properly check for EINTR in main loop
[elogind.git] / service.c
index 4008ac20ffea76bce8c9a1d15078b87c895965e4..eb8688671b0d4c132921f748cabd2d7a75b09873 100644 (file)
--- a/service.c
+++ b/service.c
@@ -875,7 +875,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
                 if (!s->exec_command[c])
                         continue;
 
-                fprintf(f, "%s %s:\n",
+                fprintf(f, "%s-> %s:\n",
                         prefix, service_exec_command_to_string(c));
 
                 exec_command_dump_list(s->exec_command[c], f, prefix2);
@@ -1069,7 +1069,7 @@ static void service_set_state(Service *s, ServiceState state) {
                 service_close_socket_fd(s);
 
         if (old_state != state)
-                log_debug("%s changed %s  %s", UNIT(s)->meta.id, service_state_to_string(old_state), service_state_to_string(state));
+                log_debug("%s changed %s -> %s", UNIT(s)->meta.id, service_state_to_string(old_state), service_state_to_string(state));
 
         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);
 }
@@ -1093,13 +1093,17 @@ static int service_coldplug(Unit *u) {
                     s->deserialized_state == SERVICE_STOP_POST ||
                     s->deserialized_state == SERVICE_FINAL_SIGTERM ||
                     s->deserialized_state == SERVICE_FINAL_SIGKILL ||
-                    s->deserialized_state == SERVICE_AUTO_RESTART)
-                        if ((r = unit_watch_timer(UNIT(s),
-                                                  s->deserialized_state == SERVICE_AUTO_RESTART ?
-                                                  s->restart_usec :
-                                                  s->timeout_usec,
-                                                  &s->timer_watch)) < 0)
-                                return r;
+                    s->deserialized_state == SERVICE_AUTO_RESTART) {
+
+                        if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_usec > 0) {
+                                usec_t k;
+
+                                k = s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : s->timeout_usec;
+
+                                if ((r = unit_watch_timer(UNIT(s), k, &s->timer_watch)) < 0)
+                                        return r;
+                        }
+                }
 
                 if ((s->deserialized_state == SERVICE_START &&
                      (s->type == SERVICE_FORKING ||
@@ -1222,7 +1226,7 @@ static int service_spawn(
                         goto fail;
         }
 
-        if (timeout) {
+        if (timeout && s->timeout_usec) {
                 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
                         goto fail;
         } else
@@ -1409,8 +1413,9 @@ static void service_enter_signal(Service *s, ServiceState state, bool success) {
         }
 
         if (sent) {
-                if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
-                        goto fail;
+                if (s->timeout_usec > 0)
+                        if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
+                                goto fail;
 
                 service_set_state(s, state);
         } else if (state == SERVICE_STOP_SIGTERM || state == SERVICE_STOP_SIGKILL)
@@ -2197,7 +2202,7 @@ static int service_enumerate(Manager *m) {
                         }
 
                         while ((de = readdir(d))) {
-                                Unit *runlevel, *service;
+                                Unit *service;
 
                                 if (ignore_file(de->d_name))
                                         continue;
@@ -2233,31 +2238,42 @@ static int service_enumerate(Manager *m) {
                                 if ((r = manager_load_unit(m, name, NULL, &service)) < 0)
                                         goto finish;
 
-                                if ((r = manager_load_unit(m, rcnd_table[i+1], NULL, &runlevel)) < 0)
-                                        goto finish;
-
                                 if (de->d_name[0] == 'S') {
-                                        if ((r = unit_add_dependency(runlevel, UNIT_WANTS, service, true)) < 0)
+                                        Unit *runlevel_target;
+
+                                        if ((r = manager_load_unit(m, rcnd_table[i+1], NULL, &runlevel_target)) < 0)
                                                 goto finish;
 
-                                        if ((r = unit_add_dependency(runlevel, UNIT_AFTER, service, true)) < 0)
+                                        if ((r = unit_add_dependency(runlevel_target, UNIT_WANTS, service, true)) < 0)
+                                                goto finish;
+
+                                        if ((r = unit_add_dependency(runlevel_target, UNIT_AFTER, service, true)) < 0)
                                                 goto finish;
 
                                 } else if (de->d_name[0] == 'K' &&
                                            (streq(rcnd_table[i+1], SPECIAL_RUNLEVEL0_TARGET) ||
                                             streq(rcnd_table[i+1], SPECIAL_RUNLEVEL6_TARGET))) {
 
+                                        Unit *shutdown_target;
+
                                         /* We honour K links only for
                                          * halt/reboot. For the normal
                                          * runlevels we assume the
                                          * stop jobs will be
                                          * implicitly added by the
-                                         * core logic. */
+                                         * core logic. Also, we don't
+                                         * really distuingish here
+                                         * between the runlevels 0 and
+                                         * 6 and just add them to the
+                                         * special shutdown target. */
+
+                                        if ((r = manager_load_unit(m, SPECIAL_SHUTDOWN_TARGET, NULL, &shutdown_target)) < 0)
+                                                goto finish;
 
-                                        if ((r = unit_add_dependency(runlevel, UNIT_CONFLICTS, service, true)) < 0)
+                                        if ((r = unit_add_dependency(shutdown_target, UNIT_CONFLICTS, service, true)) < 0)
                                                 goto finish;
 
-                                        if ((r = unit_add_dependency(runlevel, UNIT_BEFORE, service, true)) < 0)
+                                        if ((r = unit_add_dependency(shutdown_target, UNIT_BEFORE, service, true)) < 0)
                                                 goto finish;
                                 }
                         }