mirror of
https://github.com/systemd/systemd.git
synced 2024-11-01 09:21:26 +03:00
dbus: duplicate Job.Cancel() as CancelJob() and Snapshot.Remove() as RemoveSnapshot() on the Manager interface
For all other object mehtods there are already counterparts on the manager object, as they help us reduce round-trips. So let's complete this, and reduce complexity on the client side a bit. As a side effect this also makes "systemctl snapshot" without arguments work again.
This commit is contained in:
parent
d354315ff7
commit
5dd9014faf
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1032,12 +1032,14 @@ finish:
|
||||
}
|
||||
|
||||
static int load_unit(DBusConnection *bus, char **args) {
|
||||
int r = 0;
|
||||
char **name, *n;
|
||||
char **name;
|
||||
|
||||
assert(args);
|
||||
|
||||
STRV_FOREACH(name, args+1) {
|
||||
_cleanup_free_ char *n = NULL;
|
||||
int r;
|
||||
|
||||
n = unit_name_mangle(*name);
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
@ -1049,18 +1051,14 @@ static int load_unit(DBusConnection *bus, char **args) {
|
||||
NULL,
|
||||
DBUS_TYPE_STRING, n ? &n : name,
|
||||
DBUS_TYPE_INVALID);
|
||||
free(n);
|
||||
if (r)
|
||||
goto finish;
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
finish:
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cancel_job(DBusConnection *bus, char **args) {
|
||||
DBusMessage *reply = NULL;
|
||||
int r = 0;
|
||||
char **name;
|
||||
|
||||
assert(args);
|
||||
@ -1069,54 +1067,30 @@ static int cancel_job(DBusConnection *bus, char **args) {
|
||||
return daemon_reload(bus, args);
|
||||
|
||||
STRV_FOREACH(name, args+1) {
|
||||
unsigned id;
|
||||
const char *path;
|
||||
uint32_t id;
|
||||
int r;
|
||||
|
||||
r = safe_atou(*name, &id);
|
||||
r = safe_atou32(*name, &id);
|
||||
if (r < 0) {
|
||||
log_error("Failed to parse job id: %s", strerror(-r));
|
||||
goto finish;
|
||||
return r;
|
||||
}
|
||||
assert_cc(sizeof(uint32_t) == sizeof(id));
|
||||
|
||||
r = bus_method_call_with_reply (
|
||||
r = bus_method_call_with_reply(
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"GetJob",
|
||||
&reply,
|
||||
"CancelJob",
|
||||
NULL,
|
||||
NULL,
|
||||
DBUS_TYPE_UINT32, &id,
|
||||
DBUS_TYPE_INVALID);
|
||||
if (r)
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_get_args(reply, NULL,
|
||||
DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_INVALID)) {
|
||||
log_error("Failed to parse reply");
|
||||
dbus_message_unref(reply);
|
||||
r = -EIO;
|
||||
goto finish;
|
||||
}
|
||||
dbus_message_unref(reply);
|
||||
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
path,
|
||||
"org.freedesktop.systemd1.Job",
|
||||
"Cancel",
|
||||
NULL,
|
||||
NULL,
|
||||
DBUS_TYPE_INVALID);
|
||||
if (r)
|
||||
goto finish;
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
finish:
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool need_daemon_reload(DBusConnection *bus, const char *unit) {
|
||||
@ -3062,7 +3036,7 @@ finish:
|
||||
}
|
||||
|
||||
static int snapshot(DBusConnection *bus, char **args) {
|
||||
DBusMessage *reply = NULL;
|
||||
_cleanup_dbus_message_unref_ DBusMessage *reply = NULL;
|
||||
DBusError error;
|
||||
int r;
|
||||
dbus_bool_t cleanup = FALSE;
|
||||
@ -3071,14 +3045,15 @@ static int snapshot(DBusConnection *bus, char **args) {
|
||||
*name = "", *path, *id,
|
||||
*interface = "org.freedesktop.systemd1.Unit",
|
||||
*property = "Id";
|
||||
char *n;
|
||||
_cleanup_free_ char *n = NULL;
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
if (strv_length(args) > 1)
|
||||
if (strv_length(args) > 1) {
|
||||
name = args[1];
|
||||
n = unit_name_mangle(name);
|
||||
}
|
||||
|
||||
n = unit_name_mangle(name);
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
@ -3090,8 +3065,7 @@ static int snapshot(DBusConnection *bus, char **args) {
|
||||
DBUS_TYPE_STRING, n ? (const char**) &n : &name,
|
||||
DBUS_TYPE_BOOLEAN, &cleanup,
|
||||
DBUS_TYPE_INVALID);
|
||||
free(n);
|
||||
if (r)
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_get_args(reply, &error,
|
||||
@ -3103,6 +3077,8 @@ static int snapshot(DBusConnection *bus, char **args) {
|
||||
}
|
||||
|
||||
dbus_message_unref(reply);
|
||||
reply = NULL;
|
||||
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
@ -3114,7 +3090,7 @@ static int snapshot(DBusConnection *bus, char **args) {
|
||||
DBUS_TYPE_STRING, &interface,
|
||||
DBUS_TYPE_STRING, &property,
|
||||
DBUS_TYPE_INVALID);
|
||||
if (r)
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_iter_init(reply, &iter) ||
|
||||
@ -3138,69 +3114,36 @@ static int snapshot(DBusConnection *bus, char **args) {
|
||||
puts(id);
|
||||
|
||||
finish:
|
||||
if (reply)
|
||||
dbus_message_unref(reply);
|
||||
|
||||
dbus_error_free(&error);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int delete_snapshot(DBusConnection *bus, char **args) {
|
||||
DBusMessage *reply = NULL;
|
||||
int r = 0;
|
||||
DBusError error;
|
||||
char **name;
|
||||
|
||||
assert(args);
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
STRV_FOREACH(name, args+1) {
|
||||
const char *path = NULL;
|
||||
char *n;
|
||||
_cleanup_free_ char *n = NULL;
|
||||
int r;
|
||||
|
||||
n = unit_name_mangle(*name);
|
||||
r = bus_method_call_with_reply (
|
||||
r = bus_method_call_with_reply(
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"GetUnit",
|
||||
&reply,
|
||||
"RemoveSnapshot",
|
||||
NULL,
|
||||
NULL,
|
||||
DBUS_TYPE_STRING, n ? &n : name,
|
||||
DBUS_TYPE_INVALID);
|
||||
free(n);
|
||||
if (r)
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_get_args(reply, &error,
|
||||
DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_INVALID)) {
|
||||
log_error("Failed to parse reply: %s", bus_error_message(&error));
|
||||
r = -EIO;
|
||||
dbus_message_unref(reply);
|
||||
dbus_error_free(&error);
|
||||
goto finish;
|
||||
}
|
||||
dbus_message_unref(reply);
|
||||
|
||||
r = bus_method_call_with_reply (
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
path,
|
||||
"org.freedesktop.systemd1.Snapshot",
|
||||
"Remove",
|
||||
NULL,
|
||||
NULL,
|
||||
DBUS_TYPE_INVALID);
|
||||
if (r)
|
||||
goto finish;
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
finish:
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int daemon_reload(DBusConnection *bus, char **args) {
|
||||
|
Loading…
Reference in New Issue
Block a user