| 814 | } |
| 815 | |
| 816 | WasiExpect<void> INode::getAddrinfo(std::string_view Node, |
| 817 | std::string_view Service, |
| 818 | const __wasi_addrinfo_t &Hint, |
| 819 | uint32_t MaxResLength, |
| 820 | Span<__wasi_addrinfo_t *> WasiAddrinfoArray, |
| 821 | Span<__wasi_sockaddr_t *> WasiSockaddrArray, |
| 822 | Span<char *> AiAddrSaDataArray, |
| 823 | Span<char *> AiCanonnameArray, |
| 824 | /*Out*/ __wasi_size_t &ResLength) noexcept { |
| 825 | const auto [NodeCStr, NodeBuf] = createNullTerminatedString(Node); |
| 826 | const auto [ServiceCStr, ServiceBuf] = createNullTerminatedString(Service); |
| 827 | |
| 828 | struct addrinfo SysHint; |
| 829 | SysHint.ai_flags = toAIFlags(Hint.ai_flags); |
| 830 | SysHint.ai_family = toAddressFamily(Hint.ai_family); |
| 831 | SysHint.ai_socktype = toSockType(Hint.ai_socktype); |
| 832 | SysHint.ai_protocol = toProtocol(Hint.ai_protocol); |
| 833 | SysHint.ai_addrlen = Hint.ai_addrlen; |
| 834 | SysHint.ai_addr = nullptr; |
| 835 | SysHint.ai_canonname = nullptr; |
| 836 | SysHint.ai_next = nullptr; |
| 837 | |
| 838 | struct addrinfo *SysResPtr = nullptr; |
| 839 | if (auto Res = ::getaddrinfo(NodeCStr, ServiceCStr, &SysHint, &SysResPtr); |
| 840 | unlikely(Res < 0)) { |
| 841 | return WasiUnexpect(fromEAIErrNo(Res)); |
| 842 | } |
| 843 | // calculate ResLength |
| 844 | if (ResLength = calculateAddrinfoLinkedListSize(SysResPtr); |
| 845 | ResLength > MaxResLength) { |
| 846 | ResLength = MaxResLength; |
| 847 | } |
| 848 | |
| 849 | struct addrinfo *SysResItem = SysResPtr; |
| 850 | for (uint32_t Idx = 0; Idx < ResLength; Idx++) { |
| 851 | auto &CurAddrinfo = WasiAddrinfoArray[Idx]; |
| 852 | CurAddrinfo->ai_flags = fromAIFlags(SysResItem->ai_flags); |
| 853 | CurAddrinfo->ai_socktype = fromSockType(SysResItem->ai_socktype); |
| 854 | CurAddrinfo->ai_protocol = fromProtocol(SysResItem->ai_protocol); |
| 855 | CurAddrinfo->ai_family = fromAddressFamily(SysResItem->ai_family); |
| 856 | CurAddrinfo->ai_addrlen = SysResItem->ai_addrlen; |
| 857 | |
| 858 | // process ai_canonname in addrinfo |
| 859 | if (SysResItem->ai_canonname != nullptr) { |
| 860 | CurAddrinfo->ai_canonname_len = std::strlen(SysResItem->ai_canonname); |
| 861 | auto &CurAiCanonname = AiCanonnameArray[Idx]; |
| 862 | std::memcpy(CurAiCanonname, SysResItem->ai_canonname, |
| 863 | CurAddrinfo->ai_canonname_len + 1); |
| 864 | } else { |
| 865 | CurAddrinfo->ai_canonname_len = 0; |
| 866 | } |
| 867 | |
| 868 | // process socket address |
| 869 | if (SysResItem->ai_addrlen > 0) { |
| 870 | auto &CurSockaddr = WasiSockaddrArray[Idx]; |
| 871 | CurSockaddr->sa_family = |
| 872 | fromAddressFamily(SysResItem->ai_addr->sa_family); |
| 873 |
nothing calls this directly
no test coverage detected