From: Daan De Meyer Date: Wed, 26 Nov 2025 11:55:18 +0000 (+0100) Subject: sd-varlink: Add SD_VARLINK_ANY X-Git-Tag: v260-rc1~390 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2e51ed7fcb8a4215432ca189f8b3d2ad848ea93b;p=thirdparty%2Fsystemd.git sd-varlink: Add SD_VARLINK_ANY 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 --- diff --git a/src/libsystemd/sd-varlink/sd-varlink-idl.c b/src/libsystemd/sd-varlink/sd-varlink-idl.c index d746c69e325..eb4d737d2fa 100644 --- a/src/libsystemd/sd-varlink/sd-varlink-idl.c +++ b/src/libsystemd/sd-varlink/sd-varlink-idl.c @@ -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; diff --git a/src/systemd/sd-varlink-idl.h b/src/systemd/sd-varlink-idl.h index c0d49716b0a..c9e0bfca492 100644 --- a/src/systemd/sd-varlink-idl.h +++ b/src/systemd/sd-varlink-idl.h @@ -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, diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c index 20e1c689dbf..f77fa7ee774 100644 --- a/src/test/test-varlink-idl.c +++ b/src/test/test-varlink-idl.c @@ -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) {