chiark / gitweb /
main: fix auto restarting of units after a configuration reload
[elogind.git] / src / dbus-unit.c
index ce34130993872bf018316a1d7003e45724e4a03e..c9ccac1472f9937a18a376c5f744460092b823cc 100644 (file)
@@ -47,6 +47,24 @@ int bus_unit_append_names(Manager *m, DBusMessageIter *i, const char *property,
         return 0;
 }
 
+int bus_unit_append_following(Manager *m, DBusMessageIter *i, const char *property, void *data) {
+        Unit *u = data, *f;
+        const char *d;
+
+        assert(m);
+        assert(i);
+        assert(property);
+        assert(u);
+
+        f = unit_following(u);
+        d = f ? f->meta.id : "";
+
+        if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d))
+                return -ENOMEM;
+
+        return 0;
+}
+
 int bus_unit_append_dependencies(Manager *m, DBusMessageIter *i, const char *property, void *data) {
         Unit *u;
         Iterator j;
@@ -298,6 +316,13 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn
         } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "ReloadOrTryRestart")) {
                 reload_if_possible = true;
                 job_type = JOB_TRY_RESTART;
+        } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "ResetMaintenance")) {
+
+                unit_reset_maintenance(u);
+
+                if (!(reply = dbus_message_new_method_return(message)))
+                        goto oom;
+
         } else if (UNIT_VTABLE(u)->bus_message_handler)
                 return UNIT_VTABLE(u)->bus_message_handler(u, connection, message);
         else
@@ -409,6 +434,9 @@ void bus_unit_send_change_signal(Unit *u) {
                 u->meta.in_dbus_queue = false;
         }
 
+        if (!u->meta.id)
+                return;
+
         if (!bus_has_subscriber(u->meta.manager)) {
                 u->meta.sent_dbus_new_signal = true;
                 return;
@@ -466,6 +494,9 @@ void bus_unit_send_removed_signal(Unit *u) {
         if (!u->meta.sent_dbus_new_signal)
                 bus_unit_send_change_signal(u);
 
+        if (!u->meta.id)
+                return;
+
         if (!(p = unit_dbus_path(u)))
                 goto oom;