]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: teach json_build() to serialize dual_timestamp structures reasonably
authorLennart Poettering <lennart@poettering.net>
Fri, 24 May 2024 12:43:12 +0000 (14:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 21 Jun 2024 15:28:16 +0000 (17:28 +0200)
src/libsystemd/sd-json/json-util.h
src/libsystemd/sd-json/sd-json.c

index 72c8d80bf7df7de3f19fff2e7a18d99ea3bcab49..fdfd5522db01ffe00b46126e24ac630ebe3b42ea 100644 (file)
@@ -139,6 +139,7 @@ enum {
         _JSON_BUILD_HW_ADDR,
         _JSON_BUILD_STRING_SET,
         _JSON_BUILD_STRING_UNDERSCORIFY,
+        _JSON_BUILD_DUAL_TIMESTAMP,
 
         _JSON_BUILD_PAIR_UNSIGNED_NON_ZERO,
         _JSON_BUILD_PAIR_FINITE_USEC,
@@ -166,6 +167,7 @@ enum {
 #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_STRING_UNDERSCORIFY(s) _JSON_BUILD_STRING_UNDERSCORIFY, (const char *) { s }
+#define JSON_BUILD_DUAL_TIMESTAMP(t) _JSON_BUILD_DUAL_TIMESTAMP, (dual_timestamp*) { t }
 
 #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 }
index e092dcdbaeea7bc80bdff2b03a5dd7f2ddf85e44..1bccb2091bd3a8023604fb5ebb8f95760f9bc8fc 100644 (file)
@@ -4079,6 +4079,40 @@ _public_ int sd_json_buildv(sd_json_variant **ret, va_list ap) {
                         break;
                 }
 
+                case _JSON_BUILD_DUAL_TIMESTAMP: {
+                        dual_timestamp *ts;
+
+                        if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) {
+                                r = -EINVAL;
+                                goto finish;
+                        }
+
+                        ts = va_arg(ap, dual_timestamp*);
+
+                        if (current->n_suppress == 0) {
+                                if (dual_timestamp_is_set(ts)) {
+                                        r = sd_json_buildo(
+                                                        &add,
+                                                        SD_JSON_BUILD_PAIR("realtime", SD_JSON_BUILD_UNSIGNED(ts->realtime)),
+                                                        SD_JSON_BUILD_PAIR("monotonic", SD_JSON_BUILD_UNSIGNED(ts->monotonic)));
+                                        if (r < 0)
+                                                return r;
+                                } else
+                                        add = JSON_VARIANT_MAGIC_NULL;
+                        }
+
+                        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 _SD_JSON_BUILD_CALLBACK: {
                         sd_json_build_callback_t cb;
                         void *userdata;