From: Ivan Kruglov Date: Fri, 23 May 2025 13:57:02 +0000 (-0700) Subject: json: json_dispatch_const_unit_name() X-Git-Tag: v258-rc1~479^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=643622f8507fcbffb19af900661f3c7f53d4acbc;p=thirdparty%2Fsystemd.git json: json_dispatch_const_unit_name() --- diff --git a/src/libsystemd/sd-json/json-util.c b/src/libsystemd/sd-json/json-util.c index 2c7f3240b61..942cfee875a 100644 --- a/src/libsystemd/sd-json/json-util.c +++ b/src/libsystemd/sd-json/json-util.c @@ -22,6 +22,7 @@ #include "string-util.h" #include "strv.h" #include "syslog-util.h" +#include "unit-name.h" #include "user-util.h" int json_dispatch_unbase64_iovec(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { @@ -118,6 +119,33 @@ int json_dispatch_const_user_group_name(const char *name, sd_json_variant *varia return 0; } +int json_dispatch_const_unit_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { + const char **s = ASSERT_PTR(userdata), *n; + UnitNameFlags unitname_flags; + + if (sd_json_variant_is_null(variant)) { + *s = NULL; + return 0; + } + + if (!sd_json_variant_is_string(variant)) + return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name)); + + if (FLAGS_SET(flags, SD_JSON_STRICT)) + unitname_flags = UNIT_NAME_PLAIN; + else if (FLAGS_SET(flags, SD_JSON_RELAX)) + unitname_flags = UNIT_NAME_ANY; + else + unitname_flags = UNIT_NAME_PLAIN | UNIT_NAME_INSTANCE; + + n = sd_json_variant_string(variant); + if (!unit_name_is_valid(n, unitname_flags)) + return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid unit name.", strna(name)); + + *s = n; + return 0; +} + int json_dispatch_in_addr(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { struct in_addr *address = ASSERT_PTR(userdata); _cleanup_(iovec_done) struct iovec iov = {}; diff --git a/src/libsystemd/sd-json/json-util.h b/src/libsystemd/sd-json/json-util.h index 0d0f41bf378..11b5c553f78 100644 --- a/src/libsystemd/sd-json/json-util.h +++ b/src/libsystemd/sd-json/json-util.h @@ -112,6 +112,7 @@ int json_dispatch_unbase64_iovec(const char *name, sd_json_variant *variant, sd_ int json_dispatch_byte_array_iovec(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_user_group_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_const_user_group_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); +int json_dispatch_const_unit_name(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_in_addr(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_const_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);