]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: use json_variant_append_array()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 13 Jul 2023 01:54:53 +0000 (10:54 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 13 Jul 2023 08:03:13 +0000 (17:03 +0900)
src/busctl/busctl.c

index 748902093dddafe31017f1568a8d80f1e747fd47..72eed36335110cd9511717c42ebe77e2cffbd1de 100644 (file)
@@ -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) {