--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "sd-json.h"
+
+#include "json-util.h"
+#include "path.h"
+#include "varlink-path.h"
+
+static int path_specs_build_json(sd_json_variant **ret, const char *name, void *userdata) {
+ _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
+ PathSpec *specs = userdata;
+ int r;
+
+ assert(ret);
+
+ LIST_FOREACH(spec, k, specs) {
+ r = sd_json_variant_append_arraybo(
+ &v,
+ JSON_BUILD_PAIR_ENUM("type", path_type_to_string(k->type)),
+ SD_JSON_BUILD_PAIR_STRING("path", k->path));
+ if (r < 0)
+ return r;
+ }
+
+ *ret = TAKE_PTR(v);
+ return 0;
+}
+
+int path_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
+ Path *p = ASSERT_PTR(PATH(userdata));
+ Unit *trigger = UNIT_TRIGGER(UNIT(p));
+
+ return sd_json_buildo(
+ ASSERT_PTR(ret),
+ JSON_BUILD_PAIR_CALLBACK_NON_NULL("Paths", path_specs_build_json, p->specs),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("Unit", trigger ? trigger->id : NULL),
+ SD_JSON_BUILD_PAIR_BOOLEAN("MakeDirectory", p->make_directory),
+ SD_JSON_BUILD_PAIR_UNSIGNED("DirectoryMode", p->directory_mode),
+ JSON_BUILD_PAIR_RATELIMIT("TriggerLimit", &p->trigger_limit));
+}
+
+int path_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata) {
+ Path *p = ASSERT_PTR(PATH(userdata));
+
+ return sd_json_buildo(
+ ASSERT_PTR(ret),
+ JSON_BUILD_PAIR_ENUM("Result", path_result_to_string(p->result)));
+}
#include "varlink-execute.h"
#include "varlink-kill.h"
#include "varlink-mount.h"
+#include "varlink-path.h"
#include "varlink-unit.h"
#include "varlink-util.h"
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
[UNIT_AUTOMOUNT] = automount_context_build_json,
[UNIT_MOUNT] = mount_context_build_json,
+ [UNIT_PATH] = path_context_build_json,
[UNIT_SERVICE] = service_context_build_json,
};
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
[UNIT_AUTOMOUNT] = automount_runtime_build_json,
[UNIT_MOUNT] = mount_runtime_build_json,
+ [UNIT_PATH] = path_runtime_build_json,
};
return sd_json_buildo(
SD_VARLINK_FIELD_COMMENT("Remount command"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(ExecRemount, ExecCommand, SD_VARLINK_NULLABLE));
+/* PathContext
+ * https://www.freedesktop.org/software/systemd/man/latest/systemd.path.html */
+SD_VARLINK_DEFINE_ENUM_TYPE(
+ PathType,
+ SD_VARLINK_DEFINE_ENUM_VALUE(PathExists),
+ SD_VARLINK_DEFINE_ENUM_VALUE(PathExistsGlob),
+ SD_VARLINK_DEFINE_ENUM_VALUE(DirectoryNotEmpty),
+ SD_VARLINK_DEFINE_ENUM_VALUE(PathChanged),
+ SD_VARLINK_DEFINE_ENUM_VALUE(PathModified));
+
+static SD_VARLINK_DEFINE_STRUCT_TYPE(
+ PathSpec,
+ SD_VARLINK_FIELD_COMMENT("Path spec type"),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(type, PathType, 0),
+ SD_VARLINK_FIELD_COMMENT("Path"),
+ SD_VARLINK_DEFINE_FIELD(path, SD_VARLINK_STRING, 0));
+
+static SD_VARLINK_DEFINE_STRUCT_TYPE(
+ PathContext,
+ SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.path.html#PathExists="),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Paths, PathSpec, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.path.html#Unit="),
+ SD_VARLINK_DEFINE_FIELD(Unit, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.path.html#MakeDirectory="),
+ SD_VARLINK_DEFINE_FIELD(MakeDirectory, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.path.html#DirectoryMode="),
+ SD_VARLINK_DEFINE_FIELD(DirectoryMode, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.path.html#TriggerLimitIntervalSec="),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(TriggerLimit, RateLimit, SD_VARLINK_NULLABLE));
+
+SD_VARLINK_DEFINE_ENUM_TYPE(
+ PathResult,
+ SD_VARLINK_DEFINE_ENUM_VALUE(success),
+ SD_VARLINK_DEFINE_ENUM_VALUE(resources),
+ SD_VARLINK_DEFINE_ENUM_VALUE(start_limit_hit),
+ SD_VARLINK_DEFINE_ENUM_VALUE(unit_start_limit_hit),
+ SD_VARLINK_DEFINE_ENUM_VALUE(trigger_limit_hit));
+
+static SD_VARLINK_DEFINE_STRUCT_TYPE(
+ PathRuntime,
+ SD_VARLINK_FIELD_COMMENT("Result of path operation"),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Result, PathResult, 0));
+
/* Service-specific types */
/* Keep in sync with service_type_table[] in src/core/service.c */
SD_VARLINK_FIELD_COMMENT("The automount context of the unit"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Automount, AutomountContext, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("The mount context of the unit"),
- SD_VARLINK_DEFINE_FIELD_BY_TYPE(Mount, MountContext, SD_VARLINK_NULLABLE));
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Mount, MountContext, SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("The path context of the unit"),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Path, PathContext, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
ActivationDetails,
SD_VARLINK_FIELD_COMMENT("The automount runtime of the unit"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Automount, AutomountRuntime, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("The mount runtime of the unit"),
- SD_VARLINK_DEFINE_FIELD_BY_TYPE(Mount, MountRuntime, SD_VARLINK_NULLABLE));
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Mount, MountRuntime, SD_VARLINK_NULLABLE),
+ SD_VARLINK_FIELD_COMMENT("The path runtime of the unit"),
+ SD_VARLINK_DEFINE_FIELD_BY_TYPE(Path, PathRuntime, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_METHOD_FULL(
List,
&vl_type_MountContext,
&vl_type_MountResult,
&vl_type_MountRuntime,
+ &vl_type_PathType,
+ &vl_type_PathSpec,
+ &vl_type_PathContext,
+ &vl_type_PathResult,
+ &vl_type_PathRuntime,
/* UnitContext enums */
&vl_type_CollectMode,