varlink: add enum types for class and whom fields in io.systemd.Machine

Convert the class field (Register input, List output) from plain string
to MachineClass enum type, and the whom field (Kill input) to KillWhom
enum type.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ivan Kruglov
2026-04-14 02:10:52 -07:00
parent 2fda0fb4c7
commit 5d0ac2c23c
6 changed files with 46 additions and 14 deletions
+6 -10
View File
@@ -360,10 +360,12 @@ int vl_method_terminate_internal(sd_varlink *link, sd_json_variant *parameters,
return sd_varlink_reply(link, NULL);
}
static JSON_DISPATCH_ENUM_DEFINE(dispatch_kill_whom, KillWhom, kill_whom_from_string);
typedef struct MachineKillParameters {
const char *name;
PidRef pidref;
const char *swhom;
KillWhom whom;
int32_t signo;
} MachineKillParameters;
@@ -376,7 +378,7 @@ static void machine_kill_paramaters_done(MachineKillParameters *p) {
int vl_method_kill(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
static const sd_json_dispatch_field dispatch_table[] = {
VARLINK_DISPATCH_MACHINE_LOOKUP_FIELDS(MachineKillParameters),
{ "whom", SD_JSON_VARIANT_STRING, sd_json_dispatch_const_string, offsetof(MachineKillParameters, swhom), 0 },
{ "whom", SD_JSON_VARIANT_STRING, dispatch_kill_whom, offsetof(MachineKillParameters, whom), 0 },
{ "signal", _SD_JSON_VARIANT_TYPE_INVALID , sd_json_dispatch_signal, offsetof(MachineKillParameters, signo), SD_JSON_MANDATORY },
VARLINK_DISPATCH_POLKIT_FIELD,
{}
@@ -385,8 +387,8 @@ int vl_method_kill(sd_varlink *link, sd_json_variant *parameters, sd_varlink_met
Manager *manager = ASSERT_PTR(userdata);
_cleanup_(machine_kill_paramaters_done) MachineKillParameters p = {
.pidref = PIDREF_NULL,
.whom = _KILL_WHOM_INVALID,
};
KillWhom whom;
int r;
assert(link);
@@ -403,13 +405,7 @@ int vl_method_kill(sd_varlink *link, sd_json_variant *parameters, sd_varlink_met
if (r < 0)
return r;
if (isempty(p.swhom))
whom = KILL_ALL;
else {
whom = kill_whom_from_string(p.swhom);
if (whom < 0)
return sd_varlink_error_invalid_parameter_name(link, "whom");
}
KillWhom whom = p.whom >= 0 ? p.whom : KILL_ALL;
if (manager->runtime_scope != RUNTIME_SCOPE_USER) {
r = varlink_verify_polkit_async_full(
+1 -1
View File
@@ -478,7 +478,7 @@ static int list_machine_one_and_maybe_read_metadata(sd_varlink *link, Machine *m
&v,
SD_JSON_BUILD_PAIR_STRING("name", m->name),
SD_JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(m->id), "id", SD_JSON_BUILD_ID128(m->id)),
SD_JSON_BUILD_PAIR_STRING("class", machine_class_to_string(m->class)),
JSON_BUILD_PAIR_ENUM("class", machine_class_to_string(m->class)),
JSON_BUILD_PAIR_STRING_NON_EMPTY("service", m->service),
JSON_BUILD_PAIR_STRING_NON_EMPTY("rootDirectory", m->root_directory),
JSON_BUILD_PAIR_STRING_NON_EMPTY("unit", m->unit),