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:
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user