chiark / gitweb /
networkd: manager - read fallback DNS servers from config file
authorTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 17:44:22 +0000 (19:44 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 17:48:25 +0000 (19:48 +0200)
We will still use the compiled-in defaults if no DNS entry exists in the config file.

Makefile.am
src/network/.gitignore
src/network/networkd-manager.c
src/network/networkd.h

index ddfec1b..f6c195b 100644 (file)
@@ -4223,7 +4223,8 @@ libsystemd_networkd_core_la_SOURCES = \
 
 nodist_libsystemd_networkd_core_la_SOURCES = \
        src/network/networkd-network-gperf.c \
 
 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 \
 
 libsystemd_networkd_core_la_LIBADD = \
        libudev-internal.la \
@@ -4232,14 +4233,6 @@ libsystemd_networkd_core_la_LIBADD = \
        libsystemd-label.la \
        libsystemd-shared.la
 
        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
 
 rootlibexec_PROGRAMS += \
        systemd-networkd-wait-online
 
@@ -4269,15 +4262,30 @@ test_network_LDADD = \
 tests += \
        test-network
 
 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 \
 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.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 \
 
 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
 
 # ------------------------------------------------------------------------------
 endif
 
 # ------------------------------------------------------------------------------
@@ -4831,7 +4839,8 @@ substitutions = \
        '|RC_LOCAL_SCRIPT_PATH_STOP=$(RC_LOCAL_SCRIPT_PATH_STOP)|' \
        '|PYTHON=$(PYTHON)|' \
        '|PYTHON_BINARY=$(PYTHON_BINARY)|' \
        '|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 $@) && \
 
 SED_PROCESS = \
        $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
index 8858596..04bce2e 100644 (file)
@@ -1,2 +1,4 @@
 /networkd-network-gperf.c
 /networkd-netdev-gperf.c
 /networkd-network-gperf.c
 /networkd-netdev-gperf.c
+/networkd-gperf.c
+/networkd.conf
index 013b1dc..ad36553 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/if.h>
 #include <libkmod.h>
 
 #include <linux/if.h>
 #include <libkmod.h>
 
+#include "conf-parser.h"
 #include "path-util.h"
 #include "networkd.h"
 #include "network-internal.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;
 }
 
         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;
 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;
 
         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;
         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;
         Network *network;
         NetDev *netdev;
         Link *link;
+        Address *address;
 
         if (!m)
                 return;
 
         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);
 
         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);
         while ((link = hashmap_first(m->links)))
                 link_unref(link);
         hashmap_free(m->links);
index ebb3075..eaaf259 100644 (file)
@@ -282,6 +282,12 @@ int manager_save(Manager *m);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 #define _cleanup_manager_free_ _cleanup_(manager_freep)
 
 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);
 /* NetDev */
 
 int netdev_load(Manager *manager);