File revert-migrate-to-ares_getaddrinfo.patch of Package nghttp2
diff -ruN a/src/shrpx_dns_resolver.cc b/src/shrpx_dns_resolver.cc
--- a/src/shrpx_dns_resolver.cc 2024-04-04 08:42:44.904336075 +0000
+++ b/src/shrpx_dns_resolver.cc 2024-04-04 10:12:42.783426219 +0000
@@ -55,11 +55,9 @@
} // namespace
namespace {
-void addrinfo_cb(void *arg, int status, int timeouts, ares_addrinfo *result) {
+void host_cb(void *arg, int status, int timeouts, hostent *hostent) {
auto resolv = static_cast<DNSResolver *>(arg);
- resolv->on_result(status, result);
-
- ares_freeaddrinfo(result);
+ resolv->on_result(status, hostent);
}
} // namespace
@@ -175,10 +173,7 @@
channel_ = chan;
status_ = DNSResolverStatus::RUNNING;
- ares_addrinfo_hints hints{};
- hints.ai_family = family_;
-
- ares_getaddrinfo(channel_, name_.c_str(), nullptr, &hints, addrinfo_cb, this);
+ ares_gethostbyname(channel_, name_.c_str(), family_, host_cb, this);
reset_timeout();
return 0;
@@ -290,7 +285,7 @@
void DNSResolver::stop_wev(int fd) { stop_ev(wevs_, loop_, fd, EV_WRITE); }
-void DNSResolver::on_result(int status, ares_addrinfo *ai) {
+void DNSResolver::on_result(int status, hostent *hostent) {
stop_ev(loop_, revs_);
stop_ev(loop_, wevs_);
ev_timer_stop(loop_, &timer_);
@@ -304,35 +299,7 @@
return;
}
- auto ap = ai->nodes;
-
- for (; ap; ap = ap->ai_next) {
- switch (ap->ai_family) {
- case AF_INET:
- status_ = DNSResolverStatus::OK;
- result_.len = sizeof(result_.su.in);
-
- assert(sizeof(result_.su.in) == ap->ai_addrlen);
-
- memcpy(&result_.su.in, ap->ai_addr, sizeof(result_.su.in));
-
- break;
- case AF_INET6:
- status_ = DNSResolverStatus::OK;
- result_.len = sizeof(result_.su.in6);
-
- assert(sizeof(result_.su.in6) == ap->ai_addrlen);
-
- memcpy(&result_.su.in6, ap->ai_addr, sizeof(result_.su.in6));
-
- break;
- default:
- continue;
- }
-
- break;
- }
-
+ auto ap = *hostent->h_addr_list;
if (!ap) {
if (LOG_ENABLED(INFO)) {
LOG(INFO) << "Name lookup for " << name_
@@ -342,6 +309,31 @@
return;
}
+ switch (hostent->h_addrtype) {
+ case AF_INET:
+ status_ = DNSResolverStatus::OK;
+ result_.len = sizeof(result_.su.in);
+ result_.su.in = {};
+ result_.su.in.sin_family = AF_INET;
+#ifdef HAVE_SOCKADDR_IN_SIN_LEN
+ result_.su.in.sin_len = sizeof(result_.su.in);
+#endif // HAVE_SOCKADDR_IN_SIN_LEN
+ memcpy(&result_.su.in.sin_addr, ap, sizeof(result_.su.in.sin_addr));
+ break;
+ case AF_INET6:
+ status_ = DNSResolverStatus::OK;
+ result_.len = sizeof(result_.su.in6);
+ result_.su.in6 = {};
+ result_.su.in6.sin6_family = AF_INET6;
+#ifdef HAVE_SOCKADDR_IN6_SIN6_LEN
+ result_.su.in6.sin6_len = sizeof(result_.su.in6);
+#endif // HAVE_SOCKADDR_IN6_SIN6_LEN
+ memcpy(&result_.su.in6.sin6_addr, ap, sizeof(result_.su.in6.sin6_addr));
+ break;
+ default:
+ assert(0);
+ }
+
if (status_ == DNSResolverStatus::OK) {
if (LOG_ENABLED(INFO)) {
LOG(INFO) << "Name lookup succeeded: " << name_ << " -> "
diff -ruN a/src/shrpx_dns_resolver.h b/src/shrpx_dns_resolver.h
--- a/src/shrpx_dns_resolver.h 2024-04-04 08:42:44.904336075 +0000
+++ b/src/shrpx_dns_resolver.h 2024-04-04 10:12:42.784426210 +0000
@@ -88,7 +88,7 @@
int on_write(int fd);
int on_timeout();
// Calls this function when DNS query finished.
- void on_result(int status, ares_addrinfo *result);
+ void on_result(int status, hostent *hostent);
void reset_timeout();
void start_rev(int fd);