systemctl: when calling 'status' accept a PID

This commit is contained in:
Lennart Poettering 2010-08-13 02:07:22 +02:00
parent 20c5e441cb
commit 598b557bf0
4 changed files with 68 additions and 6 deletions

4
fixme
View File

@ -51,8 +51,6 @@
* selinux policy loading
* systemctl status $PID, systemctl stop $PID!
* place /etc/inittab with explaining blurb.
* fingerprint.target, wireless.target, gps.target
@ -75,8 +73,6 @@
* plymouth after/before getty?
* D-Bus call GetUnitByPID
* be more forgiving when parsing unit files, when encountering incorrect lines with non assignments
* ExecStart= mehrfach bei Type=finish

View File

@ -33,6 +33,10 @@
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"GetUnitByPID\">\n" \
" <arg name=\"pid\" type=\"u\" direction=\"in\"/>\n" \
" <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"LoadUnit\">\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \
@ -290,7 +294,34 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID))
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "GetUnitByPID")) {
const char *name;
Unit *u;
uint32_t pid;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_UINT32, &pid,
DBUS_TYPE_INVALID))
return bus_send_error_reply(m, connection, message, &error, -EINVAL);
if (!(u = cgroup_unit_by_pid(m, (pid_t) pid))) {
dbus_set_error(&error, BUS_ERROR_NO_SUCH_UNIT, "No unit for PID %lu is loaded.", (unsigned long) pid);
return bus_send_error_reply(m, connection, message, &error, -ENOENT);
}
if (!(reply = dbus_message_new_method_return(message)))
goto oom;
if (!(path = unit_dbus_path(u)))
goto oom;
if (!dbus_message_append_args(
reply,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID))
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "LoadUnit")) {
const char *name;
Unit *u;

View File

@ -43,6 +43,10 @@
send_interface="org.freedesktop.systemd1.Manager"
send_member="GetUnit"/>
<allow send_destination="org.freedesktop.systemd1"
send_interface="org.freedesktop.systemd1.Manager"
send_member="GetUnitByPID"/>
<allow send_destination="org.freedesktop.systemd1"
send_interface="org.freedesktop.systemd1.Manager"
send_member="GetJob"/>

View File

@ -2121,7 +2121,9 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
const char *path = NULL;
uint32_t id;
if (!show_properties || safe_atou32(args[i], &id) < 0) {
if (safe_atou32(args[i], &id) < 0) {
/* Interpret as unit name */
if (!(m = dbus_message_new_method_call(
"org.freedesktop.systemd1",
@ -2177,7 +2179,9 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
}
}
} else {
} else if (show_properties) {
/* Interpret as job id */
if (!(m = dbus_message_new_method_call(
"org.freedesktop.systemd1",
@ -2197,6 +2201,33 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
goto finish;
}
if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
log_error("Failed to issue method call: %s", error.message);
r = -EIO;
goto finish;
}
} else {
/* Interpret as PID */
if (!(m = dbus_message_new_method_call(
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"GetUnitByPID"))) {
log_error("Could not allocate message.");
r = -ENOMEM;
goto finish;
}
if (!dbus_message_append_args(m,
DBUS_TYPE_UINT32, &id,
DBUS_TYPE_INVALID)) {
log_error("Could not append arguments to message.");
r = -ENOMEM;
goto finish;
}
if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
log_error("Failed to issue method call: %s", error.message);
r = -EIO;