]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add generic dispatchers for version strings
authorLennart Poettering <lennart@poettering.net>
Tue, 9 Sep 2025 09:22:46 +0000 (11:22 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 7 Oct 2025 16:57:01 +0000 (18:57 +0200)
src/hibernate-resume/hibernate-resume-config.c
src/libsystemd/sd-json/json-util.c
src/libsystemd/sd-json/json-util.h
src/sysupdate/updatectl.c

index c30bfb73e11d72f5eb5f690de833c5d288166f55..8e2ca625aeca07c74edfbda6c56a0adf5f9a22c3 100644 (file)
@@ -7,6 +7,7 @@
 #include "efivars.h"
 #include "fstab-util.h"
 #include "hibernate-resume-config.h"
+#include "json-util.h"
 #include "log.h"
 #include "os-util.h"
 #include "parse-util.h"
@@ -147,11 +148,11 @@ int get_efi_hibernate_location(EFIHibernateLocation **ret) {
                 { "uuid",                  SD_JSON_VARIANT_STRING,        sd_json_dispatch_id128,   offsetof(EFIHibernateLocation, uuid),           SD_JSON_MANDATORY                },
                 { "offset",                _SD_JSON_VARIANT_TYPE_INVALID, sd_json_dispatch_uint64,  offsetof(EFIHibernateLocation, offset),         SD_JSON_MANDATORY                },
                 { "autoSwap",              SD_JSON_VARIANT_BOOLEAN,       sd_json_dispatch_stdbool, offsetof(EFIHibernateLocation, auto_swap),      0                                },
-                { "kernelVersion",         SD_JSON_VARIANT_STRING,        sd_json_dispatch_string,  offsetof(EFIHibernateLocation, kernel_version), SD_JSON_PERMISSIVE               },
+                { "kernelVersion",         SD_JSON_VARIANT_STRING,        json_dispatch_version,    offsetof(EFIHibernateLocation, kernel_version), SD_JSON_PERMISSIVE               },
                 { "osReleaseId",           SD_JSON_VARIANT_STRING,        sd_json_dispatch_string,  offsetof(EFIHibernateLocation, id),             SD_JSON_PERMISSIVE               },
                 { "osReleaseImageId",      SD_JSON_VARIANT_STRING,        sd_json_dispatch_string,  offsetof(EFIHibernateLocation, image_id),       SD_JSON_PERMISSIVE               },
-                { "osReleaseVersionId",    SD_JSON_VARIANT_STRING,        sd_json_dispatch_string,  offsetof(EFIHibernateLocation, version_id),     SD_JSON_PERMISSIVE|SD_JSON_DEBUG },
-                { "osReleaseImageVersion", SD_JSON_VARIANT_STRING,        sd_json_dispatch_string,  offsetof(EFIHibernateLocation, image_version),  SD_JSON_PERMISSIVE|SD_JSON_DEBUG },
+                { "osReleaseVersionId",    SD_JSON_VARIANT_STRING,        json_dispatch_version,    offsetof(EFIHibernateLocation, version_id),     SD_JSON_PERMISSIVE|SD_JSON_DEBUG },
+                { "osReleaseImageVersion", SD_JSON_VARIANT_STRING,        json_dispatch_version,    offsetof(EFIHibernateLocation, image_version),  SD_JSON_PERMISSIVE|SD_JSON_DEBUG },
                 {},
         };
 
index 169b713d4eef0316da067808504329d043560469..04ba2f62a829cee1f38274cb3c3daeebe0dc0ed4 100644 (file)
@@ -268,6 +268,44 @@ int json_dispatch_filename(const char *name, sd_json_variant *variant, sd_json_d
         return 0;
 }
 
+int json_dispatch_const_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
+        const char **n = ASSERT_PTR(userdata);
+
+        assert(variant);
+
+        if (sd_json_variant_is_null(variant)) {
+                *n = NULL;
+                return 0;
+        }
+
+        if (!sd_json_variant_is_string(variant))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
+
+        const char *version = sd_json_variant_string(variant);
+        if (!version_is_valid(version))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid version string.", strna(name));
+
+        *n = version;
+        return 0;
+}
+
+int json_dispatch_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
+        char **n = ASSERT_PTR(userdata);
+        const char *version;
+        int r;
+
+        assert(variant);
+
+        r = json_dispatch_const_version(name, variant, flags, &version);
+        if (r < 0)
+                return r;
+
+        if (free_and_strdup(n, version) < 0)
+                return json_log_oom(variant, flags);
+
+        return 0;
+}
+
 int json_variant_new_pidref(sd_json_variant **ret, PidRef *pidref) {
         sd_id128_t boot_id = SD_ID128_NULL;
         int r;
index fa4bca4f66d6ec1c2b5de3a817724b886a971951..abacb298c6d69c9f715a6ffce80e51de958a3168 100644 (file)
@@ -119,6 +119,8 @@ int json_dispatch_const_path(const char *name, sd_json_variant *variant, sd_json
 int json_dispatch_strv_path(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_filename(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_const_filename(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
+int json_dispatch_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
+int json_dispatch_const_version(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_pidref(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_devnum(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
 int json_dispatch_ifindex(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata);
index f4e60da775619469e1218b5d784a699153d95601..754f254987f26af9ceefc710ac98da01aa74d21a 100644 (file)
@@ -365,7 +365,7 @@ static int parse_describe(sd_bus_message *reply, Version *ret) {
         assert(sd_json_variant_is_object(json));
 
         static const sd_json_dispatch_field dispatch_table[] = {
-                { "version",       SD_JSON_VARIANT_STRING,  sd_json_dispatch_string,  offsetof(DescribeParams, v.version),     0 },
+                { "version",       SD_JSON_VARIANT_STRING,  json_dispatch_version,    offsetof(DescribeParams, v.version),     0 },
                 { "newest",        SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, offsetof(DescribeParams, newest),        0 },
                 { "available",     SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, offsetof(DescribeParams, available),     0 },
                 { "installed",     SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, offsetof(DescribeParams, installed),     0 },