#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);
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) {
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) {
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),
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,
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="),
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),
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 */
&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,
/* 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"
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);