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:
parent
068003c37f
commit
eb808e1534
@ -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) {
|
||||
|
@ -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"
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user