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;
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;
}
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;
}
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;
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;
}
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) {
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;
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)
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;
}
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) {