]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-varlink: Add SD_VARLINK_ANY
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 26 Nov 2025 11:55:18 +0000 (12:55 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 16 Jan 2026 13:32:43 +0000 (14:32 +0100)
This allows representing fields that can be either an integer or
a string, like the "value" field we'll be adding in
https://github.com/systemd/systemd/pull/39202.

Upstream spec change: https://github.com/varlink/varlink.github.io/pull/43

src/libsystemd/sd-varlink/sd-varlink-idl.c
src/systemd/sd-varlink-idl.h
src/test/test-varlink-idl.c

index d746c69e325ed55b709d3e27da96616f57dac442..eb4d737d2faf1124e12072ac29a2f77c20af2f69 100644 (file)
@@ -265,6 +265,12 @@ static int varlink_idl_format_field(
                 fputs(colors[COLOR_RESET], f);
                 break;
 
+        case SD_VARLINK_ANY:
+                fputs(colors[COLOR_FIELD_TYPE], f);
+                fputs("any", f);
+                fputs(colors[COLOR_RESET], f);
+                break;
+
         case SD_VARLINK_NAMED_TYPE:
                 fputs(colors[COLOR_IDENTIFIER], f);
                 fputs(ASSERT_PTR(field->named_type), f);
@@ -867,6 +873,9 @@ static int varlink_idl_subparse_field_type(
         } else if (startswith(*p, "object")) {
                 l = 6;
                 field->field_type = SD_VARLINK_OBJECT;
+        } else if (startswith(*p, "any")) {
+                l = 3;
+                field->field_type = SD_VARLINK_ANY;
         } else if (**p == '(') {
                 _cleanup_(varlink_symbol_freep) sd_varlink_symbol *symbol = NULL;
                 size_t n_fields = 0;
@@ -1426,7 +1435,7 @@ bool varlink_idl_symbol_name_is_valid(const char *name) {
 
         /* We might want to reference VARLINK_STRUCT_TYPE and VARLINK_ENUM_TYPE symbols where we also
          * reference native types, hence make sure the native type names are refused as symbol names. */
-        if (STR_IN_SET(name, "bool", "int", "float", "string", "object"))
+        if (STR_IN_SET(name, "bool", "int", "float", "string", "object", "any"))
                 return false;
 
         /* Symbols must be named with an uppercase letter as first character */
@@ -1754,6 +1763,10 @@ static int varlink_idl_validate_field_element_type(const sd_varlink_field *field
 
                 break;
 
+        case SD_VARLINK_ANY:
+                /* The any type accepts any JSON value, no validation needed */
+                break;
+
         case _SD_VARLINK_FIELD_COMMENT:
                 break;
 
index c0d49716b0aad1a2f25a7cd5da693b13a778a64b..c9e0bfca492346f0068ca6cf326eba6647055e2a 100644 (file)
@@ -67,6 +67,7 @@ __extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_field_type_t) {
         SD_VARLINK_FLOAT,
         SD_VARLINK_STRING,
         SD_VARLINK_OBJECT,
+        SD_VARLINK_ANY,
         SD_VARLINK_ENUM_VALUE,
         _SD_VARLINK_FIELD_COMMENT,        /* Not really a field, just a comment about a field */
         _SD_VARLINK_FIELD_TYPE_MAX,
index 20e1c689dbf46688cbcc227e9e7ce911e1c150fb..f77fa7ee774ce53afb5c874a9a6d868520d70ed9 100644 (file)
@@ -102,6 +102,13 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
                 SD_VARLINK_DEFINE_FIELD(ooom, SD_VARLINK_OBJECT, SD_VARLINK_MAP),
                 SD_VARLINK_DEFINE_FIELD(ooonm, SD_VARLINK_OBJECT, SD_VARLINK_NULLABLE|SD_VARLINK_MAP),
 
+                SD_VARLINK_DEFINE_FIELD(aaa, SD_VARLINK_ANY, 0),
+                SD_VARLINK_DEFINE_FIELD(aaan, SD_VARLINK_ANY, SD_VARLINK_NULLABLE),
+                SD_VARLINK_DEFINE_FIELD(aaaa, SD_VARLINK_ANY, SD_VARLINK_ARRAY),
+                SD_VARLINK_DEFINE_FIELD(aaana, SD_VARLINK_ANY, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY),
+                SD_VARLINK_DEFINE_FIELD(aaam, SD_VARLINK_ANY, SD_VARLINK_MAP),
+                SD_VARLINK_DEFINE_FIELD(aaanm, SD_VARLINK_ANY, SD_VARLINK_NULLABLE|SD_VARLINK_MAP),
+
                 SD_VARLINK_DEFINE_FIELD_BY_TYPE(eee, EnumTest, 0),
                 SD_VARLINK_DEFINE_FIELD_BY_TYPE(eeen, EnumTest, SD_VARLINK_NULLABLE),
                 SD_VARLINK_DEFINE_FIELD_BY_TYPE(eeea, EnumTest, SD_VARLINK_ARRAY),
@@ -268,6 +275,7 @@ TEST(symbol_name_is_valid) {
         assert_se(!varlink_idl_symbol_name_is_valid("float"));
         assert_se(!varlink_idl_symbol_name_is_valid("string"));
         assert_se(!varlink_idl_symbol_name_is_valid("object"));
+        assert_se(!varlink_idl_symbol_name_is_valid("any"));
 }
 
 TEST(field_name_is_valid) {