chiark / gitweb /
Fix possible lack of status messages on shutdown/reboot
[elogind.git] / src / core / dbus-scope.c
index 1497b76761617e7296fc619b26b176812ea6ed39..c790d26cfec7de91f2dc0fb3fb65f95c932dc5d9 100644 (file)
@@ -30,6 +30,7 @@
 
 #define BUS_SCOPE_INTERFACE                                             \
         " <interface name=\"org.freedesktop.systemd1.Scope\">\n"        \
+        BUS_UNIT_CGROUP_INTERFACE                                       \
         "  <property name=\"TimeoutStopUSec\" type=\"t\" access=\"read\"/>\n" \
         BUS_KILL_CONTEXT_INTERFACE                                      \
         BUS_CGROUP_CONTEXT_INTERFACE                                    \
@@ -50,7 +51,7 @@
         BUS_UNIT_INTERFACES_LIST                     \
         "org.freedesktop.systemd1.Scope\0"
 
-const char bus_scope_interface[] _introspect_("Scope") = BUS_SCOPE_INTERFACE;
+const char bus_scope_interface[] = BUS_SCOPE_INTERFACE;
 
 static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_scope_append_scope_result, scope_result, ScopeResult);
 
@@ -65,6 +66,7 @@ DBusHandlerResult bus_scope_message_handler(Unit *u, DBusConnection *c, DBusMess
 
         const BusBoundProperties bps[] = {
                 { "org.freedesktop.systemd1.Unit",  bus_unit_properties,           u },
+                { "org.freedesktop.systemd1.Scope", bus_unit_cgroup_properties,    u },
                 { "org.freedesktop.systemd1.Scope", bus_scope_properties,          s },
                 { "org.freedesktop.systemd1.Scope", bus_cgroup_context_properties, &s->cgroup_context },
                 { "org.freedesktop.systemd1.Scope", bus_kill_context_properties,   &s->kill_context   },
@@ -76,7 +78,7 @@ DBusHandlerResult bus_scope_message_handler(Unit *u, DBusConnection *c, DBusMess
         return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps);
 }
 
-static int bus_scope_set_transient_properties(
+static int bus_scope_set_transient_property(
                 Scope *s,
                 const char *name,
                 DBusMessageIter *i,
@@ -91,6 +93,7 @@ static int bus_scope_set_transient_properties(
 
         if (streq(name, "PIDs")) {
                 DBusMessageIter sub;
+                unsigned n = 0;
 
                 if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_ARRAY ||
                     dbus_message_iter_get_element_type(i) != DBUS_TYPE_UINT32)
@@ -109,17 +112,37 @@ static int bus_scope_set_transient_properties(
                         if (pid <= 1)
                                 return -EINVAL;
 
-                        r = set_put(s->pids, LONG_TO_PTR(pid));
-                        if (r < 0 && r != -EEXIST)
-                                return r;
+                        if (mode != UNIT_CHECK) {
+                                r = set_put(s->pids, LONG_TO_PTR(pid));
+                                if (r < 0 && r != -EEXIST)
+                                        return r;
+                        }
 
                         dbus_message_iter_next(&sub);
+                        n++;
                 }
 
-                if (set_size(s->pids) <= 0)
+                if (n <= 0)
                         return -EINVAL;
 
                 return 1;
+
+        } else if (streq(name, "TimeoutStopUSec")) {
+
+                if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_UINT64)
+                        return -EINVAL;
+
+                if (mode != UNIT_CHECK) {
+                        uint64_t t;
+
+                        dbus_message_iter_get_basic(i, &t);
+
+                        s->timeout_stop_usec = t;
+
+                        unit_write_drop_in_format(UNIT(s), mode, name, "[Scope]\nTimeoutStopSec=%lluus\n", (unsigned long long) t);
+                }
+
+                return 1;
         }
 
         return 0;
@@ -146,7 +169,11 @@ int bus_scope_set_property(
         if (u->load_state == UNIT_STUB) {
                 /* While we are created we still accept PIDs */
 
-                r = bus_scope_set_transient_properties(s, name, i, mode, error);
+                r = bus_scope_set_transient_property(s, name, i, mode, error);
+                if (r != 0)
+                        return r;
+
+                r = bus_kill_context_set_transient_property(u, &s->kill_context, name, i, mode, error);
                 if (r != 0)
                         return r;
         }