mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
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.
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user