chiark / gitweb /
journal: react with immediate rotation to a couple of more errors
[elogind.git] / src / dbus-job.c
index 16aa8d071eb18dfa3f1b4f8a5c17c5615f168dd2..ab6d610243ef12ce54b284276c4afe5312b83a4a 100644 (file)
@@ -24,6 +24,7 @@
 #include "dbus.h"
 #include "log.h"
 #include "dbus-job.h"
+#include "dbus-common.h"
 
 #define BUS_JOB_INTERFACE                                             \
         " <interface name=\"org.freedesktop.systemd1.Job\">\n"        \
 
 const char bus_job_interface[] _introspect_("Job") = BUS_JOB_INTERFACE;
 
+#define INTERFACES_LIST                              \
+        BUS_GENERIC_INTERFACES_LIST                  \
+        "org.freedesktop.systemd1.Job\0"
+
 #define INVALIDATING_PROPERTIES                 \
-        "State\0"                               \
-        "\0"                                    \
+        "State\0"
 
 static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_job_append_state, job_state, JobState);
 static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_job_append_type, job_type, JobType);
 
-static int bus_job_append_unit(Manager *m, DBusMessageIter *i, const char *property, void *data) {
+static int bus_job_append_unit(DBusMessageIter *i, const char *property, void *data) {
         Job *j = data;
         DBusMessageIter sub;
         char *p;
 
-        assert(m);
         assert(i);
         assert(property);
         assert(j);
@@ -68,7 +71,7 @@ static int bus_job_append_unit(Manager *m, DBusMessageIter *i, const char *prope
         if (!(p = unit_dbus_path(j->unit)))
                 return -ENOMEM;
 
-        if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &j->unit->meta.id) ||
+        if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &j->unit->id) ||
             !dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &p)) {
                 free(p);
                 return -ENOMEM;
@@ -82,25 +85,30 @@ static int bus_job_append_unit(Manager *m, DBusMessageIter *i, const char *prope
         return 0;
 }
 
-static DBusHandlerResult bus_job_message_dispatch(Job *j, DBusConnection *connection, DBusMessage *message) {
-        const BusProperty properties[] = {
-                { "org.freedesktop.systemd1.Job", "Id",      bus_property_append_uint32, "u",    &j->id    },
-                { "org.freedesktop.systemd1.Job", "State",   bus_job_append_state,       "s",    &j->state },
-                { "org.freedesktop.systemd1.Job", "JobType", bus_job_append_type,        "s",    &j->type  },
-                { "org.freedesktop.systemd1.Job", "Unit",    bus_job_append_unit,        "(so)", j         },
-                { NULL, NULL, NULL, NULL, NULL }
-        };
+static const BusProperty bus_job_properties[] = {
+        { "Id",      bus_property_append_uint32, "u", offsetof(Job, id)    },
+        { "State",   bus_job_append_state,       "s", offsetof(Job, state) },
+        { "JobType", bus_job_append_type,        "s", offsetof(Job, type)  },
+        { "Unit",    bus_job_append_unit,     "(so)", 0 },
+        { NULL, }
+};
 
+static DBusHandlerResult bus_job_message_dispatch(Job *j, DBusConnection *connection, DBusMessage *message) {
         DBusMessage *reply = NULL;
 
         if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Job", "Cancel")) {
                 if (!(reply = dbus_message_new_method_return(message)))
                         goto oom;
 
-                job_free(j);
+                job_finish_and_invalidate(j, JOB_CANCELED);
 
-        } else
-                return bus_default_message_handler(j->manager, connection, message, INTROSPECTION, properties);
+        } else {
+                const BusBoundProperties bps[] = {
+                        { "org.freedesktop.systemd1.Job", bus_job_properties, j },
+                        { NULL, }
+                };
+                return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps);
+        }
 
         if (reply) {
                 if (!dbus_connection_send(connection, reply, NULL))
@@ -193,10 +201,15 @@ static DBusHandlerResult bus_job_message_handler(DBusConnection *connection, DBu
                 if (r == -ENOMEM)
                         return DBUS_HANDLER_RESULT_NEED_MEMORY;
 
-                if (r == -ENOENT)
-                        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+                if (r == -ENOENT) {
+                        DBusError e;
+
+                        dbus_error_init(&e);
+                        dbus_set_error_const(&e, DBUS_ERROR_UNKNOWN_OBJECT, "Unknown job");
+                        return bus_send_error_reply(connection, message, &e, r);
+                }
 
-                return bus_send_error_reply(m, connection, message, NULL, r);
+                return bus_send_error_reply(connection, message, NULL, r);
         }
 
         return bus_job_message_dispatch(j, connection, message);