summaryrefslogtreecommitdiff
path: root/dbus-unit.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-02-05 00:38:41 +0100
committerLennart Poettering <lennart@poettering.net>2010-02-05 00:38:41 +0100
commitc1e1601e8c6cace85b19a0eebe50076e5d119688 (patch)
tree26fe0f48cbcdbfeb21abfef75c1de3ee37e9598e /dbus-unit.c
parentab8ea24411df95861c53aeee1dd91e765331f717 (diff)
dbus: send out signals when units/jobs come, go and change
Diffstat (limited to 'dbus-unit.c')
-rw-r--r--dbus-unit.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/dbus-unit.c b/dbus-unit.c
index 1c6b405adf..f48433b60b 100644
--- a/dbus-unit.c
+++ b/dbus-unit.c
@@ -44,6 +44,7 @@ static const char introspection[] =
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>"
" <arg name=\"job\" type=\"o\" direction=\"out\"/>"
" </method>"
+ " <signal name=\"Changed\"/>"
" <property name=\"Id\" type=\"s\" access=\"read\"/>"
" <property name=\"Description\" type=\"s\" access=\"read\"/>"
" <property name=\"LoadState\" type=\"s\" access=\"read\"/>"
@@ -325,3 +326,98 @@ static DBusHandlerResult bus_unit_message_handler(DBusConnection *connection, D
const DBusObjectPathVTable bus_unit_vtable = {
.message_function = bus_unit_message_handler
};
+
+void bus_unit_send_change_signal(Unit *u) {
+ char *p = NULL;
+ DBusMessage *m = NULL;
+
+ assert(u);
+ assert(u->meta.in_dbus_queue);
+
+ LIST_REMOVE(Meta, dbus_queue, u->meta.manager->dbus_unit_queue, &u->meta);
+ u->meta.in_dbus_queue = false;
+
+ if (set_isempty(u->meta.manager->subscribed))
+ return;
+
+ if (!(p = unit_dbus_path(u)))
+ goto oom;
+
+ if (u->meta.sent_dbus_new_signal) {
+ /* Send a change signal */
+
+ if (!(m = dbus_message_new_signal(p, "org.freedesktop.systemd1.Unit", "Changed")))
+ goto oom;
+ } else {
+ const char *id;
+ /* Send a new signal */
+
+ if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1", "org.freedesktop.systemd1", "UnitNew")))
+ goto oom;
+
+ id = unit_id(u);
+ if (!dbus_message_append_args(m,
+ DBUS_TYPE_STRING, &id,
+ DBUS_TYPE_OBJECT_PATH, &p,
+ DBUS_TYPE_INVALID))
+ goto oom;
+ }
+
+ if (!dbus_connection_send(u->meta.manager->bus, m, NULL))
+ goto oom;
+
+ free(p);
+ dbus_message_unref(m);
+
+ u->meta.sent_dbus_new_signal = true;
+
+ return;
+
+oom:
+ free(p);
+
+ if (m)
+ dbus_message_unref(m);
+
+ log_error("Failed to allocate unit change/new signal.");
+}
+
+void bus_unit_send_removed_signal(Unit *u) {
+ char *p = NULL;
+ DBusMessage *m = NULL;
+ const char *id;
+
+ assert(u);
+
+ if (set_isempty(u->meta.manager->subscribed) || !u->meta.sent_dbus_new_signal)
+ return;
+
+ if (!(p = unit_dbus_path(u)))
+ goto oom;
+
+ if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1", "org.freedesktop.systemd1", "UnitRemoved")))
+ goto oom;
+
+ id = unit_id(u);
+ if (!dbus_message_append_args(m,
+ DBUS_TYPE_STRING, &id,
+ DBUS_TYPE_OBJECT_PATH, &p,
+ DBUS_TYPE_INVALID))
+ goto oom;
+
+ if (!dbus_connection_send(u->meta.manager->bus, m, NULL))
+ goto oom;
+
+ free(p);
+ dbus_message_unref(m);
+
+ return;
+
+oom:
+ free(p);
+
+ if (m)
+ dbus_message_unref(m);
+
+ log_error("Failed to allocate unit remove signal.");
+}