diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/dbus-job.c | 4 | ||||
-rw-r--r-- | src/core/dbus-manager.c | 60 | ||||
-rw-r--r-- | src/core/dbus-snapshot.c | 20 |
3 files changed, 65 insertions, 19 deletions
diff --git a/src/core/dbus-job.c b/src/core/dbus-job.c index fdc1dce177..20c2a62338 100644 --- a/src/core/dbus-job.c +++ b/src/core/dbus-job.c @@ -101,12 +101,11 @@ static DBusHandlerResult bus_job_message_dispatch(Job *j, DBusConnection *connec if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Job", "Cancel")) { SELINUX_UNIT_ACCESS_CHECK(j->unit, connection, message, "stop"); + job_finish_and_invalidate(j, JOB_CANCELED, true); reply = dbus_message_new_method_return(message); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - - job_finish_and_invalidate(j, JOB_CANCELED, true); } else { const BusBoundProperties bps[] = { { "org.freedesktop.systemd1.Job", bus_job_properties, j }, @@ -114,7 +113,6 @@ static DBusHandlerResult bus_job_message_dispatch(Job *j, DBusConnection *connec }; SELINUX_UNIT_ACCESS_CHECK(j->unit, connection, message, "status"); - return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps); } diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 859fa1a906..2d9cea676f 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -106,6 +106,9 @@ " <arg name=\"id\" type=\"u\" direction=\"in\"/>\n" \ " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ " </method>\n" \ + " <method name=\"CancelJob\">\n" \ + " <arg name=\"id\" type=\"u\" direction=\"in\"/>\n" \ + " </method>\n" \ " <method name=\"ClearJobs\"/>\n" \ " <method name=\"ResetFailed\"/>\n" \ " <method name=\"ListUnits\">\n" \ @@ -124,6 +127,9 @@ " <arg name=\"cleanup\" type=\"b\" direction=\"in\"/>\n" \ " <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \ " </method>\n" \ + " <method name=\"RemoveSnapshot\">\n" \ + " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ + " </method>\n" \ " <method name=\"Reload\"/>\n" \ " <method name=\"Reexecute\"/>\n" \ " <method name=\"Exit\"/>\n" \ @@ -774,10 +780,33 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBUS_TYPE_INVALID)) goto oom; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "CancelJob")) { + uint32_t id; + Job *j; + + if (!dbus_message_get_args( + message, + &error, + DBUS_TYPE_UINT32, &id, + DBUS_TYPE_INVALID)) + return bus_send_error_reply(connection, message, &error, -EINVAL); + + j = manager_get_job(m, id); + if (!j) { + dbus_set_error(&error, BUS_ERROR_NO_SUCH_JOB, "Job %u does not exist.", (unsigned) id); + return bus_send_error_reply(connection, message, &error, -ENOENT); + } + + SELINUX_UNIT_ACCESS_CHECK(j->unit, connection, message, "stop"); + job_finish_and_invalidate(j, JOB_CANCELED, true); + + reply = dbus_message_new_method_return(message); + if (!reply) + goto oom; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "ClearJobs")) { SELINUX_ACCESS_CHECK(connection, message, "reboot"); - manager_clear_jobs(m); reply = dbus_message_new_method_return(message); @@ -1080,6 +1109,35 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBUS_TYPE_INVALID)) goto oom; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "RemoveSnapshot")) { + const char *name; + Unit *u; + + if (!dbus_message_get_args( + message, + &error, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_INVALID)) + return bus_send_error_reply(connection, message, &error, -EINVAL); + + u = manager_get_unit(m, name); + if (!u) { + dbus_set_error(&error, BUS_ERROR_NO_SUCH_UNIT, "Unit %s does not exist.", name); + return bus_send_error_reply(connection, message, &error, -ENOENT); + } + + if (u->type != UNIT_SNAPSHOT) { + dbus_set_error(&error, BUS_ERROR_NO_SUCH_UNIT, "Unit %s is not a snapshot.", name); + return bus_send_error_reply(connection, message, &error, -ENOENT); + } + + SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "stop"); + snapshot_remove(SNAPSHOT(u)); + + reply = dbus_message_new_method_return(message); + if (!reply) + goto oom; + } else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) { char *introspection = NULL; FILE *f; diff --git a/src/core/dbus-snapshot.c b/src/core/dbus-snapshot.c index 435c6df39c..02cfcb1829 100644 --- a/src/core/dbus-snapshot.c +++ b/src/core/dbus-snapshot.c @@ -54,19 +54,16 @@ static const BusProperty bus_snapshot_properties[] = { DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) { Snapshot *s = SNAPSHOT(u); _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; - DBusError error; - - dbus_error_init(&error); if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Snapshot", "Remove")) { SELINUX_UNIT_ACCESS_CHECK(u, c, message, "stop"); - snapshot_remove(SNAPSHOT(u)); - reply = dbus_message_new_method_return(message); if (!reply) - goto oom; + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + snapshot_remove(SNAPSHOT(u)); } else { const BusBoundProperties bps[] = { @@ -80,15 +77,8 @@ DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusConnection *c, DBusM return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps); } - if (reply) { - if (!dbus_connection_send(c, reply, NULL)) - goto oom; - } + if (!dbus_connection_send(c, reply, NULL)) + return DBUS_HANDLER_RESULT_NEED_MEMORY; return DBUS_HANDLER_RESULT_HANDLED; - -oom: - dbus_error_free(&error); - - return DBUS_HANDLER_RESULT_NEED_MEMORY; } |