core: implement AutomountContext/Runtime for io.systemd.Unit.List + tests

This commit is contained in:
Ivan Kruglov
2026-04-16 02:15:52 -07:00
parent 2136f32c76
commit 1e3f41e73b
8 changed files with 90 additions and 14 deletions
+1
View File
@@ -64,6 +64,7 @@ libcore_sources = files(
'unit-serialize.c',
'unit.c',
'varlink.c',
'varlink-automount.c',
'varlink-cgroup.c',
'varlink-common.c',
'varlink-dynamic-user.c',
+22
View File
@@ -0,0 +1,22 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "sd-json.h"
#include "automount.h"
#include "json-util.h"
#include "varlink-automount.h"
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
return sd_json_buildo(
ASSERT_PTR(ret),
JSON_BUILD_PAIR_STRING_NON_EMPTY("Where", a->where),
JSON_BUILD_PAIR_STRING_NON_EMPTY("ExtraOptions", a->extra_options),
SD_JSON_BUILD_PAIR_UNSIGNED("DirectoryMode", a->directory_mode),
JSON_BUILD_PAIR_FINITE_USEC("TimeoutIdleUSec", a->timeout_idle_usec));
}
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata) {
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
return sd_json_buildo(ASSERT_PTR(ret), JSON_BUILD_PAIR_ENUM("Result", automount_result_to_string(a->result)));
}
+7
View File
@@ -0,0 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include "core-forward.h"
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata);
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata);
+15 -11
View File
@@ -18,6 +18,7 @@
#include "set.h"
#include "strv.h"
#include "unit.h"
#include "varlink-automount.h"
#include "varlink-cgroup.h"
#include "varlink-execute.h"
#include "varlink-kill.h"
@@ -113,6 +114,11 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
* If it make sense to place a property into a config/unit file it belongs to Context.
* Otherwise it's a 'Runtime'. */
/* TODO missing callbacks */
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
[UNIT_AUTOMOUNT] = automount_context_build_json,
};
return sd_json_buildo(
ASSERT_PTR(ret),
SD_JSON_BUILD_PAIR_STRING("Type", unit_type_to_string(u->type)),
@@ -191,16 +197,8 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_context_build_json, u),
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Exec", unit_exec_context_build_json, u),
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", unit_kill_context_build_json, unit_get_kill_context(u)));
// TODO follow up PRs:
// Mount/Automount context
// Path context
// Scope context
// Swap context
// Timer context
// Service context
// Socket context
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", unit_kill_context_build_json, unit_get_kill_context(u)),
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
}
static int can_clean_build_json(sd_json_variant **ret, const char *name, void *userdata) {
@@ -280,6 +278,11 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
Unit *u = ASSERT_PTR(userdata);
Unit *f = unit_following(u);
/* TODO missing callbacks */
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
[UNIT_AUTOMOUNT] = automount_runtime_build_json,
};
return sd_json_buildo(
ASSERT_PTR(ret),
JSON_BUILD_PAIR_STRING_NON_EMPTY("Following", f ? f->id : NULL),
@@ -309,7 +312,8 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
SD_JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(u->invocation_id), "InvocationID", SD_JSON_BUILD_UUID(u->invocation_id)),
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Markers", markers_build_json, &u->markers),
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ActivationDetails", activation_details_build_json, u->activation_details),
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u));
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u),
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
}
static int list_unit_one(sd_varlink *link, Unit *unit) {