core: add unit_dbus_interface_from_type() to unit-name.h
Let's add a way to get the type-specific D-Bus interface of a unit from either its type or name to src/basic/unit-name.[ch]. That way we can share it with the client side, where it is useful in tools like cgls or machinectl. Also ports over machinectl to make use of this.
This commit is contained in:
parent
d56cc29880
commit
21b735e798
|
@ -586,6 +586,42 @@ int unit_name_from_dbus_path(const char *path, char **name) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
const char* unit_dbus_interface_from_type(UnitType t) {
|
||||
|
||||
static const char *const table[_UNIT_TYPE_MAX] = {
|
||||
[UNIT_SERVICE] = "org.freedesktop.systemd1.Service",
|
||||
[UNIT_SOCKET] = "org.freedesktop.systemd1.Socket",
|
||||
[UNIT_BUSNAME] = "org.freedesktop.systemd1.BusName",
|
||||
[UNIT_TARGET] = "org.freedesktop.systemd1.Target",
|
||||
[UNIT_SNAPSHOT] = "org.freedesktop.systemd1.Snapshot",
|
||||
[UNIT_DEVICE] = "org.freedesktop.systemd1.Device",
|
||||
[UNIT_MOUNT] = "org.freedesktop.systemd1.Mount",
|
||||
[UNIT_AUTOMOUNT] = "org.freedesktop.systemd1.Automount",
|
||||
[UNIT_SWAP] = "org.freedesktop.systemd1.Swap",
|
||||
[UNIT_TIMER] = "org.freedesktop.systemd1.Timer",
|
||||
[UNIT_PATH] = "org.freedesktop.systemd1.Path",
|
||||
[UNIT_SLICE] = "org.freedesktop.systemd1.Slice",
|
||||
[UNIT_SCOPE] = "org.freedesktop.systemd1.Scope",
|
||||
};
|
||||
|
||||
if (t < 0)
|
||||
return NULL;
|
||||
if (t >= _UNIT_TYPE_MAX)
|
||||
return NULL;
|
||||
|
||||
return table[t];
|
||||
}
|
||||
|
||||
const char *unit_dbus_interface_from_name(const char *name) {
|
||||
UnitType t;
|
||||
|
||||
t = unit_name_to_type(name);
|
||||
if (t < 0)
|
||||
return NULL;
|
||||
|
||||
return unit_dbus_interface_from_type(t);
|
||||
}
|
||||
|
||||
static char *do_escape_mangle(const char *f, UnitNameMangle allow_globs, char *t) {
|
||||
const char *valid_chars;
|
||||
|
||||
|
@ -787,7 +823,7 @@ static const char* const unit_type_table[_UNIT_TYPE_MAX] = {
|
|||
[UNIT_TIMER] = "timer",
|
||||
[UNIT_PATH] = "path",
|
||||
[UNIT_SLICE] = "slice",
|
||||
[UNIT_SCOPE] = "scope"
|
||||
[UNIT_SCOPE] = "scope",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);
|
||||
|
|
|
@ -152,6 +152,9 @@ int unit_name_to_path(const char *name, char **ret);
|
|||
char *unit_dbus_path_from_name(const char *name);
|
||||
int unit_name_from_dbus_path(const char *path, char **name);
|
||||
|
||||
const char* unit_dbus_interface_from_type(UnitType t);
|
||||
const char *unit_dbus_interface_from_name(const char *name);
|
||||
|
||||
typedef enum UnitNameMangle {
|
||||
UNIT_NAME_NOGLOB,
|
||||
UNIT_NAME_GLOB,
|
||||
|
|
|
@ -1075,7 +1075,6 @@ const UnitVTable automount_vtable = {
|
|||
|
||||
.reset_failed = automount_reset_failed,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Automount",
|
||||
.bus_vtable = bus_automount_vtable,
|
||||
|
||||
.shutdown = automount_shutdown,
|
||||
|
|
|
@ -1058,7 +1058,6 @@ const UnitVTable busname_vtable = {
|
|||
|
||||
.supported = busname_supported,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.BusName",
|
||||
.bus_vtable = bus_busname_vtable,
|
||||
|
||||
.status_message_formats = {
|
||||
|
|
|
@ -783,7 +783,7 @@ static int send_changed_signal(sd_bus *bus, void *userdata) {
|
|||
|
||||
r = sd_bus_emit_properties_changed_strv(
|
||||
bus, p,
|
||||
UNIT_VTABLE(u)->bus_interface,
|
||||
unit_dbus_interface_from_type(u->type),
|
||||
NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
|
|
@ -356,7 +356,7 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
|
|||
if (r <= 0)
|
||||
return r;
|
||||
|
||||
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
|
||||
if (!streq_ptr(interface, unit_dbus_interface_from_type(u->type)))
|
||||
return 0;
|
||||
|
||||
*found = u;
|
||||
|
@ -378,7 +378,7 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter
|
|||
if (r <= 0)
|
||||
return r;
|
||||
|
||||
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
|
||||
if (!streq_ptr(interface, unit_dbus_interface_from_type(u->type)))
|
||||
return 0;
|
||||
|
||||
if (!unit_get_cgroup_context(u))
|
||||
|
@ -404,7 +404,7 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in
|
|||
if (r <= 0)
|
||||
return r;
|
||||
|
||||
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
|
||||
if (!streq_ptr(interface, unit_dbus_interface_from_type(u->type)))
|
||||
return 0;
|
||||
|
||||
c = unit_get_cgroup_context(u);
|
||||
|
@ -431,7 +431,7 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte
|
|||
if (r <= 0)
|
||||
return r;
|
||||
|
||||
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
|
||||
if (!streq_ptr(interface, unit_dbus_interface_from_type(u->type)))
|
||||
return 0;
|
||||
|
||||
c = unit_get_exec_context(u);
|
||||
|
@ -458,7 +458,7 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
|
|||
if (r <= 0)
|
||||
return r;
|
||||
|
||||
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
|
||||
if (!streq_ptr(interface, unit_dbus_interface_from_type(u->type)))
|
||||
return 0;
|
||||
|
||||
c = unit_get_kill_context(u);
|
||||
|
@ -555,30 +555,34 @@ static int bus_setup_api_vtables(Manager *m, sd_bus *bus) {
|
|||
return log_error_errno(r, "Failed to add job enumerator: %m");
|
||||
|
||||
for (t = 0; t < _UNIT_TYPE_MAX; t++) {
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", unit_vtable[t]->bus_interface, unit_vtable[t]->bus_vtable, bus_unit_interface_find, m);
|
||||
const char *interface;
|
||||
|
||||
assert_se(interface = unit_dbus_interface_from_type(t));
|
||||
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", interface, unit_vtable[t]->bus_vtable, bus_unit_interface_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register type specific vtable for %s: %m", unit_vtable[t]->bus_interface);
|
||||
return log_error_errno(r, "Failed to register type specific vtable for %s: %m", interface);
|
||||
|
||||
if (unit_vtable[t]->cgroup_context_offset > 0) {
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", unit_vtable[t]->bus_interface, bus_unit_cgroup_vtable, bus_unit_cgroup_find, m);
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", interface, bus_unit_cgroup_vtable, bus_unit_cgroup_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register control group unit vtable for %s: %m", unit_vtable[t]->bus_interface);
|
||||
return log_error_errno(r, "Failed to register control group unit vtable for %s: %m", interface);
|
||||
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", unit_vtable[t]->bus_interface, bus_cgroup_vtable, bus_cgroup_context_find, m);
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", interface, bus_cgroup_vtable, bus_cgroup_context_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register control group vtable for %s: %m", unit_vtable[t]->bus_interface);
|
||||
return log_error_errno(r, "Failed to register control group vtable for %s: %m", interface);
|
||||
}
|
||||
|
||||
if (unit_vtable[t]->exec_context_offset > 0) {
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", unit_vtable[t]->bus_interface, bus_exec_vtable, bus_exec_context_find, m);
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", interface, bus_exec_vtable, bus_exec_context_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register execute vtable for %s: %m", unit_vtable[t]->bus_interface);
|
||||
return log_error_errno(r, "Failed to register execute vtable for %s: %m", interface);
|
||||
}
|
||||
|
||||
if (unit_vtable[t]->kill_context_offset > 0) {
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", unit_vtable[t]->bus_interface, bus_kill_vtable, bus_kill_context_find, m);
|
||||
r = sd_bus_add_fallback_vtable(bus, NULL, "/org/freedesktop/systemd1/unit", interface, bus_kill_vtable, bus_kill_context_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register kill vtable for %s: %m", unit_vtable[t]->bus_interface);
|
||||
return log_error_errno(r, "Failed to register kill vtable for %s: %m", interface);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -849,7 +849,6 @@ const UnitVTable device_vtable = {
|
|||
.active_state = device_active_state,
|
||||
.sub_state_to_string = device_sub_state_to_string,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Device",
|
||||
.bus_vtable = bus_device_vtable,
|
||||
|
||||
.following = device_following,
|
||||
|
|
|
@ -1871,7 +1871,6 @@ const UnitVTable mount_vtable = {
|
|||
|
||||
.reset_failed = mount_reset_failed,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Mount",
|
||||
.bus_vtable = bus_mount_vtable,
|
||||
.bus_set_property = bus_mount_set_property,
|
||||
.bus_commit_properties = bus_mount_commit_properties,
|
||||
|
|
|
@ -770,6 +770,5 @@ const UnitVTable path_vtable = {
|
|||
|
||||
.reset_failed = path_reset_failed,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Path",
|
||||
.bus_vtable = bus_path_vtable
|
||||
};
|
||||
|
|
|
@ -561,7 +561,6 @@ const UnitVTable scope_vtable = {
|
|||
|
||||
.notify_cgroup_empty = scope_notify_cgroup_empty_event,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Scope",
|
||||
.bus_vtable = bus_scope_vtable,
|
||||
.bus_set_property = bus_scope_set_property,
|
||||
.bus_commit_properties = bus_scope_commit_properties,
|
||||
|
|
|
@ -3214,7 +3214,6 @@ const UnitVTable service_vtable = {
|
|||
|
||||
.bus_name_owner_change = service_bus_name_owner_change,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Service",
|
||||
.bus_vtable = bus_service_vtable,
|
||||
.bus_set_property = bus_service_set_property,
|
||||
.bus_commit_properties = bus_service_commit_properties,
|
||||
|
|
|
@ -289,7 +289,6 @@ const UnitVTable slice_vtable = {
|
|||
.active_state = slice_active_state,
|
||||
.sub_state_to_string = slice_sub_state_to_string,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Slice",
|
||||
.bus_vtable = bus_slice_vtable,
|
||||
.bus_set_property = bus_slice_set_property,
|
||||
.bus_commit_properties = bus_slice_commit_properties,
|
||||
|
|
|
@ -302,6 +302,5 @@ const UnitVTable snapshot_vtable = {
|
|||
.active_state = snapshot_active_state,
|
||||
.sub_state_to_string = snapshot_sub_state_to_string,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Snapshot",
|
||||
.bus_vtable = bus_snapshot_vtable
|
||||
};
|
||||
|
|
|
@ -2709,7 +2709,6 @@ const UnitVTable socket_vtable = {
|
|||
|
||||
.reset_failed = socket_reset_failed,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Socket",
|
||||
.bus_vtable = bus_socket_vtable,
|
||||
.bus_set_property = bus_socket_set_property,
|
||||
.bus_commit_properties = bus_socket_commit_properties,
|
||||
|
|
|
@ -1485,7 +1485,6 @@ const UnitVTable swap_vtable = {
|
|||
|
||||
.reset_failed = swap_reset_failed,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Swap",
|
||||
.bus_vtable = bus_swap_vtable,
|
||||
.bus_set_property = bus_swap_set_property,
|
||||
.bus_commit_properties = bus_swap_commit_properties,
|
||||
|
|
|
@ -221,7 +221,6 @@ const UnitVTable target_vtable = {
|
|||
.active_state = target_active_state,
|
||||
.sub_state_to_string = target_sub_state_to_string,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Target",
|
||||
.bus_vtable = bus_target_vtable,
|
||||
|
||||
.status_message_formats = {
|
||||
|
|
|
@ -772,7 +772,6 @@ const UnitVTable timer_vtable = {
|
|||
.reset_failed = timer_reset_failed,
|
||||
.time_change = timer_time_change,
|
||||
|
||||
.bus_interface = "org.freedesktop.systemd1.Timer",
|
||||
.bus_vtable = bus_timer_vtable,
|
||||
.bus_set_property = bus_timer_set_property,
|
||||
|
||||
|
|
|
@ -404,9 +404,6 @@ struct UnitVTable {
|
|||
* of this type will immediately fail. */
|
||||
bool (*supported)(void);
|
||||
|
||||
/* The interface name */
|
||||
const char *bus_interface;
|
||||
|
||||
/* The bus vtable */
|
||||
const sd_bus_vtable *bus_vtable;
|
||||
|
||||
|
|
|
@ -361,8 +361,7 @@ static int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
|
|||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
path,
|
||||
endswith(unit, ".scope") ? "org.freedesktop.systemd1.Scope" :
|
||||
endswith(unit, ".slice") ? "org.freedesktop.systemd1.Slice" : "org.freedesktop.systemd1.Service",
|
||||
unit_dbus_interface_from_name(unit),
|
||||
"ControlGroup",
|
||||
&error,
|
||||
&reply,
|
||||
|
|
Loading…
Reference in New Issue