From 8712f3f01a5acaa5426c03fc4510f18985b84b66 Mon Sep 17 00:00:00 2001 From: Bjørn Mork Date: Sat, 4 Mar 2017 21:05:37 +0100 Subject: ripe-atlas-fw: imported version 4750 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bjørn Mork --- libevent-2.0.20-stable/evdns.c | 34 +++++++++++++++++++++++++++++ libevent-2.0.20-stable/include/event2/dns.h | 8 +++++++ 2 files changed, 42 insertions(+) (limited to 'libevent-2.0.20-stable') diff --git a/libevent-2.0.20-stable/evdns.c b/libevent-2.0.20-stable/evdns.c index cf38418..b9110f0 100644 --- a/libevent-2.0.20-stable/evdns.c +++ b/libevent-2.0.20-stable/evdns.c @@ -313,6 +313,8 @@ struct evdns_base { struct event_base *event_base; + char *interface_name; + /* The number of good nameservers that we have */ int global_good_nameservers; @@ -2475,6 +2477,16 @@ _evdns_nameserver_add_impl(struct evdns_base *base, const struct sockaddr *addre ns->socket = socket(address->sa_family, SOCK_DGRAM, 0); if (ns->socket < 0) { err = 1; goto out1; } + if (ns->base->interface_name) + { + if (setsockopt(ns->socket, SOL_SOCKET, SO_BINDTODEVICE, + ns->base->interface_name, + strlen(ns->base->interface_name)+1) == -1) + { + err= 2; + goto out2; + } + } evutil_make_socket_closeonexec(ns->socket); evutil_make_socket_nonblocking(ns->socket); @@ -3967,6 +3979,12 @@ evdns_base_free_and_unlock(struct evdns_base *base, int fail_requests) base->server_head = NULL; base->global_good_nameservers = 0; + if (base->interface_name) + { + free(base->interface_name); + base->interface_name= NULL; + } + if (base->global_search_state) { for (dom = base->global_search_state->head; dom; dom = dom_next) { dom_next = dom->next; @@ -3999,6 +4017,22 @@ evdns_base_free(struct evdns_base *base, int fail_requests) evdns_base_free_and_unlock(base, fail_requests); } +int evdns_base_set_interface(struct evdns_base *base, char *interface_name) +{ + if (base->interface_name) + { + free(base->interface_name); + base->interface_name= NULL; + } + if (!interface_name) + return 0; + + base->interface_name= strdup(interface_name); + if (!base->interface_name) + return -1; + return 0; +} + void evdns_shutdown(int fail_requests) { diff --git a/libevent-2.0.20-stable/include/event2/dns.h b/libevent-2.0.20-stable/include/event2/dns.h index ca0da3c..797d3f9 100644 --- a/libevent-2.0.20-stable/include/event2/dns.h +++ b/libevent-2.0.20-stable/include/event2/dns.h @@ -230,6 +230,14 @@ struct evdns_base * evdns_base_new(struct event_base *event_base, int initialize */ void evdns_base_free(struct evdns_base *base, int fail_requests); +/** + Set the outging interface to be used for DNS queries + + @param base the evdns base to modify + @param interface_name the name of the interface to be used + */ +int evdns_base_set_interface(struct evdns_base *base, char *interface_name); + /** Convert a DNS error code to a string. -- cgit v1.2.3