summaryrefslogtreecommitdiff
path: root/data/libevent/darwindns.diff
diff options
context:
space:
mode:
Diffstat (limited to 'data/libevent/darwindns.diff')
-rw-r--r--data/libevent/darwindns.diff108
1 files changed, 108 insertions, 0 deletions
diff --git a/data/libevent/darwindns.diff b/data/libevent/darwindns.diff
new file mode 100644
index 000000000..e751e1805
--- /dev/null
+++ b/data/libevent/darwindns.diff
@@ -0,0 +1,108 @@
+diff -ur libevent-2.1.8-stable/evdns.c libevent-2.1.8-stable+ios/evdns.c
+--- libevent-2.1.8-stable/evdns.c 2017-01-29 07:51:00.000000000 -1000
++++ libevent-2.1.8-stable+ios/evdns.c 2019-10-29 14:49:24.000000000 -1000
+@@ -3896,6 +3896,76 @@
+ }
+ #endif
+
++#ifdef __APPLE__
++#include <dnsinfo.h>
++
++int
++load_nameservers_from_systemconfiguration(struct evdns_base *base)
++{
++ int found = 0;
++
++ ASSERT_LOCKED(base);
++
++ dns_config_t *dns_config = dns_configuration_copy();
++ if (!dns_config) return -1;
++
++ if (dns_config->n_resolver > 0) {
++ for (int i=0; i<dns_config->n_resolver; i++) {
++ // This should probably support domain specific servers but idk how
++ if (dns_config->resolver[i]->domain == NULL) {
++ char buf[1024];
++ for (int j=0; j<dns_config->resolver[i]->n_nameserver; j++) {
++ struct sockaddr *nameserver = dns_config->resolver[i]->nameserver[j];
++ const char *ns = NULL;
++ if (nameserver->sa_family == AF_INET) {
++ ns = inet_ntop(nameserver->sa_family, &((struct sockaddr_in*)nameserver)->sin_addr, buf, 1024);
++ } else if (nameserver->sa_family == AF_INET6) {
++ ns = inet_ntop(nameserver->sa_family, &((struct sockaddr_in6*)nameserver)->sin6_addr, buf, 1024);
++ }
++ if (ns && evdns_base_nameserver_ip_add(base, ns)) {
++ found=1;
++ }
++ }
++ }
++ }
++ }
++ free(dns_config);
++
++ if (found) {
++ log(EVDNS_LOG_DEBUG,"Found nameservers in systemconfiguration");
++ } else {
++ log(EVDNS_LOG_DEBUG,"Didn't find nameservers in systemconfiguration");
++ }
++
++ return found ? 0 : -1;
++}
++
++int
++evdns_base_config_darwin_nameservers(struct evdns_base *base)
++{
++ if (base == NULL)
++ base = current_base;
++ if (base == NULL)
++ return -1;
++ EVDNS_LOCK(base);
++ int r = evdns_base_resolv_conf_parse_impl(base, DNS_OPTIONS_ALL, "/etc/resolv.conf");
++ int r2 = load_nameservers_from_systemconfiguration(base);
++ EVDNS_UNLOCK(base);
++ return (r==-1 && r2==-1)?-1:0;
++}
++
++int
++evdns_config_darwin_nameservers(void)
++{
++ if (!current_base) {
++ current_base = evdns_base_new(NULL, 1);
++ return current_base == NULL ? -1 : 0;
++ } else {
++ return evdns_base_config_darwin_nameservers(current_base);
++ }
++}
++#endif
++
+ struct evdns_base *
+ evdns_base_new(struct event_base *event_base, int flags)
+ {
+@@ -3960,7 +4030,11 @@
+ #ifdef _WIN32
+ r = evdns_base_config_windows_nameservers(base);
+ #else
++#ifdef __APPLE__
++ r = evdns_base_config_darwin_nameservers(base);
++#else
+ r = evdns_base_resolv_conf_parse(base, DNS_OPTIONS_ALL, "/etc/resolv.conf");
++#endif // __APPLE__
+ #endif
+ if (r == -1) {
+ evdns_base_free_and_unlock(base, 0);
+diff -ur libevent-2.1.8-stable/include/event2/dns_compat.h libevent-2.1.8-stable+ios/include/event2/dns_compat.h
+--- libevent-2.1.8-stable/include/event2/dns_compat.h 2016-10-04 09:55:31.000000000 -1000
++++ libevent-2.1.8-stable+ios/include/event2/dns_compat.h 2019-10-29 14:44:10.000000000 -1000
+@@ -329,6 +329,12 @@
+ #define EVDNS_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED
+ #endif
+
++#ifdef __APPLE__
++int load_nameservers_from_systemconfiguration(struct evdns_base *base);
++int evdns_base_config_darwin_nameservers(struct evdns_base *base);
++int evdns_config_darwin_nameservers(void);
++#endif
++
+ #ifdef __cplusplus
+ }
+ #endif