chiark / gitweb /
service: add dependencies on configured sockets
[elogind.git] / src / service.c
index 07137d265d3fab1b05c5ebac5b9601da8fc4c0f7..c5a796623f18708daaae8f63d248f20144d2b8a4 100644 (file)
@@ -841,7 +841,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
         s->restart = SERVICE_RESTART_NO;
 
         if (s->meta.manager->sysv_console)
-                s->exec_context.std_output = EXEC_OUTPUT_TTY;
+                s->exec_context.std_output = EXEC_OUTPUT_JOURNAL_AND_CONSOLE;
 
         s->exec_context.kill_mode = KILL_PROCESS;
 
@@ -1108,6 +1108,22 @@ static int service_add_default_dependencies(Service *s) {
         return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
 }
 
+static int service_add_socket_dependencies(Service *s) {
+        Iterator i;
+        Unit *u;
+        int r;
+
+        /* Make sure we pull in all explicitly configured sockets */
+
+        SET_FOREACH(u, s->configured_sockets, i) {
+                r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, u, true);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
 static void service_fix_output(Service *s) {
         assert(s);
 
@@ -1181,6 +1197,12 @@ static int service_load(Unit *u) {
                         if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_DBUS_SOCKET, NULL, true)) < 0)
                                 return r;
 
+                if (!set_isempty(s->configured_sockets)) {
+                        r = service_add_socket_dependencies(s);
+                        if (r < 0)
+                                return r;
+                }
+
                 if (s->meta.default_dependencies)
                         if ((r = service_add_default_dependencies(s)) < 0)
                                 return r;
@@ -2870,20 +2892,22 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                 break;
 
                         case SERVICE_START_POST:
-                                if (success) {
-                                        if (s->pid_file) {
-                                                int r = service_load_pid_file(s, true);
-                                                if (r < 0) {
-                                                        r = service_demand_pid_file(s);
-                                                        if (r < 0 || !cgroup_good(s))
-                                                                service_enter_stop(s, false);
-                                                        break;
-                                                }
-                                        } else
-                                                service_search_main_pid(s);
+                                if (!success) {
+                                        service_enter_stop(s, false);
+                                        break;
                                 }
 
-                                s->reload_failure = !success;
+                                if (s->pid_file) {
+                                        int r = service_load_pid_file(s, true);
+                                        if (r < 0) {
+                                                r = service_demand_pid_file(s);
+                                                if (r < 0 || !cgroup_good(s))
+                                                        service_enter_stop(s, false);
+                                                break;
+                                        }
+                                } else
+                                        service_search_main_pid(s);
+
                                 service_enter_running(s, true);
                                 break;