diff --git a/src/crystal/system/addrinfo.cr b/src/crystal/system/addrinfo.cr index def7a432ce54..566ded640190 100644 --- a/src/crystal/system/addrinfo.cr +++ b/src/crystal/system/addrinfo.cr @@ -13,6 +13,19 @@ module Crystal::System::Addrinfo # def self.next_addrinfo(addrinfo : Handle) : Handle # def self.free_addrinfo(addrinfo : Handle) + + def self.getaddrinfo(domain, service, family, type, protocol, timeout, & : ::Socket::Addrinfo ->) + addrinfo = root = getaddrinfo(domain, service, family, type, protocol, timeout) + + begin + while addrinfo + yield ::Socket::Addrinfo.new(addrinfo) + addrinfo = next_addrinfo(addrinfo) + end + ensure + free_addrinfo(root) + end + end end {% if flag?(:wasi) %} diff --git a/src/socket/addrinfo.cr b/src/socket/addrinfo.cr index e527c5f6cd38..cdf55c912601 100644 --- a/src/socket/addrinfo.cr +++ b/src/socket/addrinfo.cr @@ -133,15 +133,8 @@ class Socket # > encoding [RFC3490] prior to name lookup. domain = URI::Punycode.to_ascii domain - addrinfo = root = Crystal::System::Addrinfo.getaddrinfo(domain, service, family, type, protocol, timeout) - - begin - while addrinfo - yield new(addrinfo) - addrinfo = Crystal::System::Addrinfo.next_addrinfo(addrinfo) - end - ensure - Crystal::System::Addrinfo.free_addrinfo(root) + Crystal::System::Addrinfo.getaddrinfo(domain, service, family, type, protocol, timeout) do |addrinfo| + yield addrinfo end end