1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-03-13 12:58:20 +03:00

network-generator: allow to specify both IPv4 and IPv6 DNS servers

Follow-up for 923599523c10d8897551e081e6b00cd8002309c3.

(cherry picked from commit 816c269e55220924c4f8b712afd976e83ec0359e)
(cherry picked from commit 6db250e4aee95a6c79f2724092e79b2162d70540)
This commit is contained in:
Yu Watanabe 2023-11-08 04:09:48 +09:00 committed by Luca Boccassi
parent 068003c37f
commit eb808e1534
2 changed files with 19 additions and 14 deletions

View File

@ -448,16 +448,20 @@ static int network_set_route(Context *context, const char *ifname, int family, u
return route_new(network, family, prefixlen, dest, gateway, NULL);
}
static int network_set_dns(Context *context, const char *ifname, const char *dns) {
static int network_set_dns(Context *context, const char *ifname, int family, const char *dns) {
union in_addr_union a;
Network *network;
int family, r;
int r;
assert(context);
assert(ifname);
assert(IN_SET(family, AF_UNSPEC, AF_INET, AF_INET6));
assert(dns);
r = in_addr_from_string_auto(dns, &family, &a);
if (family == AF_UNSPEC)
r = in_addr_from_string_auto(dns, &family, &a);
else
r = in_addr_from_string(family, dns, &a);
if (r < 0)
return r;
@ -651,13 +655,12 @@ static int parse_netmask_or_prefixlen(int family, const char **value, unsigned c
return 0;
}
static int parse_ip_dns_address_one(Context *context, const char *ifname, int family, const char **value) {
static int parse_ip_dns_address_one(Context *context, const char *ifname, const char **value) {
const char *p, *q, *buf;
int r;
int r, family;
assert(context);
assert(ifname);
assert(IN_SET(family, AF_INET, AF_INET6));
assert(value);
p = ASSERT_PTR(*value);
@ -665,16 +668,16 @@ static int parse_ip_dns_address_one(Context *context, const char *ifname, int fa
if (isempty(p))
return 0;
if (family == AF_INET6) {
if (p[0] != '[')
return -EINVAL;
if (p[0] == '[') {
q = strchr(p + 1, ']');
if (!q)
return -EINVAL;
if (!IN_SET(q[1], ':', '\0'))
return -EINVAL;
buf = strndupa_safe(p + 1, q - p - 1);
p = q + 1;
family = AF_INET6;
} else {
q = strchr(p, ':');
if (!q)
@ -683,9 +686,10 @@ static int parse_ip_dns_address_one(Context *context, const char *ifname, int fa
buf = strndupa_safe(*value, q - *value);
p += strlen(buf);
family = AF_INET;
}
r = network_set_dns(context, ifname, buf);
r = network_set_dns(context, ifname, family, buf);
if (r < 0)
return r;
@ -778,10 +782,10 @@ static int parse_cmdline_ip_address(Context *context, int family, const char *va
/* Next, try [<dns1>][:<dns2>] */
value = p + 1;
r = parse_ip_dns_address_one(context, ifname, family, &value);
r = parse_ip_dns_address_one(context, ifname, &value);
if (r < 0)
return r;
r = parse_ip_dns_address_one(context, ifname, family, &value);
r = parse_ip_dns_address_one(context, ifname, &value);
if (r < 0)
return r;
@ -902,7 +906,7 @@ static int parse_cmdline_nameserver(Context *context, const char *key, const cha
if (proc_cmdline_value_missing(key, value))
return -EINVAL;
return network_set_dns(context, "", value);
return network_set_dns(context, "", AF_UNSPEC, value);
}
static int parse_cmdline_rd_peerdns(Context *context, const char *key, const char *value) {

View File

@ -269,6 +269,7 @@ COMMAND_LINES=(
"ip=:::::dhcp99:dhcp6:666:52:54:00:a7:8f:ac"
"ip=:::::dhcp99:dhcp6:10.0.0.128"
"ip=:::::dhcp99:dhcp6:10.0.0.128:10.0.0.129"
"ip=:::::dhcp99:dhcp6:10.0.0.128:[fdef:c400:bd01:1096::bbbb]"
"ip=::::::any"
"ip=::::::ibft"
)