From 06dab8e18aebf822392c7ca66c5bf3c1200fdec8 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 3 May 2012 22:53:25 +0200 Subject: [PATCH] dbus: include unit name in JobNew/JobRemoved signals This breaks D-Bus interface slightly, but since the D-Bus API isn't covered by the interface stability promise this should be OK. --- TODO | 6 ++---- src/core/dbus-job.c | 2 ++ src/core/dbus-manager.c | 2 ++ src/systemctl/systemctl.c | 30 +++++++++++++++++++++++++----- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 0810f3770b..2e33360ebd 100644 --- a/TODO +++ b/TODO @@ -23,6 +23,8 @@ Bugfixes: Features: +* services which create their own subcgroups break cgroup-empty notification (needs to be fixed in the kernel) + * don't delete /tmp/systemd-namespace-* before a process is gone down * don't delete /run/users/lennart if lennart is still logged in even if aging is used @@ -31,10 +33,6 @@ Features: * vconsole: implement setterm -store -foreground xxx --background zzz -* taint flag for rtc-in-localtime - -* include unit name in D-Bus 'Job' signals - * ExecOnFailure=/usr/bin/foo * logind: add "mode" flag to poweroff/suspend inhibit logic so that we can diff --git a/src/core/dbus-job.c b/src/core/dbus-job.c index 446f809bff..1b01ead2da 100644 --- a/src/core/dbus-job.c +++ b/src/core/dbus-job.c @@ -295,6 +295,7 @@ static DBusMessage* new_change_signal_message(Job *j) { if (!dbus_message_append_args(m, DBUS_TYPE_UINT32, &j->id, DBUS_TYPE_OBJECT_PATH, &p, + DBUS_TYPE_STRING, &j->unit->id, DBUS_TYPE_INVALID)) goto oom; } @@ -326,6 +327,7 @@ static DBusMessage* new_removed_signal_message(Job *j) { if (!dbus_message_append_args(m, DBUS_TYPE_UINT32, &j->id, DBUS_TYPE_OBJECT_PATH, &p, + DBUS_TYPE_STRING, &j->unit->id, DBUS_TYPE_STRING, &r, DBUS_TYPE_INVALID)) goto oom; diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 6655f2940c..b5b51133f4 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -198,10 +198,12 @@ " \n" \ " \n" \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ + " \n" \ " \n" \ " " \ " \n" \ diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 681ad8c211..d80eb94af1 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -1349,18 +1349,19 @@ static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *me } else if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Manager", "JobRemoved")) { uint32_t id; - const char *path, *result; + const char *path, *result, *unit; dbus_bool_t success = true; if (dbus_message_get_args(message, &error, DBUS_TYPE_UINT32, &id, DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_STRING, &unit, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID)) { char *p; - if ((p = set_remove(d->set, (char*) path))) - free(p); + p = set_remove(d->set, (char*) path); + free(p); if (*result) d->result = strdup(result); @@ -1369,7 +1370,26 @@ static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *me } #ifndef LEGACY dbus_error_free(&error); + if (dbus_message_get_args(message, &error, + DBUS_TYPE_UINT32, &id, + DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_STRING, &result, + DBUS_TYPE_INVALID)) { + char *p; + /* Compatibility with older systemd versions < + * 183 during upgrades. This should be dropped + * one day. */ + p = set_remove(d->set, (char*) path); + free(p); + + if (*result) + d->result = strdup(result); + + goto finish; + } + + dbus_error_free(&error); if (dbus_message_get_args(message, &error, DBUS_TYPE_UINT32, &id, DBUS_TYPE_OBJECT_PATH, &path, @@ -1381,8 +1401,8 @@ static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *me * 19 during upgrades. This should be dropped * one day */ - if ((p = set_remove(d->set, (char*) path))) - free(p); + p = set_remove(d->set, (char*) path); + free(p); if (!success) d->result = strdup("failed");