networkd: merge DNS and NTP entries when exporting

In the state files, do not distinguish where the various entries came from
(static or DHCP), but include them all in the same list.
This commit is contained in:
Tom Gundersen
2014-07-23 23:54:51 +02:00
parent 36d054aae0
commit b0e39c8284
9 changed files with 56 additions and 156 deletions
-49
View File
@@ -394,55 +394,6 @@ int address_configure(Address *address, Link *link,
return 0;
}
int config_parse_dns(const char *unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
Network *network = userdata;
Address *tail;
_cleanup_address_free_ Address *n = NULL;
int r;
assert(filename);
assert(section);
assert(lvalue);
assert(rvalue);
assert(network);
r = address_new_dynamic(&n);
if (r < 0)
return r;
r = net_parse_inaddr(rvalue, &n->family, &n->in_addr);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
"DNS address is invalid, ignoring assignment: %s", rvalue);
return 0;
}
if (streq(lvalue, "DNS")) {
LIST_FIND_TAIL(addresses, network->dns, tail);
LIST_INSERT_AFTER(addresses, network->dns, tail, n);
} else if (streq(lvalue, "NTP")) {
LIST_FIND_TAIL(addresses, network->ntp, tail);
LIST_INSERT_AFTER(addresses, network->ntp, tail, n);
} else {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
"Key is invalid, ignoring assignment: %s=%s", lvalue, rvalue);
return 0;
}
n = NULL;
return 0;
}
int config_parse_broadcast(const char *unit,
const char *filename,
unsigned line,
+43 -29
View File
@@ -2419,27 +2419,6 @@ int link_update(Link *link, sd_rtnl_message *m) {
return link_update_flags(link, m);
}
static void serialize_addresses(FILE *f, const char *key, Address *address) {
Address *ad;
assert(f);
assert(key);
if (!address)
return;
fprintf(f, "%s=", key);
LIST_FOREACH(addresses, ad, address) {
char buf[INET6_ADDRSTRLEN];
if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
}
fputs("\n", f);
}
static void link_update_operstate(Link *link) {
assert(link);
@@ -2510,8 +2489,47 @@ int link_save(Link *link) {
admin_state, oper_state);
if (link->network) {
serialize_addresses(f, "DNS", link->network->dns);
serialize_addresses(f, "NTP", link->network->ntp);
char **address;
fputs("DNS=", f);
if (link->network->dhcp_dns &&
link->dhcp_lease) {
const struct in_addr *addresses;
r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
if (r > 0) {
serialize_in_addrs(f, addresses, r);
if (link->network->dns)
fputs(" ", f);
}
}
STRV_FOREACH(address, link->network->dns)
fprintf(f, "%s%s", *address,
(address + 1 ? " " : ""));
fputs("\n", f);
fprintf(f, "NTP=");
if (link->network->dhcp_ntp &&
link->dhcp_lease) {
const struct in_addr *addresses;
r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
if (r > 0) {
serialize_in_addrs(f, addresses, r);
if (link->network->ntp)
fputs(" ", f);
}
}
STRV_FOREACH(address, link->network->ntp)
fprintf(f, "%s%s", *address,
(address + 1 ? " " : ""));
fputs("\n", f);
}
if (link->dhcp_lease) {
@@ -2522,12 +2540,8 @@ int link_save(Link *link) {
goto finish;
fprintf(f,
"DHCP_LEASE=%s\n"
"DHCP_USE_DNS=%s\n"
"DHCP_USE_NTP=%s\n",
link->lease_file,
yes_no(link->network->dhcp_dns),
yes_no(link->network->dhcp_ntp));
"DHCP_LEASE=%s\n",
link->lease_file);
} else
unlink(link->lease_file);
+2 -2
View File
@@ -35,8 +35,8 @@ Network.DHCPServer, config_parse_bool, 0,
Network.IPv4LL, config_parse_bool, 0, offsetof(Network, ipv4ll)
Network.Address, config_parse_address, 0, 0
Network.Gateway, config_parse_gateway, 0, 0
Network.DNS, config_parse_dns, 0, offsetof(Network, dns)
Network.NTP, config_parse_dns, 0, offsetof(Network, ntp)
Network.DNS, config_parse_strv, 0, offsetof(Network, dns)
Network.NTP, config_parse_strv, 0, offsetof(Network, ntp)
Network.Tunnel, config_parse_tunnel, 0, offsetof(Network, tunnel)
Address.Address, config_parse_address, 0, 0
Address.Peer, config_parse_address, 0, 0
+2 -9
View File
@@ -169,15 +169,8 @@ void network_free(Network *network) {
free(network->description);
free(network->dhcp_vendor_class_identifier);
while ((address = network->ntp)) {
LIST_REMOVE(addresses, network->ntp, address);
address_free(address);
}
while ((address = network->dns)) {
LIST_REMOVE(addresses, network->dns, address);
address_free(address);
}
strv_free(network->ntp);
strv_free(network->dns);
netdev_unref(network->bridge);
+1 -6
View File
@@ -105,8 +105,7 @@ struct Network {
Hashmap *addresses_by_section;
Hashmap *routes_by_section;
LIST_HEAD(Address, dns);
LIST_HEAD(Address, ntp);
char **dns, **ntp;
LIST_FIELDS(Network, networks);
};
@@ -338,10 +337,6 @@ bool address_equal(Address *a1, Address *a2);
DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
#define _cleanup_address_free_ _cleanup_(address_freep)
int config_parse_dns(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_address(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);