chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
resolved: beef up DNS server configuration logic
[elogind.git]
/
src
/
resolve
/
resolved-dns-server.c
diff --git
a/src/resolve/resolved-dns-server.c
b/src/resolve/resolved-dns-server.c
index 2be81ff1d828fba1e123a82ede456c5628c9d3e4..2c413370ea003a4d2aac8d209d73660fe5f28e7a 100644
(file)
--- a/
src/resolve/resolved-dns-server.c
+++ b/
src/resolve/resolved-dns-server.c
@@
-24,6
+24,7
@@
int dns_server_new(
Manager *m,
DnsServer **ret,
int dns_server_new(
Manager *m,
DnsServer **ret,
+ DnsServerType type,
Link *l,
int family,
const union in_addr_union *in_addr) {
Link *l,
int family,
const union in_addr_union *in_addr) {
@@
-31,26
+32,40
@@
int dns_server_new(
DnsServer *s, *tail;
assert(m);
DnsServer *s, *tail;
assert(m);
+ assert((type == DNS_SERVER_LINK) == !!l);
assert(in_addr);
s = new0(DnsServer, 1);
if (!s)
return -ENOMEM;
assert(in_addr);
s = new0(DnsServer, 1);
if (!s)
return -ENOMEM;
+ s->type = type;
s->family = family;
s->address = *in_addr;
s->family = family;
s->address = *in_addr;
- if (
l
) {
+ if (
type == DNS_SERVER_LINK
) {
LIST_FIND_TAIL(servers, l->dns_servers, tail);
LIST_INSERT_AFTER(servers, l->dns_servers, tail, s);
s->link = l;
LIST_FIND_TAIL(servers, l->dns_servers, tail);
LIST_INSERT_AFTER(servers, l->dns_servers, tail, s);
s->link = l;
- } else {
+ } else
if (type == DNS_SERVER_SYSTEM)
{
LIST_FIND_TAIL(servers, m->dns_servers, tail);
LIST_INSERT_AFTER(servers, m->dns_servers, tail, s);
LIST_FIND_TAIL(servers, m->dns_servers, tail);
LIST_INSERT_AFTER(servers, m->dns_servers, tail, s);
- }
+ } else if (type == DNS_SERVER_FALLBACK) {
+ LIST_FIND_TAIL(servers, m->fallback_dns_servers, tail);
+ LIST_INSERT_AFTER(servers, m->fallback_dns_servers, tail, s);
+ } else
+ assert_not_reached("Unknown server type");
s->manager = m;
s->manager = m;
+ /* A new DNS server that isn't fallback is added and the one
+ * we used so far was a fallback one? Then let's try to pick
+ * the new one */
+ if (type != DNS_SERVER_FALLBACK &&
+ s->manager->current_dns_server &&
+ s->manager->current_dns_server->type == DNS_SERVER_FALLBACK)
+ s->manager->current_dns_server = NULL;
+
if (ret)
*ret = s;
if (ret)
*ret = s;
@@
-62,10
+77,14
@@
DnsServer* dns_server_free(DnsServer *s) {
return NULL;
if (s->manager) {
return NULL;
if (s->manager) {
- if (s->
link
)
+ if (s->
type == DNS_SERVER_LINK
)
LIST_REMOVE(servers, s->link->dns_servers, s);
LIST_REMOVE(servers, s->link->dns_servers, s);
- else
+ else
if (s->type == DNS_SERVER_SYSTEM)
LIST_REMOVE(servers, s->manager->dns_servers, s);
LIST_REMOVE(servers, s->manager->dns_servers, s);
+ else if (s->type == DNS_SERVER_FALLBACK)
+ LIST_REMOVE(servers, s->manager->fallback_dns_servers, s);
+ else
+ assert_not_reached("Unknown server type");
}
if (s->link && s->link->current_dns_server == s)
}
if (s->link && s->link->current_dns_server == s)