From: Lennart Poettering Date: Wed, 11 Sep 2024 14:10:45 +0000 (+0200) Subject: resolvectl: rework parsing of dns server + search domain bus properties X-Git-Tag: v258-rc1~563^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c45b341d30c71e9192ae5540136b36aeaa58996;p=thirdparty%2Fsystemd.git resolvectl: rework parsing of dns server + search domain bus properties Let's handle the per-link and the global dns server/search domain property parsing the same. Let's use a flags field for three separate booleans, and unify more code. --- diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 7d284ab28e6..1715f0b7469 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -1364,6 +1364,26 @@ typedef enum { READ_DNS_ONLY_GLOBAL = 1 << 2, /* suppress entries with an (non-loopback) ifindex set (i.e. which are specific to some interface) */ } ReadDNSFlag; +static const char *dns_server_property_signature(ReadDNSFlag flags) { + switch (flags & (READ_DNS_WITH_IFINDEX|READ_DNS_EXTENDED)) { + + case 0: + return "iay"; + + case READ_DNS_WITH_IFINDEX: + return "iiay"; + + case READ_DNS_EXTENDED: + return "iayqs"; + + case READ_DNS_WITH_IFINDEX|READ_DNS_EXTENDED: + return "iiayqs"; + + default: + assert_not_reached(); + } +} + static int read_dns_server_one(sd_bus_message *m, ReadDNSFlag flags, char **ret) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_free_ char *pretty = NULL; @@ -1379,8 +1399,7 @@ static int read_dns_server_one(sd_bus_message *m, ReadDNSFlag flags, char **ret) r = sd_bus_message_enter_container( m, 'r', - FLAGS_SET(flags, READ_DNS_WITH_IFINDEX) ? (FLAGS_SET(flags, READ_DNS_EXTENDED) ? "iiayqs" : "iiay") : - (FLAGS_SET(flags, READ_DNS_EXTENDED) ? "iayqs" : "iay")); + dns_server_property_signature(flags)); if (r <= 0) return r; @@ -1416,11 +1435,7 @@ static int read_dns_server_one(sd_bus_message *m, ReadDNSFlag flags, char **ret) } if (FLAGS_SET(flags, READ_DNS_EXTENDED)) { - r = sd_bus_message_read(m, "q", &port); - if (r < 0) - return r; - - r = sd_bus_message_read(m, "s", &name); + r = sd_bus_message_read(m, "qs", &port, &name); if (r < 0) return r; } @@ -1443,7 +1458,7 @@ static int read_dns_server_one(sd_bus_message *m, ReadDNSFlag flags, char **ret) return 1; } -static int map_link_dns_servers_internal(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata, ReadDNSFlag flags) { +static int map_link_dns_servers_internal(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, ReadDNSFlag flags, void *userdata) { char ***l = ASSERT_PTR(userdata); int r; @@ -1451,7 +1466,9 @@ static int map_link_dns_servers_internal(sd_bus *bus, const char *member, sd_bus assert(member); assert(m); - r = sd_bus_message_enter_container(m, 'a', FLAGS_SET(flags, READ_DNS_EXTENDED) ? "(iayqs)" : "(iay)"); + const char *sig = strjoina("(", dns_server_property_signature(flags), ")"); + + r = sd_bus_message_enter_container(m, 'a', sig); if (r < 0) return r; @@ -1480,11 +1497,11 @@ static int map_link_dns_servers_internal(sd_bus *bus, const char *member, sd_bus } static int map_link_dns_servers(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { - return map_link_dns_servers_internal(bus, member, m, error, userdata, /* flags = */ 0); + return map_link_dns_servers_internal(bus, member, m, error, /* flags = */ 0, userdata); } static int map_link_dns_servers_ex(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { - return map_link_dns_servers_internal(bus, member, m, error, userdata, READ_DNS_EXTENDED); + return map_link_dns_servers_internal(bus, member, m, error, READ_DNS_EXTENDED, userdata); } static int map_link_current_dns_server(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { @@ -1530,11 +1547,17 @@ static int read_domain_one(sd_bus_message *m, bool with_ifindex, char **ret) { return -ENOMEM; *ret = TAKE_PTR(str); - return 1; } -static int map_link_domains(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { +static int map_domains_internal( + sd_bus *bus, + const char *member, + sd_bus_message *m, + bool with_ifindex, + sd_bus_error *error, + void *userdata) { + char ***l = ASSERT_PTR(userdata); int r; @@ -1542,14 +1565,14 @@ static int map_link_domains(sd_bus *bus, const char *member, sd_bus_message *m, assert(member); assert(m); - r = sd_bus_message_enter_container(m, 'a', "(sb)"); + r = sd_bus_message_enter_container(m, 'a', with_ifindex ? "(isb)" : "(sb)"); if (r < 0) return r; for (;;) { _cleanup_free_ char *pretty = NULL; - r = read_domain_one(m, false, &pretty); + r = read_domain_one(m, with_ifindex, &pretty); if (r < 0) return r; if (r == 0) @@ -1570,6 +1593,10 @@ static int map_link_domains(sd_bus *bus, const char *member, sd_bus_message *m, return 0; } +static int map_link_domains(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { + return map_domains_internal(bus, member, m, /* with_ifindex= */ false, error, userdata); +} + static int status_print_strv_ifindex(int ifindex, const char *ifname, char **p) { const unsigned indent = strlen("Global: "); /* Use the same indentation everywhere to make things nice */ int pos1, pos2; @@ -1978,41 +2005,7 @@ static int map_global_current_dns_server_ex(sd_bus *bus, const char *member, sd_ } static int map_global_domains(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { - char ***l = ASSERT_PTR(userdata); - int r; - - assert(bus); - assert(member); - assert(m); - - r = sd_bus_message_enter_container(m, 'a', "(isb)"); - if (r < 0) - return r; - - for (;;) { - _cleanup_free_ char *pretty = NULL; - - r = read_domain_one(m, true, &pretty); - if (r < 0) - return r; - if (r == 0) - break; - - if (isempty(pretty)) - continue; - - r = strv_consume(l, TAKE_PTR(pretty)); - if (r < 0) - return r; - } - - r = sd_bus_message_exit_container(m); - if (r < 0) - return r; - - strv_sort(*l); - - return 0; + return map_domains_internal(bus, member, m, /* with_ifindex= */ true, error, userdata); } static int status_global(sd_bus *bus, StatusMode mode, bool *empty_line) {