arrow::Result to_sockaddr()

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");
}