aboutsummaryrefslogtreecommitdiff
path: root/libevent-2.0.20-stable
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2017-03-04 21:05:37 +0100
committerBjørn Mork <bjorn@mork.no>2017-03-04 21:05:37 +0100
commit8712f3f01a5acaa5426c03fc4510f18985b84b66 (patch)
tree6753dca376d4520648f31fa448cbab4561756d49 /libevent-2.0.20-stable
parent6937c3f2bd8cf40ce8d2f0d3fea37f076e4ce709 (diff)
ripe-atlas-fw: imported version 47504750
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Diffstat (limited to 'libevent-2.0.20-stable')
-rw-r--r--libevent-2.0.20-stable/evdns.c34
-rw-r--r--libevent-2.0.20-stable/include/event2/dns.h8
2 files changed, 42 insertions, 0 deletions
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
@@ -231,6 +231,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.
@param err the DNS error code