From: Daan De Meyer Date: Thu, 19 Oct 2023 14:51:08 +0000 (+0200) Subject: json: Introduce JSON_BUILD_STRING_SET X-Git-Tag: v255-rc1~182^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a636a058f143425dc03d483c0ccc451eaaa2cb35;p=thirdparty%2Fsystemd.git json: Introduce JSON_BUILD_STRING_SET --- diff --git a/src/shared/json.c b/src/shared/json.c index f7e61f1676c..db3581dfd4a 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -21,6 +21,7 @@ #include "math-util.h" #include "memory-util.h" #include "memstream-util.h" +#include "set.h" #include "string-table.h" #include "string-util.h" #include "strv.h" @@ -3877,6 +3878,40 @@ int json_buildv(JsonVariant **ret, va_list ap) { break; } + case _JSON_BUILD_STRING_SET: { + Set *set; + + if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) { + r = -EINVAL; + goto finish; + } + + set = va_arg(ap, Set*); + + if (current->n_suppress == 0) { + _cleanup_free_ char **sorted = NULL; + + r = set_dump_sorted(set, (void ***) &sorted, NULL); + if (r < 0) + goto finish; + + r = json_variant_new_array_strv(&add, sorted); + if (r < 0) + goto finish; + } + + n_subtract = 1; + + if (current->expect == EXPECT_TOPLEVEL) + current->expect = EXPECT_END; + else if (current->expect == EXPECT_OBJECT_VALUE) + current->expect = EXPECT_OBJECT_KEY; + else + assert(current->expect == EXPECT_ARRAY_ELEMENT); + + break; + } + case _JSON_BUILD_OBJECT_BEGIN: if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) { diff --git a/src/shared/json.h b/src/shared/json.h index 8ddff6be982..4b25d36a325 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -275,6 +275,7 @@ enum { _JSON_BUILD_UUID, _JSON_BUILD_BYTE_ARRAY, _JSON_BUILD_HW_ADDR, + _JSON_BUILD_STRING_SET, _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, _JSON_BUILD_PAIR_FINITE_USEC, _JSON_BUILD_PAIR_STRING_NON_EMPTY, @@ -319,6 +320,7 @@ enum { #define JSON_BUILD_IN_ADDR(v, f) JSON_BUILD_BYTE_ARRAY(((const union in_addr_union*) { v })->bytes, FAMILY_ADDRESS_SIZE_SAFE(f)) #define JSON_BUILD_ETHER_ADDR(v) JSON_BUILD_BYTE_ARRAY(((const struct ether_addr*) { v })->ether_addr_octet, sizeof(struct ether_addr)) #define JSON_BUILD_HW_ADDR(v) _JSON_BUILD_HW_ADDR, (const struct hw_addr_data*) { v } +#define JSON_BUILD_STRING_SET(s) _JSON_BUILD_STRING_SET, (Set *) { s } #define JSON_BUILD_PAIR_STRING(name, s) JSON_BUILD_PAIR(name, JSON_BUILD_STRING(s)) #define JSON_BUILD_PAIR_INTEGER(name, i) JSON_BUILD_PAIR(name, JSON_BUILD_INTEGER(i)) @@ -344,6 +346,7 @@ enum { #define JSON_BUILD_PAIR_IN_ADDR(name, v, f) JSON_BUILD_PAIR(name, JSON_BUILD_IN_ADDR(v, f)) #define JSON_BUILD_PAIR_ETHER_ADDR(name, v) JSON_BUILD_PAIR(name, JSON_BUILD_ETHER_ADDR(v)) #define JSON_BUILD_PAIR_HW_ADDR(name, v) JSON_BUILD_PAIR(name, JSON_BUILD_HW_ADDR(v)) +#define JSON_BUILD_PAIR_STRING_SET(name, s) JSON_BUILD_PAIR(name, JSON_BUILD_STRING_SET(s)) #define JSON_BUILD_PAIR_UNSIGNED_NON_ZERO(name, u) _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO, (const char*) { name }, (uint64_t) { u } #define JSON_BUILD_PAIR_FINITE_USEC(name, u) _JSON_BUILD_PAIR_FINITE_USEC, (const char*) { name }, (usec_t) { u }