From: Lennart Poettering Date: Tue, 10 Oct 2023 14:01:41 +0000 (+0200) Subject: json: add json_build() support for env block serialization X-Git-Tag: v255-rc1~247^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08e29ac77d7a262176756b900c3d605061f2ebd6;p=thirdparty%2Fsystemd.git json: add json_build() support for env block serialization --- diff --git a/src/shared/json.c b/src/shared/json.c index e17f89564d6..f7e61f1676c 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -3709,6 +3709,49 @@ int json_buildv(JsonVariant **ret, va_list ap) { break; } + case _JSON_BUILD_STRV_ENV_PAIR: { + char **l; + + if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) { + r = -EINVAL; + goto finish; + } + + l = va_arg(ap, char **); + + _cleanup_strv_free_ char **el = NULL; + STRV_FOREACH_PAIR(x, y, l) { + char *n = NULL; + + n = strjoin(*x, "=", *y); + if (!n) { + r = -ENOMEM; + goto finish; + } + + r = strv_consume(&el, n); + if (r < 0) + goto finish; + } + + if (current->n_suppress == 0) { + r = json_variant_new_array_strv(&add, el); + 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_BASE64: case _JSON_BUILD_BASE32HEX: case _JSON_BUILD_HEX: diff --git a/src/shared/json.h b/src/shared/json.h index 861ef495b5c..8ddff6be982 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -266,6 +266,7 @@ enum { _JSON_BUILD_VARIANT_ARRAY, _JSON_BUILD_LITERAL, _JSON_BUILD_STRV, + _JSON_BUILD_STRV_ENV_PAIR, _JSON_BUILD_BASE64, _JSON_BUILD_BASE32HEX, _JSON_BUILD_HEX, @@ -304,6 +305,7 @@ enum { #define JSON_BUILD_VARIANT_ARRAY(v, n) _JSON_BUILD_VARIANT_ARRAY, (JsonVariant **) { v }, (size_t) { n } #define JSON_BUILD_LITERAL(l) _JSON_BUILD_LITERAL, (const char*) { l } #define JSON_BUILD_STRV(l) _JSON_BUILD_STRV, (char**) { l } +#define JSON_BUILD_STRV_ENV_PAIR(l) _JSON_BUILD_STRV_ENV_PAIR, (char**) { l } #define JSON_BUILD_BASE64(p, n) _JSON_BUILD_BASE64, (const void*) { p }, (size_t) { n } #define JSON_BUILD_BASE32HEX(p, n) _JSON_BUILD_BASE32HEX, (const void*) { p }, (size_t) { n } #define JSON_BUILD_HEX(p, n) _JSON_BUILD_HEX, (const void*) { p }, (size_t) { n }