X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-query.c;h=d619fae725ba5b1516bee1cff1b9be34c8b5687b;hb=32a568fb90bf0a22a3007fa670305403a5d0bb72;hp=ae285ef112d5dcfeb31365b0dc0c515eeb7191fa;hpb=dc4d47e2c79aafa3ef646e32ff3422c4ce935c1b;p=elogind.git diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index ae285ef11..d619fae72 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -19,10 +19,8 @@ along with systemd; If not, see . ***/ -#include "af-list.h" #include "resolved-dns-query.h" -#include "resolved-dns-domain.h" /* How long to wait for the query in total */ #define QUERY_TIMEOUT_USEC (30 * USEC_PER_SEC) @@ -54,6 +52,7 @@ DnsQuery *dns_query_free(DnsQuery *q) { dns_answer_unref(q->answer); sd_bus_message_unref(q->request); + sd_bus_track_unref(q->bus_track); if (q->manager) { LIST_REMOVE(queries, q->manager->dns_queries, q); @@ -65,7 +64,7 @@ DnsQuery *dns_query_free(DnsQuery *q) { return NULL; } -int dns_query_new(Manager *m, DnsQuery **ret, DnsQuestion *question) { +int dns_query_new(Manager *m, DnsQuery **ret, DnsQuestion *question, int ifindex, uint64_t flags) { _cleanup_(dns_query_freep) DnsQuery *q = NULL; unsigned i; int r; @@ -85,6 +84,8 @@ int dns_query_new(Manager *m, DnsQuery **ret, DnsQuestion *question) { return -ENOMEM; q->question = dns_question_ref(question); + q->ifindex = ifindex; + q->flags = flags; for (i = 0; i < question->n_keys; i++) { _cleanup_free_ char *p; @@ -141,7 +142,7 @@ static int dns_query_add_transaction(DnsQuery *q, DnsScope *s, DnsResourceKey *k assert(q); assert(s); - r = set_ensure_allocated(&q->transactions, NULL, NULL); + r = set_ensure_allocated(&q->transactions, NULL); if (r < 0) return r; @@ -163,7 +164,7 @@ static int dns_query_add_transaction(DnsQuery *q, DnsScope *s, DnsResourceKey *k return r; } - r = set_ensure_allocated(&t->queries, NULL, NULL); + r = set_ensure_allocated(&t->queries, NULL); if (r < 0) goto gc; @@ -232,7 +233,7 @@ int dns_query_go(DnsQuery *q) { LIST_FOREACH(scopes, s, q->manager->dns_scopes) { DnsScopeMatch match; - match = dns_scope_good_domain(s, name); + match = dns_scope_good_domain(s, q->ifindex, q->flags, name); if (match < 0) return match; @@ -262,7 +263,7 @@ int dns_query_go(DnsQuery *q) { LIST_FOREACH(scopes, s, first->scopes_next) { DnsScopeMatch match; - match = dns_scope_good_domain(s, name); + match = dns_scope_good_domain(s, q->ifindex, q->flags, name); if (match < 0) goto fail; @@ -277,6 +278,8 @@ int dns_query_go(DnsQuery *q) { q->answer = dns_answer_unref(q->answer); q->answer_ifindex = 0; q->answer_rcode = 0; + q->answer_family = AF_UNSPEC; + q->answer_protocol = _DNS_PROTOCOL_INVALID; r = sd_event_add_time( q->manager->event, @@ -421,6 +424,8 @@ void dns_query_ready(DnsQuery *q) { q->answer = dns_answer_ref(answer); q->answer_rcode = rcode; q->answer_ifindex = (scope && scope->link) ? scope->link->ifindex : 0; + q->answer_protocol = scope ? scope->protocol : _DNS_PROTOCOL_INVALID; + q->answer_family = scope ? scope->family : AF_UNSPEC; } dns_query_complete(q, state); @@ -450,3 +455,33 @@ int dns_query_cname_redirect(DnsQuery *q, const char *name) { return 0; } + +static int on_bus_track(sd_bus_track *t, void *userdata) { + DnsQuery *q = userdata; + + assert(t); + assert(q); + + log_debug("Client of active query vanished, aborting query."); + dns_query_complete(q, DNS_TRANSACTION_ABORTED); + return 0; +} + +int dns_query_bus_track(DnsQuery *q, sd_bus *bus, sd_bus_message *m) { + int r; + + assert(q); + assert(m); + + if (!q->bus_track) { + r = sd_bus_track_new(bus, &q->bus_track, on_bus_track, q); + if (r < 0) + return r; + } + + r = sd_bus_track_add_sender(q->bus_track, m); + if (r < 0) + return r; + + return 0; +}