varlink: add enum types for scheduling and mount settings in io.systemd.Unit

Convert CPUSchedulingPolicy, IOSchedulingClass, NUMAPolicy and MountFlags
fields from plain strings to proper varlink enum types in the io.systemd.Unit
interface. Update the corresponding serialization code to use
json_underscorify() for correct enum value formatting.

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 b5aa7635ce
commit 2fda0fb4c7
4 changed files with 62 additions and 7 deletions
+6 -3
View File
@@ -27,6 +27,9 @@
#include "varlink-common.h"
#include "varlink-execute.h"
#define JSON_BUILD_PAIR_MOUNT_PROPAGATION_FLAG(name, s) \
SD_JSON_BUILD_PAIR_CONDITION(!isempty(s), name, JSON_BUILD_STRING_UNDERSCORIFY(s))
static int working_directory_build_json(sd_json_variant **ret, const char *name, void *userdata) {
ExecContext *c = ASSERT_PTR(userdata);
@@ -262,7 +265,7 @@ static int cpu_sched_class_build_json(sd_json_variant **ret, const char *name, v
if (r < 0)
return log_debug_errno(r, "Failed to convert sched policy to string: %m");
return sd_json_variant_new_string(ret, s);
return sd_json_variant_new_string(ret, json_underscorify(s));
}
static int cpu_affinity_build_json(sd_json_variant **ret, const char *name, void *userdata) {
@@ -343,7 +346,7 @@ static int ioprio_class_build_json(sd_json_variant **ret, const char *name, void
if (r < 0)
return log_debug_errno(r, "Failed to convert IO priority class to string: %m");
return sd_json_variant_new_string(ret, s);
return sd_json_variant_new_string(ret, json_underscorify(s));
}
static int exec_dir_build_json(sd_json_variant **ret, const char *name, void *userdata) {
@@ -919,7 +922,7 @@ int unit_exec_context_build_json(sd_json_variant **ret, const char *name, void *
SD_JSON_BUILD_PAIR_BOOLEAN("RestrictSUIDSGID", c->restrict_suid_sgid),
SD_JSON_BUILD_PAIR_BOOLEAN("RemoveIPC", c->remove_ipc),
JSON_BUILD_PAIR_TRISTATE_NON_NULL("PrivateMounts", c->private_mounts),
JSON_BUILD_PAIR_STRING_NON_EMPTY("MountFlags", mount_propagation_flag_to_string(c->mount_propagation_flag)),
JSON_BUILD_PAIR_MOUNT_PROPAGATION_FLAG("MountFlags", mount_propagation_flag_to_string(c->mount_propagation_flag)),
/* System Call Filtering */
JSON_BUILD_PAIR_CALLBACK_NON_NULL("SystemCallFilter", syscall_filter_build_json, c),
+38 -4
View File
@@ -149,6 +149,36 @@ SD_VARLINK_DEFINE_ENUM_TYPE(
SD_VARLINK_DEFINE_ENUM_VALUE(no),
SD_VARLINK_DEFINE_ENUM_VALUE(yes));
SD_VARLINK_DEFINE_ENUM_TYPE(
CPUSchedulingPolicy,
SD_VARLINK_DEFINE_ENUM_VALUE(other),
SD_VARLINK_DEFINE_ENUM_VALUE(batch),
SD_VARLINK_DEFINE_ENUM_VALUE(idle),
SD_VARLINK_DEFINE_ENUM_VALUE(fifo),
SD_VARLINK_DEFINE_ENUM_VALUE(ext),
SD_VARLINK_DEFINE_ENUM_VALUE(rr));
SD_VARLINK_DEFINE_ENUM_TYPE(
IOSchedulingClass,
SD_VARLINK_DEFINE_ENUM_VALUE(none),
SD_VARLINK_DEFINE_ENUM_VALUE(realtime),
SD_VARLINK_DEFINE_ENUM_VALUE(best_effort),
SD_VARLINK_DEFINE_ENUM_VALUE(idle));
SD_VARLINK_DEFINE_ENUM_TYPE(
NUMAPolicy,
SD_VARLINK_DEFINE_ENUM_VALUE(default),
SD_VARLINK_DEFINE_ENUM_VALUE(preferred),
SD_VARLINK_DEFINE_ENUM_VALUE(bind),
SD_VARLINK_DEFINE_ENUM_VALUE(interleave),
SD_VARLINK_DEFINE_ENUM_VALUE(local));
SD_VARLINK_DEFINE_ENUM_TYPE(
MountPropagationFlag,
SD_VARLINK_DEFINE_ENUM_VALUE(shared),
SD_VARLINK_DEFINE_ENUM_VALUE(slave),
SD_VARLINK_DEFINE_ENUM_VALUE(private));
/* CGroupContext */
static SD_VARLINK_DEFINE_STRUCT_TYPE(
CGroupTasksMax,
@@ -667,7 +697,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#Nice="),
SD_VARLINK_DEFINE_FIELD(Nice, SD_VARLINK_INT, 0),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#CPUSchedulingPolicy="),
SD_VARLINK_DEFINE_FIELD(CPUSchedulingPolicy, SD_VARLINK_STRING, 0),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(CPUSchedulingPolicy, CPUSchedulingPolicy, 0),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#CPUSchedulingPriority="),
SD_VARLINK_DEFINE_FIELD(CPUSchedulingPriority, SD_VARLINK_INT, 0),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#CPUSchedulingResetOnFork="),
@@ -675,11 +705,11 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#CPUAffinity="),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(CPUAffinity, CPUAffinity, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#NUMAPolicy="),
SD_VARLINK_DEFINE_FIELD(NUMAPolicy, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(NUMAPolicy, NUMAPolicy, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#NUMAMask="),
SD_VARLINK_DEFINE_FIELD(NUMAMask, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#IOSchedulingClass="),
SD_VARLINK_DEFINE_FIELD(IOSchedulingClass, SD_VARLINK_STRING, 0),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(IOSchedulingClass, IOSchedulingClass, 0),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#IOSchedulingPriority="),
SD_VARLINK_DEFINE_FIELD(IOSchedulingPriority, SD_VARLINK_INT, 0),
@@ -781,7 +811,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#PrivateMounts="),
SD_VARLINK_DEFINE_FIELD(PrivateMounts, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man"PROJECT_VERSION_STR"systemd.exec.html#MountFlags="),
SD_VARLINK_DEFINE_FIELD(MountFlags, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(MountFlags, MountPropagationFlag, SD_VARLINK_NULLABLE),
/* System Call Filtering
* https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#System%20Call%20Filtering */
@@ -1258,6 +1288,10 @@ SD_VARLINK_DEFINE_INTERFACE(
&vl_type_ProtectControlGroups,
&vl_type_PrivatePIDs,
&vl_type_PrivateBPF,
&vl_type_CPUSchedulingPolicy,
&vl_type_IOSchedulingClass,
&vl_type_NUMAPolicy,
&vl_type_MountPropagationFlag,
&vl_type_WorkingDirectory,
&vl_type_PartitionMountOptions,
&vl_type_BindPath,
+4
View File
@@ -23,5 +23,9 @@ extern const sd_varlink_symbol vl_type_PrivateBPF;
extern const sd_varlink_symbol vl_type_CGroupDevicePolicy;
extern const sd_varlink_symbol vl_type_ManagedOOMPreference;
extern const sd_varlink_symbol vl_type_CGroupController;
extern const sd_varlink_symbol vl_type_CPUSchedulingPolicy;
extern const sd_varlink_symbol vl_type_IOSchedulingClass;
extern const sd_varlink_symbol vl_type_NUMAPolicy;
extern const sd_varlink_symbol vl_type_MountPropagationFlag;
extern const sd_varlink_symbol vl_type_CollectMode;
extern const sd_varlink_symbol vl_type_JobMode;
+14
View File
@@ -1,6 +1,9 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "cgroup.h"
#include "ioprio-util.h"
#include "numa-util.h"
#include "process-util.h"
#include "tests.h"
#include "test-varlink-idl-util.h"
#include "unit.h"
@@ -26,6 +29,17 @@ TEST(unit_enums_idl) {
TEST_IDL_ENUM(PrivatePIDs, private_pids, vl_type_PrivatePIDs);
TEST_IDL_ENUM(PrivateBPF, private_bpf, vl_type_PrivateBPF);
/* sched_policy table has gaps (SCHED_IDLE=5, SCHED_EXT=7), so only test from_string direction */
TEST_IDL_ENUM_FROM_STRING(int, sched_policy, vl_type_CPUSchedulingPolicy);
/* ioprio_class uses _alloc variant for to_string, so only test from_string direction */
TEST_IDL_ENUM_FROM_STRING(int, ioprio_class, vl_type_IOSchedulingClass);
TEST_IDL_ENUM(int, mpol, vl_type_NUMAPolicy);
/* mount_propagation_flag has non-standard from_string API, test manually */
test_enum_to_string_name("shared", &vl_type_MountPropagationFlag);
test_enum_to_string_name("slave", &vl_type_MountPropagationFlag);
test_enum_to_string_name("private", &vl_type_MountPropagationFlag);
/* CGroupContext enums */
TEST_IDL_ENUM(CGroupDevicePolicy, cgroup_device_policy, vl_type_CGroupDevicePolicy);
TEST_IDL_ENUM(ManagedOOMMode, managed_oom_mode, vl_type_ManagedOOMMode);