From: Yu Watanabe Date: Thu, 13 Jul 2023 01:54:53 +0000 (+0900) Subject: busctl: use json_variant_append_array() X-Git-Tag: v254-rc2~23^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=684bce3d54463b3222246f72adfe82ad5d176fea;p=thirdparty%2Fsystemd.git busctl: use json_variant_append_array() --- diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index 748902093dd..72eed363351 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -1671,15 +1671,26 @@ static int message_append_cmdline(sd_bus_message *m, const char *signature, char static int json_transform_one(sd_bus_message *m, JsonVariant **ret); -static int json_transform_array_or_struct(sd_bus_message *m, JsonVariant **ret) { - JsonVariant **elements = NULL; - size_t n_elements = 0; +static int json_transform_and_append(sd_bus_message *m, JsonVariant **ret) { + _cleanup_(json_variant_unrefp) JsonVariant *element = NULL; int r; assert(m); assert(ret); - CLEANUP_ARRAY(elements, n_elements, json_variant_unref_many); + r = json_transform_one(m, &element); + if (r < 0) + return r; + + return json_variant_append_array(ret, element); +} + +static int json_transform_array_or_struct(sd_bus_message *m, JsonVariant **ret) { + _cleanup_(json_variant_unrefp) JsonVariant *array = NULL; + int r; + + assert(m); + assert(ret); for (;;) { r = sd_bus_message_at_end(m, false); @@ -1688,17 +1699,16 @@ static int json_transform_array_or_struct(sd_bus_message *m, JsonVariant **ret) if (r > 0) break; - if (!GREEDY_REALLOC(elements, n_elements + 1)) - return log_oom(); - - r = json_transform_one(m, elements + n_elements); + r = json_transform_and_append(m, &array); if (r < 0) return r; - - n_elements++; } - return json_variant_new_array(ret, elements, n_elements); + if (!array) + return json_variant_new_array(ret, NULL, 0); + + *ret = TAKE_PTR(array); + return 0; } static int json_transform_variant(sd_bus_message *m, const char *contents, JsonVariant **ret) { @@ -1722,15 +1732,12 @@ static int json_transform_variant(sd_bus_message *m, const char *contents, JsonV } static int json_transform_dict_array(sd_bus_message *m, JsonVariant **ret) { - JsonVariant **elements = NULL; - size_t n_elements = 0; + _cleanup_(json_variant_unrefp) JsonVariant *array = NULL; int r; assert(m); assert(ret); - CLEANUP_ARRAY(elements, n_elements, json_variant_unref_many); - for (;;) { const char *contents; char type; @@ -1747,31 +1754,28 @@ static int json_transform_dict_array(sd_bus_message *m, JsonVariant **ret) { assert(type == 'e'); - if (!GREEDY_REALLOC(elements, n_elements + 2)) - return log_oom(); - r = sd_bus_message_enter_container(m, type, contents); if (r < 0) return bus_log_parse_error(r); - r = json_transform_one(m, elements + n_elements); + r = json_transform_and_append(m, &array); if (r < 0) return r; - n_elements++; - - r = json_transform_one(m, elements + n_elements); + r = json_transform_and_append(m, &array); if (r < 0) return r; - n_elements++; - r = sd_bus_message_exit_container(m); if (r < 0) return bus_log_parse_error(r); } - return json_variant_new_object(ret, elements, n_elements); + if (!array) + return json_variant_new_array(ret, NULL, 0); + + *ret = TAKE_PTR(array); + return 0; } static int json_transform_one(sd_bus_message *m, JsonVariant **ret) {