chiark / gitweb /
networkd: hardcode a set of default dns servers
authorTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 13:24:09 +0000 (15:24 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 15:19:04 +0000 (17:19 +0200)
Similarly to NTP servers, this can be set at compile-time.

configure.ac
src/network/networkd-manager.c
src/network/networkd.h

index 0a4e901d75208ad82c8018c939161537f24cabaa..0ceaf51719ed50ed5a6e80c0f7060cdc7393fd1a 100644 (file)
@@ -877,6 +877,7 @@ fi
 AM_CONDITIONAL(ENABLE_POLKIT, [test "x$have_polkit" = "xyes"])
 
 # ------------------------------------------------------------------------------
+have_networkd=no
 AC_ARG_ENABLE(networkd, AS_HELP_STRING([--disable-networkd], [disable networkd]))
 if test "x$enable_networkd" != "xno"; then
         AC_DEFINE(ENABLE_NETWORKD, 1, [Define if networkd support is to be enabled])
@@ -886,6 +887,15 @@ AS_IF([test "x$have_networkd" = "xyes" -a "x$have_kmod" != "xyes"],
       [AC_MSG_ERROR([networkd requires kmod])])
 AM_CONDITIONAL(ENABLE_NETWORKD, [test "x$have_networkd" = "xyes"])
 
+AC_ARG_WITH(dns-servers,
+        AS_HELP_STRING([--with-dns-servers=DNSSERVERS],
+                [Space-separated list of default DNS servers]),
+        [DNS_SERVERS="$withval"],
+        [DNS_SERVERS="8.8.8.8 8.8.4.4"])
+
+AC_DEFINE_UNQUOTED(DNS_SERVERS, ["$DNS_SERVERS"], [Default DNS Servers])
+AC_SUBST(DNS_SERVERS)
+
 # ------------------------------------------------------------------------------
 have_efi=no
 AC_ARG_ENABLE(efi, AS_HELP_STRING([--disable-efi], [disable EFI support]))
@@ -1189,6 +1199,7 @@ AC_MSG_RESULT([
         time epoch:              ${TIME_EPOCH}
         localed:                 ${have_localed}
         networkd:                ${have_networkd}
+        default DNS servers:     ${DNS_SERVERS}
         coredump:                ${have_coredump}
         polkit:                  ${have_polkit}
         efi:                     ${have_efi}
index cc55f9a17a0307d74ef9c901c2bc3e0c2cf6bf53..1b14e9d4f11ffa0014d51258720c1fea6a70bf0b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "path-util.h"
 #include "networkd.h"
+#include "network-internal.h"
 #include "libudev-private.h"
 #include "udev-util.h"
 #include "rtnl-util.h"
@@ -74,6 +75,41 @@ static int setup_signals(Manager *m) {
         return 0;
 }
 
+static int set_fallback_dns(Manager *m, const char *string) {
+        char *word, *state;
+        size_t length;
+        int r;
+
+        assert(m);
+        assert(string);
+
+        FOREACH_WORD_QUOTED(word, length, string, state) {
+                _cleanup_address_free_ Address *address = NULL;
+                Address *tail;
+                _cleanup_free_ char *addrstr = NULL;
+
+                r = address_new_dynamic(&address);
+                if (r < 0)
+                        return r;
+
+                addrstr = strndup(word, length);
+                if (!addrstr)
+                        return -ENOMEM;
+
+                r = net_parse_inaddr(addrstr, &address->family, &address->in_addr);
+                if (r < 0) {
+                        log_debug("Ignoring invalid DNS address '%s'", addrstr);
+                        continue;
+                }
+
+                LIST_FIND_TAIL(addresses, m->fallback_dns, tail);
+                LIST_INSERT_AFTER(addresses, m->fallback_dns, tail, address);
+                address = NULL;
+        }
+
+        return 0;
+}
+
 int manager_new(Manager **ret) {
         _cleanup_manager_free_ Manager *m = NULL;
         int r;
@@ -86,6 +122,10 @@ int manager_new(Manager **ret) {
         if (!m->state_file)
                 return -ENOMEM;
 
+        r = set_fallback_dns(m, DNS_SERVERS);
+        if (r < 0)
+                return r;
+
         r = sd_event_default(&m->event);
         if (r < 0)
                 return r;
@@ -494,6 +534,14 @@ int manager_update_resolv_conf(Manager *m) {
                 }
         }
 
+        if (!count) {
+                Address *address;
+
+                LIST_FOREACH(addresses, address, m->fallback_dns)
+                        append_dns(f, &address->in_addr.in,
+                                   address->family, &count);
+        }
+
         fflush(f);
 
         if (ferror(f) || rename(temp_path, "/run/systemd/network/resolv.conf") < 0) {
index e2e15b56bb7bd88b58083bc805f8e1a5e3ea87fd..3b29842f194b4730f224bd41b87c23793ea47015 100644 (file)
@@ -254,6 +254,7 @@ struct Manager {
         Hashmap *links;
         Hashmap *netdevs;
         LIST_HEAD(Network, networks);
+        LIST_HEAD(Address, fallback_dns);
 
         usec_t network_dirs_ts_usec;
         struct kmod_ctx *kmod_ctx;