chiark / gitweb /
dbus: include unit name in JobNew/JobRemoved signals
authorLennart Poettering <lennart@poettering.net>
Thu, 3 May 2012 20:53:25 +0000 (22:53 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 3 May 2012 20:53:25 +0000 (22:53 +0200)
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
src/core/dbus-job.c
src/core/dbus-manager.c
src/systemctl/systemctl.c

diff --git a/TODO b/TODO
index 0810f3770b150410097c7a91fffe6c47319b26d3..2e33360ebd40fefa517e278854cb90b53d95c955 100644 (file)
--- 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
index 446f809bffea256292243f31e737e73fc8478073..1b01ead2da89d203d1b4dd867368561aeb5e64f3 100644 (file)
@@ -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;
index 6655f2940ca8b82ebae0871a35f9c38256455c04..b5b51133f4e238dd2adc984220020125749783a6 100644 (file)
         "  <signal name=\"JobNew\">\n"                                  \
         "   <arg name=\"id\" type=\"u\"/>\n"                            \
         "   <arg name=\"job\" type=\"o\"/>\n"                           \
+        "   <arg name=\"unit\" type=\"s\"/>\n"                          \
         "  </signal>\n"                                                 \
         "  <signal name=\"JobRemoved\">\n"                              \
         "   <arg name=\"id\" type=\"u\"/>\n"                            \
         "   <arg name=\"job\" type=\"o\"/>\n"                           \
+        "   <arg name=\"unit\" type=\"s\"/>\n"                          \
         "   <arg name=\"result\" type=\"s\"/>\n"                        \
         "  </signal>"                                                   \
         "  <signal name=\"StartupFinished\">\n"                         \
index 681ad8c2116a0f6a8c12f22a88abbe47ad5b5544..d80eb94af15fd5ffab855ee31e1144d7a6fe12e1 100644 (file)
@@ -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");