diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-08-06 16:32:55 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-08-11 15:06:22 +0200 |
commit | 82bd6dddc4a363a9c3c6f41eb46eb171a80dca27 (patch) | |
tree | 62c653d001a821d5101e312bcc72076acc4ab019 | |
parent | 818f766b12e025683cf4fed12b3da2a025bb0b31 (diff) |
resolved: destroy outstanding queries if the clients that initiated them die
-rw-r--r-- | src/resolve/resolved-bus.c | 12 | ||||
-rw-r--r-- | src/resolve/resolved-dns-query.c | 31 | ||||
-rw-r--r-- | src/resolve/resolved-dns-query.h | 4 |
3 files changed, 47 insertions, 0 deletions
diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 89a9300dfb..6a3343e000 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -319,6 +319,10 @@ static int bus_method_resolve_hostname(sd_bus *bus, sd_bus_message *message, voi q->request_hostname = hostname; q->complete = bus_method_resolve_hostname_complete; + r = dns_query_bus_track(q, bus, message); + if (r < 0) + return r; + r = dns_query_go(q); if (r < 0) { dns_query_free(q); @@ -457,6 +461,10 @@ static int bus_method_resolve_address(sd_bus *bus, sd_bus_message *message, void memcpy(&q->request_address, d, sz); q->complete = bus_method_resolve_address_complete; + r = dns_query_bus_track(q, bus, message); + if (r < 0) + return r; + r = dns_query_go(q); if (r < 0) { dns_query_free(q); @@ -593,6 +601,10 @@ static int bus_method_resolve_record(sd_bus *bus, sd_bus_message *message, void q->request_hostname = name; q->complete = bus_method_resolve_record_complete; + r = dns_query_bus_track(q, bus, message); + if (r < 0) + return r; + r = dns_query_go(q); if (r < 0) { dns_query_free(q); diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index ae285ef112..6d77c109b4 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); @@ -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; +} diff --git a/src/resolve/resolved-dns-query.h b/src/resolve/resolved-dns-query.h index adaf7b2588..50fa3a2fe2 100644 --- a/src/resolve/resolved-dns-query.h +++ b/src/resolve/resolved-dns-query.h @@ -63,6 +63,8 @@ struct DnsQuery { Set *transactions; + sd_bus_track *bus_track; + LIST_FIELDS(DnsQuery, queries); }; @@ -74,4 +76,6 @@ void dns_query_ready(DnsQuery *q); int dns_query_cname_redirect(DnsQuery *q, const char *name); +int dns_query_bus_track(DnsQuery *q, sd_bus *bus, sd_bus_message *m); + DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuery*, dns_query_free); |