aboutgitcodebugslistschat
path: root/conf.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2022-11-10 20:30:03 +0100
committerStefano Brivio <sbrivio@redhat.com>2022-11-16 15:09:31 +0100
commit3a2afde87dd15e9e9716cadaedce37de47a05d91 (patch)
tree340619abfaea041e3c0c91975615f2a996d92f22 /conf.c
parent4129764ecaebf05a33e22d8d95bb3d8deaa14c14 (diff)
downloadpasst-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar.gz
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar.bz2
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar.lz
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar.xz
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.tar.zst
passt-3a2afde87dd15e9e9716cadaedce37de47a05d91.zip
conf, udp: Drop mostly duplicated dns_send arrays, rename related fields
Given that we use just the first valid DNS resolver address configured, or read from resolv.conf(5) on the host, to forward DNS queries to, in case --dns-forward is used, we don't need to duplicate dns[] to dns_send[]: - rename dns_send[] back to dns[]: those are the resolvers we advertise to the guest/container - for forwarding purposes, instead of dns[], use a single field (for each protocol version): dns_host - and rename dns_fwd to dns_match, so that it's clear this is the address we are matching DNS queries against, to decide if they need to be forwarded Suggested-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'conf.c')
-rw-r--r--conf.c76
1 files changed, 33 insertions, 43 deletions
diff --git a/conf.c b/conf.c
index 1adcf83..a995eb7 100644
--- a/conf.c
+++ b/conf.c
@@ -355,11 +355,9 @@ overlap:
*/
static void get_dns(struct ctx *c)
{
- struct in6_addr *dns6_send = &c->ip6.dns_send[0];
- struct in_addr *dns4_send = &c->ip4.dns_send[0];
+ struct in6_addr *dns6 = &c->ip6.dns[0], dns6_tmp;
+ struct in_addr *dns4 = &c->ip4.dns[0], dns4_tmp;
int dns4_set, dns6_set, dnss_set, dns_set, fd;
- struct in6_addr *dns6 = &c->ip6.dns[0];
- struct in_addr *dns4 = &c->ip4.dns[0];
struct fqdn *s = c->dns_search;
struct lineread resolvconf;
int line_len;
@@ -388,49 +386,44 @@ static void get_dns(struct ctx *c)
*end = 0;
if (!dns4_set &&
- dns4 - &c->ip4.dns[0] < ARRAY_SIZE(c->ip4.dns) - 1 &&
- inet_pton(AF_INET, p + 1, dns4)) {
+ dns4 - &c->ip4.dns[0] < ARRAY_SIZE(c->ip4.dns) - 1
+ && inet_pton(AF_INET, p + 1, &dns4_tmp)) {
/* Guest or container can only access local
* addresses via local redirect
*/
- if (IN4_IS_ADDR_LOOPBACK(dns4)) {
+ if (IN4_IS_ADDR_LOOPBACK(&dns4_tmp)) {
if (!c->no_map_gw) {
- *dns4_send = c->ip4.gw;
- dns4_send++;
+ *dns4 = c->ip4.gw;
+ dns4++;
}
} else {
- *dns4_send = *dns4;
- dns4_send++;
+ *dns4 = dns4_tmp;
+ dns4++;
}
- dns4++;
-
- dns4->s_addr = htonl(INADDR_ANY);
- dns4_send->s_addr = htonl(INADDR_ANY);
+ if (IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_host))
+ c->ip4.dns_host = dns4_tmp;
}
if (!dns6_set &&
- dns6 - &c->ip6.dns[0] < ARRAY_SIZE(c->ip6.dns) - 1 &&
- inet_pton(AF_INET6, p + 1, dns6)) {
+ dns6 - &c->ip6.dns[0] < ARRAY_SIZE(c->ip6.dns) - 1
+ && inet_pton(AF_INET6, p + 1, &dns6_tmp)) {
/* Guest or container can only access local
* addresses via local redirect
*/
- if (IN6_IS_ADDR_LOOPBACK(dns6)) {
+ if (IN6_IS_ADDR_LOOPBACK(&dns6_tmp)) {
if (!c->no_map_gw) {
- memcpy(dns6_send, &c->ip6.gw,
- sizeof(*dns6_send));
- dns6_send++;
+ memcpy(dns6, &c->ip6.gw,
+ sizeof(*dns6));
+ dns6++;
}
} else {
- memcpy(dns6_send, dns6,
- sizeof(*dns6_send));
- dns6_send++;
+ memcpy(dns6, &dns6_tmp, sizeof(*dns6));
+ dns6++;
}
- dns6++;
-
- memset(dns6, 0, sizeof(*dns6));
- memset(dns6_send, 0, sizeof(*dns6_send));
+ if (IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_host))
+ c->ip6.dns_host = dns6_tmp;
}
} else if (!dnss_set && strstr(line, "search ") == line &&
s == c->dns_search) {
@@ -897,12 +890,10 @@ static void conf_print(const struct ctx *c)
inet_ntop(AF_INET, &c->ip4.gw, buf4, sizeof(buf4)));
}
- for (i = 0; !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_send[i]);
- i++) {
+ for (i = 0; !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns[i]); i++) {
if (!i)
info("DNS:");
- inet_ntop(AF_INET, &c->ip4.dns_send[i], buf4,
- sizeof(buf4));
+ inet_ntop(AF_INET, &c->ip4.dns[i], buf4, sizeof(buf4));
info(" %s", buf4);
}
@@ -933,8 +924,7 @@ static void conf_print(const struct ctx *c)
inet_ntop(AF_INET6, &c->ip6.addr_ll, buf6, sizeof(buf6)));
dns6:
- for (i = 0; !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_send[i]);
- i++) {
+ for (i = 0; !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns[i]); i++) {
if (!i)
info("DNS:");
inet_ntop(AF_INET6, &c->ip6.dns[i], buf6, sizeof(buf6));
@@ -1230,17 +1220,17 @@ void conf(struct ctx *c, int argc, char **argv)
c->no_dhcp_dns_search = 1;
break;
case 9:
- if (IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_fwd) &&
- inet_pton(AF_INET6, optarg, &c->ip6.dns_fwd) &&
- !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_fwd) &&
- !IN6_IS_ADDR_LOOPBACK(&c->ip6.dns_fwd))
+ if (IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_match) &&
+ inet_pton(AF_INET6, optarg, &c->ip6.dns_match) &&
+ !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_match) &&
+ !IN6_IS_ADDR_LOOPBACK(&c->ip6.dns_match))
break;
- if (IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_fwd) &&
- inet_pton(AF_INET, optarg, &c->ip4.dns_fwd) &&
- !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_fwd) &&
- !IN4_IS_ADDR_BROADCAST(&c->ip4.dns_fwd) &&
- !IN4_IS_ADDR_LOOPBACK(&c->ip4.dns_fwd))
+ if (IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_match) &&
+ inet_pton(AF_INET, optarg, &c->ip4.dns_match) &&
+ !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_match) &&
+ !IN4_IS_ADDR_BROADCAST(&c->ip4.dns_match) &&
+ !IN4_IS_ADDR_LOOPBACK(&c->ip4.dns_match))
break;
err("Invalid DNS forwarding address: %s", optarg);