diff --git a/net/utils.cpp b/net/utils.cpp index e3fcbbb2..fcbf0cd4 100644 --- a/net/utils.cpp +++ b/net/utils.cpp @@ -268,6 +268,7 @@ class DefaultResolver : public Resolver { }; IPAddr do_resolve(std::string_view host, Delegate filter) { auto ctr = [&]() -> IPAddrList* { +<<<<<<< HEAD auto addrs = new IPAddrList(); photon::semaphore sem; std::thread([&]() { @@ -293,6 +294,33 @@ class DefaultResolver : public Resolver { }).detach(); sem.wait(1, resolve_timeout_); return addrs; +======= + std::unique_ptr addrs(new IPAddrList()); + auto ctx = std::make_shared(); + ctx->addrs = addrs.get(); + ctx->host = std::string(host); + ctx->filter = filter; + std::thread([ctx]() { + auto cb = [&](IPAddr addr) -> int { + SCOPED_LOCK(ctx->lock); + if (ctx->filter && !ctx->filter.fire(addr)) return 0; + if (ctx->addrs) { + ctx->addrs->push_back(new IPAddrNode(addr)); + } + return 0; + }; + _gethostbyname(ctx->host, cb); + ctx->sem.signal(1); + }).detach(); + ctx->sem.wait(1, resolve_timeout_); + SCOPED_LOCK(ctx->lock); + ctx->addrs = nullptr; + ctx->filter = {}; + if (addrs->empty()) { + return nullptr; + } + return addrs.release(); +>>>>>>> ba6d32b (Simplify do_resolver) }; auto ips = dnscache_.borrow(host, ctr); if (ips->empty()) LOG_ERRNO_RETURN(0, IPAddr(), "Domain resolution for '`' failed", host);