X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-server.c;h=30d9c8b34ed90fcccefc7a3ef6549e4acbb5b23e;hb=82bd6dddc4a363a9c3c6f41eb46eb171a80dca27;hp=4e0220b7d855d970185a89cd1a201dc36ab068cc;hpb=74b2466e14a1961bf3ac0e8a60cfaceec705bd59;p=elogind.git diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c index 4e0220b7d..30d9c8b34 100644 --- a/src/resolve/resolved-dns-server.c +++ b/src/resolve/resolved-dns-server.c @@ -24,43 +24,48 @@ int dns_server_new( Manager *m, DnsServer **ret, - DnsServerSource source, + DnsServerType type, Link *l, - unsigned char family, - union in_addr_union *in_addr) { + int family, + const union in_addr_union *in_addr) { DnsServer *s, *tail; assert(m); + assert((type == DNS_SERVER_LINK) == !!l); assert(in_addr); - assert(source < _DNS_SERVER_SOURCE_MAX); s = new0(DnsServer, 1); if (!s) return -ENOMEM; - s->source = source; + s->type = type; s->family = family; s->address = *in_addr; - if (source == DNS_SERVER_LINK) { - assert(l); - LIST_FIND_TAIL(servers, l->link_dns_servers, tail); - LIST_INSERT_AFTER(servers, l->link_dns_servers, tail, s); + 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; - } else if (source == DNS_SERVER_DHCP) { - assert(l); - LIST_FIND_TAIL(servers, l->dhcp_dns_servers, tail); - LIST_INSERT_AFTER(servers, l->dhcp_dns_servers, tail, s); - s->link = l; - } else { - assert(!l); + } else if (type == DNS_SERVER_SYSTEM) { 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; + /* 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) + manager_set_dns_server(s->manager, NULL); + if (ret) *ret = s; @@ -71,26 +76,22 @@ DnsServer* dns_server_free(DnsServer *s) { if (!s) return NULL; - if (s->source == DNS_SERVER_LINK) { - - if (s->link) - LIST_REMOVE(servers, s->link->link_dns_servers, s); - } else if (s->source == DNS_SERVER_DHCP) { - - if (s->link) - LIST_REMOVE(servers, s->link->dhcp_dns_servers, s); - - } else if (s->source == DNS_SERVER_SYSTEM) { - - if (s->manager) + if (s->manager) { + if (s->type == DNS_SERVER_LINK) + LIST_REMOVE(servers, s->link->dns_servers, s); + else if (s->type == DNS_SERVER_SYSTEM) 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) - s->link->current_dns_server = NULL; + link_set_dns_server(s->link, NULL); if (s->manager && s->manager->current_dns_server == s) - s->manager->current_dns_server = NULL; + manager_set_dns_server(s->manager, NULL); free(s);