From: Lennart Poettering Date: Tue, 19 Nov 2024 13:59:00 +0000 (+0100) Subject: sd-json: add json_dispatch_const_path() helper X-Git-Tag: v258-rc1~1732 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3866e9ce9d34328460aee5ca01f6f1becfa200eb;p=thirdparty%2Fsystemd.git sd-json: add json_dispatch_const_path() helper The new json_dispatch_const_path() is to json_dispatch_path() what sd_json_dispatch_const_string() is to sd_json_dispatch_ string(), i.e. doesn't implicitly strdup() the string, but gives you the pointer into the JSON structure, and thus requires you to keep it pinned. --- diff --git a/src/libsystemd/sd-json/json-util.c b/src/libsystemd/sd-json/json-util.c index 67e50e6c51b..53af2bac83f 100644 --- a/src/libsystemd/sd-json/json-util.c +++ b/src/libsystemd/sd-json/json-util.c @@ -125,14 +125,13 @@ int json_dispatch_in_addr(const char *name, sd_json_variant *variant, sd_json_di return 0; } -int json_dispatch_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { - char **p = ASSERT_PTR(userdata); - const char *path; +int json_dispatch_const_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { + const char **p = ASSERT_PTR(userdata), *path; assert(variant); if (sd_json_variant_is_null(variant)) { - *p = mfree(*p); + *p = NULL; return 0; } @@ -145,6 +144,21 @@ int json_dispatch_path(const char *name, sd_json_variant *variant, sd_json_dispa if (!path_is_absolute(path)) return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an absolute file system path.", strna(name)); + *p = path; + return 0; +} + +int json_dispatch_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) { + char **p = ASSERT_PTR(userdata); + const char *path; + int r; + + assert_return(variant, -EINVAL); + + r = json_dispatch_const_path(name, variant, flags, &path); + if (r < 0) + return r; + if (free_and_strdup(p, path) < 0) return json_log_oom(variant, flags); diff --git a/src/libsystemd/sd-json/json-util.h b/src/libsystemd/sd-json/json-util.h index 808df64d983..58098241d38 100644 --- a/src/libsystemd/sd-json/json-util.h +++ b/src/libsystemd/sd-json/json-util.h @@ -113,6 +113,7 @@ int json_dispatch_user_group_name(const char *name, sd_json_variant *variant, sd 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_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); int json_dispatch_pidref(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_devnum(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); int json_dispatch_ifindex(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);