in dissociated-ipc/ucx_utils.cc [29:73]
arrow::Result<size_t> to_sockaddr(const std::string& host, const int32_t port,
struct sockaddr_storage* addr) {
if (host.empty()) {
return arrow::Status::Invalid("Must provide a host");
} else if (port < 0) {
return arrow::Status::Invalid("Must provide a port");
}
std::memset(addr, 0, sizeof(*addr));
struct addrinfo* info = nullptr;
int err = getaddrinfo(host.c_str(), /*service*/ nullptr, /*hints*/ nullptr, &info);
if (err != 0) {
if (err == EAI_SYSTEM) {
return arrow::internal::IOErrorFromErrno(errno, "[getaddrinfo] Failure resolving ",
host);
} else {
return arrow::Status::IOError("[getaddrinfo] Failure resolving ", host, ": ",
gai_strerror(err));
}
}
struct addrinfo* cur_info = info;
while (cur_info) {
if (cur_info->ai_family != AF_INET && cur_info->ai_family != AF_INET6) {
cur_info = cur_info->ai_next;
continue;
}
std::memcpy(addr, cur_info->ai_addr, cur_info->ai_addrlen);
if (cur_info->ai_family == AF_INET) {
reinterpret_cast<sockaddr_in*>(addr)->sin_port = htons(port);
} else if (cur_info->ai_family == AF_INET6) {
reinterpret_cast<sockaddr_in6*>(addr)->sin6_port = htons(port);
}
size_t addrlen = cur_info->ai_addrlen;
freeaddrinfo(info);
return addrlen;
}
if (info) freeaddrinfo(info);
return arrow::Status::IOError("[getaddrinfo] Failure resolving ", host,
": no results of a supported family returned");
}