Merge pull request #25929 from poettering/resolvectl-loopback-fix

resolvectl: show 127.0.0.1 among global DNS servers again
This commit is contained in:
Luca Boccassi
2023-01-05 13:25:13 +01:00
committed by GitHub
2 changed files with 42 additions and 23 deletions

View File

@@ -1206,18 +1206,29 @@ static int reset_server_features(int argc, char **argv, void *userdata) {
return 0;
}
static int read_dns_server_one(sd_bus_message *m, bool with_ifindex, bool extended, char **ret) {
static int read_dns_server_one(
sd_bus_message *m,
bool with_ifindex, /* read "ifindex" reply that also carries an interface index */
bool extended, /* read "extended" reply, i.e. with port number and server name */
bool only_global, /* suppress entries with an (non-loopback) ifindex set (i.e. which are specific to some interface) */
char **ret) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ char *pretty = NULL;
int ifindex, family, r, k;
union in_addr_union a;
const char *name = NULL;
int32_t ifindex = 0;
int family, r, k;
uint16_t port = 0;
assert(m);
assert(ret);
r = sd_bus_message_enter_container(m, 'r', with_ifindex ? (extended ? "iiayqs" : "iiay") : (extended ? "iayqs" : "iay"));
r = sd_bus_message_enter_container(
m,
'r',
with_ifindex ? (extended ? "iiayqs" : "iiay") :
(extended ? "iayqs" : "iay"));
if (r <= 0)
return r;
@@ -1251,8 +1262,8 @@ static int read_dns_server_one(sd_bus_message *m, bool with_ifindex, bool extend
return 1;
}
if (with_ifindex && ifindex != 0) {
/* only show the global ones here */
if (only_global && ifindex > 0 && ifindex != LOOPBACK_IFINDEX) {
/* This one has an (non-loopback) ifindex set, and we were told to suppress those. Hence do so. */
*ret = NULL;
return 1;
}
@@ -1262,7 +1273,6 @@ static int read_dns_server_one(sd_bus_message *m, bool with_ifindex, bool extend
return r;
*ret = TAKE_PTR(pretty);
return 1;
}
@@ -1281,7 +1291,7 @@ static int map_link_dns_servers_internal(sd_bus *bus, const char *member, sd_bus
for (;;) {
_cleanup_free_ char *pretty = NULL;
r = read_dns_server_one(m, false, extended, &pretty);
r = read_dns_server_one(m, /* with_ifindex= */ false, extended, /* only_global= */ false, &pretty);
if (r < 0)
return r;
if (r == 0)
@@ -1314,14 +1324,14 @@ static int map_link_current_dns_server(sd_bus *bus, const char *member, sd_bus_m
assert(m);
assert(userdata);
return read_dns_server_one(m, false, false, userdata);
return read_dns_server_one(m, /* with_ifindex= */ false, /* extended= */ false, /* only_global= */ false, userdata);
}
static int map_link_current_dns_server_ex(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
assert(m);
assert(userdata);
return read_dns_server_one(m, false, true, userdata);
return read_dns_server_one(m, /* with_ifindex= */ false, /* extended= */ true, /* only_global= */ false, userdata);
}
static int read_domain_one(sd_bus_message *m, bool with_ifindex, char **ret) {
@@ -1729,7 +1739,14 @@ static int status_ifindex(sd_bus *bus, int ifindex, const char *name, StatusMode
return 0;
}
static int map_global_dns_servers_internal(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata, bool extended) {
static int map_global_dns_servers_internal(
sd_bus *bus,
const char *member,
sd_bus_message *m,
sd_bus_error *error,
void *userdata,
bool extended) {
char ***l = ASSERT_PTR(userdata);
int r;
@@ -1744,7 +1761,7 @@ static int map_global_dns_servers_internal(sd_bus *bus, const char *member, sd_b
for (;;) {
_cleanup_free_ char *pretty = NULL;
r = read_dns_server_one(m, true, extended, &pretty);
r = read_dns_server_one(m, /* with_ifindex= */ true, extended, /* only_global= */ true, &pretty);
if (r < 0)
return r;
if (r == 0)
@@ -1766,25 +1783,19 @@ static int map_global_dns_servers_internal(sd_bus *bus, const char *member, sd_b
}
static int map_global_dns_servers(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
return map_global_dns_servers_internal(bus, member, m, error, userdata, false);
return map_global_dns_servers_internal(bus, member, m, error, userdata, /* extended= */ false);
}
static int map_global_dns_servers_ex(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
return map_global_dns_servers_internal(bus, member, m, error, userdata, true);
return map_global_dns_servers_internal(bus, member, m, error, userdata, /* extended= */ true);
}
static int map_global_current_dns_server(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
assert(m);
assert(userdata);
return read_dns_server_one(m, true, false, userdata);
return read_dns_server_one(m, /* with_ifindex= */ true, /* extended= */ false, /* only_global= */ true, userdata);
}
static int map_global_current_dns_server_ex(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
assert(m);
assert(userdata);
return read_dns_server_one(m, true, true, userdata);
return read_dns_server_one(m, /* with_ifindex= */ true, /* extended= */ true, /* only_global= */ true, userdata);
}
static int map_global_domains(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {

View File

@@ -1371,7 +1371,11 @@ static int bus_method_resolve_service(sd_bus_message *message, void *userdata, s
return 1;
}
int bus_dns_server_append(sd_bus_message *reply, DnsServer *s, bool with_ifindex, bool extended) {
int bus_dns_server_append(
sd_bus_message *reply,
DnsServer *s,
bool with_ifindex, /* include "ifindex" field */
bool extended) { /* also include port number and server name */
int r;
assert(reply);
@@ -1390,7 +1394,11 @@ int bus_dns_server_append(sd_bus_message *reply, DnsServer *s, bool with_ifindex
}
}
r = sd_bus_message_open_container(reply, 'r', with_ifindex ? (extended ? "iiayqs" : "iiay") : (extended ? "iayqs" : "iay"));
r = sd_bus_message_open_container(
reply,
'r',
with_ifindex ? (extended ? "iiayqs" : "iiay") :
(extended ? "iayqs" : "iay"));
if (r < 0)
return r;