X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-query.c;h=6d77c109b4ec5002c7b4edf16152f2fe9b48b0d0;hp=36cfc026eaf7a67641b25f82c89448f7bbedd7d0;hb=82bd6dddc4a363a9c3c6f41eb46eb171a80dca27;hpb=9a015429b3bbfe1c2802570c1621e73d6cb57ac3 diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 36cfc026e..6d77c109b 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -54,6 +54,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); @@ -156,7 +157,7 @@ static int dns_query_add_transaction(DnsQuery *q, DnsScope *s, DnsResourceKey *k } else question = dns_question_ref(q->question); - t = dns_scope_find_transaction(s, question); + t = dns_scope_find_transaction(s, question, true); if (!t) { r = dns_transaction_new(&t, s, question); if (r < 0) @@ -450,3 +451,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; +}