From 471d40d92fc8e7b452dff99a156f9e0b520ded20 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Wed, 15 Jul 2015 19:22:29 +0200 Subject: resolved: transaction - introduce dns_transaction_emit() This function emits the UDP packet via the scope, but first it will determine the current server (and connect to it) and store the server in the transaction. This should not change the behavior, but simplifies the code. --- src/resolve/resolved-dns-transaction.c | 45 +++++++++++++++------------------- 1 file changed, 20 insertions(+), 25 deletions(-) (limited to 'src/resolve/resolved-dns-transaction.c') diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c index c4e055dfd8..956c2e9973 100644 --- a/src/resolve/resolved-dns-transaction.c +++ b/src/resolve/resolved-dns-transaction.c @@ -460,33 +460,33 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use return 0; } -int transaction_dns_fd(DnsTransaction *t, DnsServer **_server) { - DnsServer *server; +static int dns_transaction_emit(DnsTransaction *t) { int r; assert(t); - assert(t->scope); - assert(t->scope->manager); - if (t->dns_fd >= 0) - return t->dns_fd; + if (t->scope->protocol == DNS_PROTOCOL_DNS && !t->server) { + DnsServer *server = NULL; + _cleanup_close_ int fd = -1; - t->dns_fd = dns_scope_udp_dns_socket(t->scope, &server); - if (t->dns_fd < 0) - return t->dns_fd; + fd = dns_scope_udp_dns_socket(t->scope, &server); + if (fd < 0) + return fd; - r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, t->dns_fd, EPOLLIN, on_dns_packet, t); - if (r < 0) - goto fail; + r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, fd, EPOLLIN, on_dns_packet, t); + if (r < 0) + return r; - if (_server) - *_server = server; + t->dns_fd = fd; + fd = -1; + t->server = dns_server_ref(server); + } - return t->dns_fd; + r = dns_scope_emit(t->scope, t->dns_fd, t->sent); + if (r < 0) + return r; -fail: - t->dns_fd = safe_close(t->dns_fd); - return r; + return 0; } static int on_transaction_timeout(sd_event_source *s, usec_t usec, void *userdata) { @@ -574,7 +574,6 @@ int dns_transaction_go(DnsTransaction *t) { } t->n_attempts++; - t->server = dns_server_unref(t->server); t->received = dns_packet_unref(t->received); t->cached = dns_answer_unref(t->cached); t->cached_rcode = 0; @@ -654,13 +653,9 @@ int dns_transaction_go(DnsTransaction *t) { * always be made via TCP on LLMNR */ r = dns_transaction_open_tcp(t); } else { - DnsServer *server; - /* Try via UDP, and if that fails due to large size try via TCP */ - r = dns_scope_emit(t->scope, t, t->sent, &server); - if (r >= 0) - t->server = dns_server_ref(server); - else if (r == -EMSGSIZE) + r = dns_transaction_emit(t); + if (r == -EMSGSIZE) r = dns_transaction_open_tcp(t); } if (r == -ESRCH) { -- cgit v1.2.3-54-g00ecf