sd-bus: Add a nicer way of specifying sd-bus vtable method arguments

SD_BUS_NAMES_WITH_ARGS is a less error-prone way of specifying D-Bus
method arguments.
This commit is contained in:
Daan De Meyer
2020-05-06 10:22:54 +02:00
committed by Lennart Poettering
parent 7f3a5eb70e
commit eff7c2d3c9
5 changed files with 391 additions and 220 deletions
+111 -156
View File
@@ -1855,162 +1855,117 @@ static const sd_bus_vtable resolve_vtable[] = {
SD_BUS_PROPERTY("DNSSECNegativeTrustAnchors", "as", bus_property_get_ntas, 0, 0),
SD_BUS_PROPERTY("DNSStubListener", "s", bus_property_get_dns_stub_listener_mode, offsetof(Manager, dns_stub_listener_mode), 0),
SD_BUS_METHOD_WITH_NAMES("ResolveHostname",
"isit",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(name)
SD_BUS_PARAM(family)
SD_BUS_PARAM(flags),
"a(iiay)st",
SD_BUS_PARAM(addresses)
SD_BUS_PARAM(canonical)
SD_BUS_PARAM(flags),
bus_method_resolve_hostname,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ResolveAddress",
"iiayt",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(family)
SD_BUS_PARAM(address)
SD_BUS_PARAM(flags),
"a(is)t",
SD_BUS_PARAM(names)
SD_BUS_PARAM(flags),
bus_method_resolve_address,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ResolveRecord",
"isqqt",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(name)
SD_BUS_PARAM(class)
SD_BUS_PARAM(type)
SD_BUS_PARAM(flags),
"a(iqqay)t",
SD_BUS_PARAM(records)
SD_BUS_PARAM(flags),
bus_method_resolve_record,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ResolveService",
"isssit",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(name)
SD_BUS_PARAM(type)
SD_BUS_PARAM(domain)
SD_BUS_PARAM(family)
SD_BUS_PARAM(flags),
"a(qqqsa(iiay)s)aayssst",
SD_BUS_PARAM(srv_data)
SD_BUS_PARAM(txt_data)
SD_BUS_PARAM(canonical_name)
SD_BUS_PARAM(canonical_type)
SD_BUS_PARAM(canonical_domain)
SD_BUS_PARAM(flags),
bus_method_resolve_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("GetLink",
"i",
SD_BUS_PARAM(ifindex),
"o",
SD_BUS_PARAM(path),
bus_method_get_link,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDNS",
"ia(iay)",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(addresses),
NULL,,
bus_method_set_link_dns_servers,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDomains",
"ia(sb)",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(domains),
NULL,,
bus_method_set_link_domains,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDefaultRoute",
"ib",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(enable),
NULL,,
bus_method_set_link_default_route,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkLLMNR",
"is",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(mode),
NULL,,
bus_method_set_link_llmnr,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkMulticastDNS",
"is",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(mode),
NULL,,
bus_method_set_link_mdns,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDNSOverTLS",
"is",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(mode),
NULL,,
bus_method_set_link_dns_over_tls,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDNSSEC",
"is",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(mode),
NULL,,
bus_method_set_link_dnssec,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLinkDNSSECNegativeTrustAnchors",
"ias",
SD_BUS_PARAM(ifindex)
SD_BUS_PARAM(names),
NULL,,
bus_method_set_link_dnssec_negative_trust_anchors,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("RevertLink",
"i",
SD_BUS_PARAM(ifindex),
NULL,,
bus_method_revert_link,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("RegisterService",
"sssqqqaa{say}",
SD_BUS_PARAM(name)
SD_BUS_PARAM(name_template)
SD_BUS_PARAM(type)
SD_BUS_PARAM(service_port)
SD_BUS_PARAM(service_priority)
SD_BUS_PARAM(serwise_weight)
SD_BUS_PARAM(txt_datas),
"o",
SD_BUS_PARAM(service_path),
bus_method_register_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("UnregisterService",
"o",
SD_BUS_PARAM(service_path),
NULL,,
bus_method_unregister_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("ResetStatistics",
NULL,
NULL,
bus_method_reset_statistics,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("FlushCaches",
NULL,
NULL,
bus_method_flush_caches,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("ResetServerFeatures",
NULL,
NULL,
bus_method_reset_server_features,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResolveHostname",
SD_BUS_ARGS("i", ifindex, "s", name, "i", family, "t", flags),
SD_BUS_RESULT("a(iiay)", addresses, "s", canonical, "t", flags),
bus_method_resolve_hostname,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResolveAddress",
SD_BUS_ARGS("i", ifindex, "i", family, "ay", address, "t", flags),
SD_BUS_RESULT("a(is)", names, "t", flags),
bus_method_resolve_address,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResolveRecord",
SD_BUS_ARGS("i", ifindex, "s", name, "q", class, "q", type, "t", flags),
SD_BUS_RESULT("a(iqqay)", records, "t", flags),
bus_method_resolve_record,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResolveService",
SD_BUS_ARGS("i", ifindex,
"s", name,
"s", type,
"s", domain,
"i", family,
"t", flags),
SD_BUS_RESULT("a(qqqsa(iiay)s)", srv_data,
"aay", txt_data,
"s", canonical_name,
"s", canonical_type,
"s", canonical_domain,
"t", flags),
bus_method_resolve_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("GetLink",
SD_BUS_ARGS("i", ifindex),
SD_BUS_RESULT("o", path),
bus_method_get_link,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDNS",
SD_BUS_ARGS("i", ifindex, "a(iay)", addresses),
SD_BUS_NO_RESULT,
bus_method_set_link_dns_servers,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDomains",
SD_BUS_ARGS("i", ifindex, "a(sb)", domains),
SD_BUS_NO_RESULT,
bus_method_set_link_domains,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDefaultRoute",
SD_BUS_ARGS("i", ifindex, "b", enable),
SD_BUS_NO_RESULT,
bus_method_set_link_default_route,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkLLMNR",
SD_BUS_ARGS("i", ifindex, "s", mode),
SD_BUS_NO_RESULT,
bus_method_set_link_llmnr,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkMulticastDNS",
SD_BUS_ARGS("i", ifindex, "s", mode),
SD_BUS_NO_RESULT,
bus_method_set_link_mdns,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDNSOverTLS",
SD_BUS_ARGS("i", ifindex, "s", mode),
SD_BUS_NO_RESULT,
bus_method_set_link_dns_over_tls,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDNSSEC",
SD_BUS_ARGS("i", ifindex, "s", mode),
SD_BUS_NO_RESULT,
bus_method_set_link_dnssec,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLinkDNSSECNegativeTrustAnchors",
SD_BUS_ARGS("i", ifindex, "as", names),
SD_BUS_NO_RESULT,
bus_method_set_link_dnssec_negative_trust_anchors,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("RevertLink",
SD_BUS_ARGS("i", ifindex),
SD_BUS_NO_RESULT,
bus_method_revert_link,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("RegisterService",
SD_BUS_ARGS("s", name,
"s", name_template,
"s", type,
"q", service_port,
"q", service_priority,
"q", service_weight,
"a{say}", txt_datas),
SD_BUS_RESULT("o", service_path),
bus_method_register_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("UnregisterService",
SD_BUS_ARGS("o", service_path),
SD_BUS_NO_RESULT,
bus_method_unregister_service,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResetStatistics",
SD_BUS_NO_ARGS,
SD_BUS_NO_RESULT,
bus_method_reset_statistics,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("FlushCaches",
SD_BUS_NO_ARGS,
SD_BUS_NO_RESULT,
bus_method_flush_caches,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("ResetServerFeatures",
SD_BUS_NO_ARGS,
SD_BUS_NO_RESULT,
bus_method_reset_server_features,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_VTABLE_END,
};
+45 -50
View File
@@ -697,56 +697,51 @@ const sd_bus_vtable link_vtable[] = {
SD_BUS_PROPERTY("DNSSECNegativeTrustAnchors", "as", property_get_ntas, 0, 0),
SD_BUS_PROPERTY("DNSSECSupported", "b", property_get_dnssec_supported, 0, 0),
SD_BUS_METHOD_WITH_NAMES("SetDNS",
"a(iay)",
SD_BUS_PARAM(addresses),
NULL,,
bus_link_method_set_dns_servers,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetDomains",
"a(sb)",
SD_BUS_PARAM(domains),
NULL,,
bus_link_method_set_domains,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetDefaultRoute",
"b",
SD_BUS_PARAM(enable),
NULL,,
bus_link_method_set_default_route,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetLLMNR",
"s",
SD_BUS_PARAM(mode),
NULL,,
bus_link_method_set_llmnr,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetMulticastDNS",
"s",
SD_BUS_PARAM(mode),
NULL,,
bus_link_method_set_mdns,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetDNSOverTLS",
"s",
SD_BUS_PARAM(mode),
NULL,,
bus_link_method_set_dns_over_tls,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetDNSSEC",
"s",
SD_BUS_PARAM(mode),
NULL,,
bus_link_method_set_dnssec,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("SetDNSSECNegativeTrustAnchors",
"as",
SD_BUS_PARAM(names),
NULL,,
bus_link_method_set_dnssec_negative_trust_anchors,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Revert", NULL, NULL, bus_link_method_revert, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDNS",
SD_BUS_ARGS("a(iay)", addresses),
SD_BUS_NO_RESULT,
bus_link_method_set_dns_servers,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDomains",
SD_BUS_ARGS("a(sb)", domains),
SD_BUS_NO_RESULT,
bus_link_method_set_domains,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDefaultRoute",
SD_BUS_ARGS("b", enable),
SD_BUS_NO_RESULT,
bus_link_method_set_default_route,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetLLMNR",
SD_BUS_ARGS("s", mode),
SD_BUS_NO_RESULT,
bus_link_method_set_llmnr,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetMulticastDNS",
SD_BUS_ARGS("s", mode),
SD_BUS_NO_RESULT,
bus_link_method_set_mdns,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDNSOverTLS",
SD_BUS_ARGS("s", mode),
SD_BUS_NO_RESULT,
bus_link_method_set_dns_over_tls,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDNSSEC",
SD_BUS_ARGS("s", mode),
SD_BUS_NO_RESULT,
bus_link_method_set_dnssec,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("SetDNSSECNegativeTrustAnchors",
SD_BUS_ARGS("as", names),
SD_BUS_NO_RESULT,
bus_link_method_set_dnssec_negative_trust_anchors,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("Revert",
SD_BUS_NO_ARGS,
SD_BUS_NO_RESULT,
bus_link_method_revert,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_VTABLE_END
};
+118
View File
@@ -187,6 +187,124 @@ struct sd_bus_vtable {
.x = { { 0 } }, \
}
#define _SD_ECHO(X) X
#define _SD_CONCAT(X) #X "\0"
#define _SD_VARARGS_FOREACH_EVEN_01(FN, X, ...)
#define _SD_VARARGS_FOREACH_EVEN_02(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_01(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_03(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_02(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_04(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_03(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_05(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_04(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_06(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_05(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_07(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_06(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_08(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_07(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_09(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_08(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_10(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_09(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_11(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_10(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_12(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_11(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_13(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_12(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_14(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_13(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_15(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_14(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_16(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_15(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_17(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_16(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_18(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_17(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_19(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_18(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_20(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_19(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_21(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_20(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_22(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_21(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_23(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_22(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_24(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_23(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_25(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_24(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_26(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_25(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_27(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_26(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_28(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_27(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_29(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_28(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_30(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_29(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_31(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_30(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_32(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_31(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_33(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_32(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_34(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_33(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_35(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_34(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_36(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_35(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_37(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_36(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_38(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_37(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_39(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_38(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_40(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_39(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_41(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_40(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_42(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_41(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_43(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_42(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_44(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_43(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_45(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_44(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_46(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_45(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_47(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_46(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_48(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_47(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_49(FN, X, ...) _SD_VARARGS_FOREACH_EVEN_48(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_50(FN, X, ...) FN(X) _SD_VARARGS_FOREACH_EVEN_49(FN, __VA_ARGS__)
#define _SD_VARARGS_FOREACH_EVEN_SEQ(_01, _02, _03, _04, _05, _06, _07, _08, _09, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
NAME, ...) NAME
#define _SD_VARARGS_FOREACH_EVEN(FN, ...) \
_SD_VARARGS_FOREACH_EVEN_SEQ(__VA_ARGS__, \
_SD_VARARGS_FOREACH_EVEN_50, _SD_VARARGS_FOREACH_EVEN_49, \
_SD_VARARGS_FOREACH_EVEN_48, _SD_VARARGS_FOREACH_EVEN_47, \
_SD_VARARGS_FOREACH_EVEN_46, _SD_VARARGS_FOREACH_EVEN_45, \
_SD_VARARGS_FOREACH_EVEN_44, _SD_VARARGS_FOREACH_EVEN_43, \
_SD_VARARGS_FOREACH_EVEN_42, _SD_VARARGS_FOREACH_EVEN_41, \
_SD_VARARGS_FOREACH_EVEN_40, _SD_VARARGS_FOREACH_EVEN_39, \
_SD_VARARGS_FOREACH_EVEN_38, _SD_VARARGS_FOREACH_EVEN_37, \
_SD_VARARGS_FOREACH_EVEN_36, _SD_VARARGS_FOREACH_EVEN_35, \
_SD_VARARGS_FOREACH_EVEN_34, _SD_VARARGS_FOREACH_EVEN_33, \
_SD_VARARGS_FOREACH_EVEN_32, _SD_VARARGS_FOREACH_EVEN_31, \
_SD_VARARGS_FOREACH_EVEN_30, _SD_VARARGS_FOREACH_EVEN_29, \
_SD_VARARGS_FOREACH_EVEN_28, _SD_VARARGS_FOREACH_EVEN_27, \
_SD_VARARGS_FOREACH_EVEN_26, _SD_VARARGS_FOREACH_EVEN_25, \
_SD_VARARGS_FOREACH_EVEN_24, _SD_VARARGS_FOREACH_EVEN_23, \
_SD_VARARGS_FOREACH_EVEN_22, _SD_VARARGS_FOREACH_EVEN_21, \
_SD_VARARGS_FOREACH_EVEN_20, _SD_VARARGS_FOREACH_EVEN_19, \
_SD_VARARGS_FOREACH_EVEN_18, _SD_VARARGS_FOREACH_EVEN_17, \
_SD_VARARGS_FOREACH_EVEN_16, _SD_VARARGS_FOREACH_EVEN_15, \
_SD_VARARGS_FOREACH_EVEN_14, _SD_VARARGS_FOREACH_EVEN_13, \
_SD_VARARGS_FOREACH_EVEN_12, _SD_VARARGS_FOREACH_EVEN_11, \
_SD_VARARGS_FOREACH_EVEN_10, _SD_VARARGS_FOREACH_EVEN_09, \
_SD_VARARGS_FOREACH_EVEN_08, _SD_VARARGS_FOREACH_EVEN_07, \
_SD_VARARGS_FOREACH_EVEN_06, _SD_VARARGS_FOREACH_EVEN_05, \
_SD_VARARGS_FOREACH_EVEN_04, _SD_VARARGS_FOREACH_EVEN_03, \
_SD_VARARGS_FOREACH_EVEN_02, _SD_VARARGS_FOREACH_EVEN_01) \
(FN, __VA_ARGS__)
#define SD_BUS_ARGS(...) __VA_ARGS__
#define SD_BUS_RESULT(...) __VA_ARGS__
#define SD_BUS_NO_ARGS SD_BUS_ARGS(NULL,)
#define SD_BUS_NO_RESULT SD_BUS_RESULT(NULL,)
#define SD_BUS_METHOD_WITH_ARGS(_member, _args, _result, _handler, _flags) \
SD_BUS_METHOD_WITH_NAMES(_member, \
_SD_VARARGS_FOREACH_EVEN(_SD_ECHO, _args), \
_SD_VARARGS_FOREACH_EVEN(_SD_CONCAT, _args, ""), \
_SD_VARARGS_FOREACH_EVEN(_SD_ECHO, _result), \
_SD_VARARGS_FOREACH_EVEN(_SD_CONCAT, _result, ""), \
_handler, _flags)
#define SD_BUS_METHOD_WITH_ARGS_OFFSET(_member, _args, _result, _handler, _offset, _flags) \
SD_BUS_METHOD_WITH_NAMES_OFFSET(_member, \
_SD_VARARGS_FOREACH_EVEN(_SD_ECHO, _args), \
_SD_VARARGS_FOREACH_EVEN(_SD_CONCAT, _args, ""), \
_SD_VARARGS_FOREACH_EVEN(_SD_ECHO, _result), \
_SD_VARARGS_FOREACH_EVEN(_SD_CONCAT, _result, ""), \
_handler, _offset, _flags)
#define SD_BUS_SIGNAL_WITH_ARGS(_member, _args, _flags) \
SD_BUS_SIGNAL_WITH_NAMES(_member, \
_SD_VARARGS_FOREACH_EVEN(_SD_ECHO, _args), \
_SD_VARARGS_FOREACH_EVEN(_SD_CONCAT, _args, ""), \
_flags)
_SD_END_DECLARATIONS;
#endif