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;
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);
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)
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;
/* 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;
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) {