networkd: manager - read fallback DNS servers from config file

We will still use the compiled-in defaults if no DNS entry exists in the config file.
This commit is contained in:
Tom Gundersen 2014-05-16 19:44:22 +02:00
parent d4920165fe
commit 2dcf7ec6ec
4 changed files with 94 additions and 12 deletions

View File

@ -4223,7 +4223,8 @@ libsystemd_networkd_core_la_SOURCES = \
nodist_libsystemd_networkd_core_la_SOURCES = \
src/network/networkd-network-gperf.c \
src/network/networkd-netdev-gperf.c
src/network/networkd-netdev-gperf.c \
src/network/networkd-gperf.c
libsystemd_networkd_core_la_LIBADD = \
libudev-internal.la \
@ -4232,14 +4233,6 @@ libsystemd_networkd_core_la_LIBADD = \
libsystemd-label.la \
libsystemd-shared.la
nodist_systemunit_DATA += \
units/systemd-networkd.service \
units/systemd-networkd-wait-online.service
GENERAL_ALIASES += \
$(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-networkd.service \
$(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service
rootlibexec_PROGRAMS += \
systemd-networkd-wait-online
@ -4269,15 +4262,30 @@ test_network_LDADD = \
tests += \
test-network
nodist_systemunit_DATA += \
units/systemd-networkd.service \
units/systemd-networkd-wait-online.service
GENERAL_ALIASES += \
$(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-networkd.service \
$(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service
nodist_pkgsysconf_DATA += \
src/network/networkd.conf
EXTRA_DIST += \
src/network/networkd-network-gperf.gperf \
src/network/networkd-netdev-gperf.gperf \
src/network/networkd-gperf.gperf \
units/systemd-networkd.service.in \
units/systemd-networkd-wait-online.service.in
units/systemd-networkd-wait-online.service.in \
src/network/networkd.conf.in
CLEANFILES += \
src/network/networkd-network-gperf.c \
src/network/networkd-netdev-gperf.c
src/network/networkd-netdev-gperf.c \
src/network/networkd-gperf.c \
src/network/networkd.conf
endif
# ------------------------------------------------------------------------------
@ -4831,7 +4839,8 @@ substitutions = \
'|RC_LOCAL_SCRIPT_PATH_STOP=$(RC_LOCAL_SCRIPT_PATH_STOP)|' \
'|PYTHON=$(PYTHON)|' \
'|PYTHON_BINARY=$(PYTHON_BINARY)|' \
'|NTP_SERVERS=$(NTP_SERVERS)|'
'|NTP_SERVERS=$(NTP_SERVERS)|' \
'|DNS_SERVERS=$(DNS_SERVERS)|'
SED_PROCESS = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \

View File

@ -1,2 +1,4 @@
/networkd-network-gperf.c
/networkd-netdev-gperf.c
/networkd-gperf.c
/networkd.conf

View File

@ -23,6 +23,7 @@
#include <linux/if.h>
#include <libkmod.h>
#include "conf-parser.h"
#include "path-util.h"
#include "networkd.h"
#include "network-internal.h"
@ -110,6 +111,60 @@ static int set_fallback_dns(Manager *m, const char *string) {
return 0;
}
int config_parse_dnsv(
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) {
Manager *m = userdata;
Address *address;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(m);
while ((address = m->fallback_dns)) {
LIST_REMOVE(addresses, m->fallback_dns, address);
address_free(address);
}
set_fallback_dns(m, rvalue);
return 0;
}
static int manager_parse_config_file(Manager *m) {
static const char fn[] = "/etc/systemd/networkd.conf";
_cleanup_fclose_ FILE *f = NULL;
int r;
assert(m);
f = fopen(fn, "re");
if (!f) {
if (errno == ENOENT)
return 0;
log_warning("Failed to open configuration file %s: %m", fn);
return -errno;
}
r = config_parse(NULL, fn, f, "Network\0", config_item_perf_lookup,
(void*) networkd_gperf_lookup, false, false, m);
if (r < 0)
log_warning("Failed to parse configuration file: %s", strerror(-r));
return r;
}
int manager_new(Manager **ret) {
_cleanup_manager_free_ Manager *m = NULL;
int r;
@ -126,6 +181,10 @@ int manager_new(Manager **ret) {
if (r < 0)
return r;
r = manager_parse_config_file(m);
if (r < 0)
return r;
r = sd_event_default(&m->event);
if (r < 0)
return r;
@ -182,6 +241,7 @@ void manager_free(Manager *m) {
Network *network;
NetDev *netdev;
Link *link;
Address *address;
if (!m)
return;
@ -197,6 +257,11 @@ void manager_free(Manager *m) {
sd_event_source_unref(m->sigint_event_source);
sd_event_unref(m->event);
while ((address = m->fallback_dns)) {
LIST_REMOVE(addresses, m->fallback_dns, address);
address_free(address);
}
while ((link = hashmap_first(m->links)))
link_unref(link);
hashmap_free(m->links);

View File

@ -282,6 +282,12 @@ int manager_save(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
#define _cleanup_manager_free_ _cleanup_(manager_freep)
const struct ConfigPerfItem* networkd_gperf_lookup(const char *key, unsigned length);
int config_parse_dnsv(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);
/* NetDev */
int netdev_load(Manager *manager);