chiark / gitweb /
load-fragment: show a couple of more types in --dump-configuration-items
[elogind.git] / service.c
index 25641768a94606551ee190d2dff9da91f9ccee94..d514922b6b9a9c5754e76bdf7f7350071aaeafd5 100644 (file)
--- a/service.c
+++ b/service.c
@@ -225,7 +225,7 @@ static int sysv_chkconfig_order(Service *s) {
 
                 /* FIXME: Maybe we should compare the name here lexicographically? */
 
-                if (!(r = unit_add_dependency(UNIT(s), d, UNIT(t))) < 0)
+                if (!(r = unit_add_dependency(UNIT(s), d, UNIT(t), true)) < 0)
                         return r;
         }
 
@@ -524,8 +524,8 @@ static int service_load_sysv_path(Service *s, const char *path) {
                                         if (unit_name_to_type(m) == UNIT_SERVICE)
                                                 r = unit_add_name(u, m);
                                         else {
-                                                if ((r = unit_add_dependency_by_name_inverse(u, UNIT_REQUIRES, m, NULL)) >= 0)
-                                                        r = unit_add_dependency_by_name(u, UNIT_BEFORE, m, NULL);
+                                                if ((r = unit_add_dependency_by_name_inverse(u, UNIT_REQUIRES, m, NULL, true)) >= 0)
+                                                        r = unit_add_dependency_by_name(u, UNIT_BEFORE, m, NULL, true);
                                         }
 
                                         free(m);
@@ -558,7 +558,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
                                         if (r == 0)
                                                 continue;
 
-                                        r = unit_add_dependency_by_name(u, UNIT_AFTER, m, NULL);
+                                        r = unit_add_dependency_by_name(u, UNIT_AFTER, m, NULL, true);
                                         free(m);
 
                                         if (r < 0)
@@ -654,8 +654,8 @@ static int service_load_sysv_path(Service *s, const char *path) {
                  * needed for early boot) and don't create any links
                  * to it. */
 
-                if ((r = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_BASIC_TARGET, NULL)) < 0 ||
-                    (r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_BASIC_TARGET, NULL)) < 0)
+                if ((r = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_BASIC_TARGET, NULL, true)) < 0 ||
+                    (r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_BASIC_TARGET, NULL, true)) < 0)
                         goto finish;
         }
 
@@ -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]);
 }
@@ -1890,6 +1890,22 @@ static const char *service_sub_state_to_string(Unit *u) {
         return service_state_to_string(SERVICE(u)->state);
 }
 
+static bool service_check_gc(Unit *u) {
+        Service *s = SERVICE(u);
+
+        assert(s);
+
+        return !!s->sysv_path;
+}
+
+static bool service_check_snapshot(Unit *u) {
+        Service *s = SERVICE(u);
+
+        assert(s);
+
+        return !s->got_socket_fd;
+}
+
 static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         Service *s = SERVICE(u);
         bool success;
@@ -2181,7 +2197,7 @@ static int service_enumerate(Manager *m) {
                         }
 
                         while ((de = readdir(d))) {
-                                Unit *runlevel, *service;
+                                Unit *service;
 
                                 if (ignore_file(de->d_name))
                                         continue;
@@ -2217,31 +2233,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)) < 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_target, UNIT_WANTS, service, true)) < 0)
                                                 goto finish;
 
-                                        if ((r = unit_add_dependency(runlevel, UNIT_AFTER, service)) < 0)
+                                        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 = unit_add_dependency(runlevel, UNIT_CONFLICTS, service)) < 0)
+                                        if ((r = manager_load_unit(m, SPECIAL_SHUTDOWN_TARGET, NULL, &shutdown_target)) < 0)
                                                 goto finish;
 
-                                        if ((r = unit_add_dependency(runlevel, UNIT_BEFORE, service)) < 0)
+                                        if ((r = unit_add_dependency(shutdown_target, UNIT_CONFLICTS, service, true)) < 0)
+                                                goto finish;
+
+                                        if ((r = unit_add_dependency(shutdown_target, UNIT_BEFORE, service, true)) < 0)
                                                 goto finish;
                                 }
                         }
@@ -2342,6 +2369,7 @@ int service_set_socket_fd(Service *s, int fd) {
                 return -EAGAIN;
 
         s->socket_fd = fd;
+        s->got_socket_fd = true;
         return 0;
 }
 
@@ -2416,6 +2444,9 @@ const UnitVTable service_vtable = {
         .active_state = service_active_state,
         .sub_state_to_string = service_sub_state_to_string,
 
+        .check_gc = service_check_gc,
+        .check_snapshot = service_check_snapshot,
+
         .sigchld_event = service_sigchld_event,
         .timer_event = service_timer_event,