in tensorpipe/transport/ibv/utility.cc [128:174]
std::tuple<Error, std::string> lookupAddrForHostname() {
Error error;
std::string hostname;
std::tie(error, hostname) = getHostname();
if (error) {
return std::make_tuple(std::move(error), std::string());
}
AddressInfo info;
std::tie(error, info) = createAddressInfo(std::move(hostname));
if (error) {
return std::make_tuple(std::move(error), std::string());
}
Error firstError;
for (struct addrinfo* rp = info.get(); rp != nullptr; rp = rp->ai_next) {
TP_DCHECK(rp->ai_family == AF_INET || rp->ai_family == AF_INET6);
TP_DCHECK_EQ(rp->ai_socktype, SOCK_STREAM);
TP_DCHECK_EQ(rp->ai_protocol, IPPROTO_TCP);
Sockaddr addr = Sockaddr(rp->ai_addr, rp->ai_addrlen);
Socket socket;
std::tie(error, socket) = Socket::createForFamily(rp->ai_family);
if (!error) {
error = socket.bind(addr);
}
if (error) {
// Record the first binding error we encounter and return that in the end
// if no working address is found, in order to help with debugging.
if (!firstError) {
firstError = error;
}
continue;
}
return std::make_tuple(Error::kSuccess, addr.str());
}
if (firstError) {
return std::make_tuple(std::move(firstError), std::string());
} else {
return std::make_tuple(TP_CREATE_ERROR(NoAddrFoundError), std::string());
}
}