From: Lennart Poettering Date: Mon, 12 Jun 2023 14:37:37 +0000 (+0200) Subject: json: add json_dispatch_variant_noref() helper X-Git-Tag: v254-rc1~212^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6b9f63cb3fdbc8e365aa55bef219ced91c10c103;p=thirdparty%2Fsystemd.git json: add json_dispatch_variant_noref() helper This is identical to json_dispatch_variant() but doesn't increase the ref counter of the variant. This is useful for taking JSON objects apart locally without the intention to keep any component pinned for longer than the local stack frame. --- diff --git a/src/shared/json.c b/src/shared/json.c index 26d99a5fba0..417d17df347 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -4642,10 +4642,20 @@ int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFl JsonVariant **p = ASSERT_PTR(userdata); assert(variant); + /* Takes a reference */ JSON_VARIANT_REPLACE(*p, json_variant_ref(variant)); return 0; } +int json_dispatch_variant_noref(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) { + JsonVariant **p = ASSERT_PTR(userdata); + assert(variant); + + /* Doesn't take a reference */ + *p = variant; + return 0; +} + int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) { uid_t *uid = userdata; uint64_t k; diff --git a/src/shared/json.h b/src/shared/json.h index 5d79472351f..1356d0827bd 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -387,6 +387,7 @@ int json_dispatch_strv(const char *name, JsonVariant *variant, JsonDispatchFlags int json_dispatch_boolean(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_tristate(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); +int json_dispatch_variant_noref(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_int64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_uint64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_uint32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);