]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add json_dispatch_variant_noref() helper
authorLennart Poettering <lennart@poettering.net>
Mon, 12 Jun 2023 14:37:37 +0000 (16:37 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 12 Jun 2023 16:26:08 +0000 (18:26 +0200)
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.

src/shared/json.c
src/shared/json.h

index 26d99a5fba0f59ad7e29730b94edd610eed6c54f..417d17df347bc39f35c9e91c972fe260f26083fe 100644 (file)
@@ -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;
index 5d79472351fa3c1dbab419e4a1350b67d34e2817..1356d0827bd5b98bf4ea69446c516651ed315b35 100644 (file)
@@ -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);