#include <resolv.h>
#include <linux/if.h>
+#include <libkmod.h>
#include "path-util.h"
#include "networkd.h"
+#include "network-internal.h"
#include "libudev-private.h"
#include "udev-util.h"
#include "rtnl-util.h"
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;
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;
return -ENOMEM;
}
+ m->kmod_ctx = kmod_new(NULL, NULL);
+ if (!m->kmod_ctx)
+ return -ENOMEM;
+
m->links = hashmap_new(uint64_hash_func, uint64_compare_func);
if (!m->links)
return -ENOMEM;
free(m->state_file);
+ kmod_unref(m->kmod_ctx);
udev_monitor_unref(m->udev_monitor);
udev_unref(m->udev);
sd_bus_unref(m->bus);
}
}
+ 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) {