MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / getAddrinfo

Method getAddrinfo

lib/host/wasi/inode-linux.cpp:816–895  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

814}
815
816WasiExpect<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

Callers

nothing calls this directly

Calls 13

unlikelyFunction · 0.85
WasiUnexpectFunction · 0.85
toAIFlagsFunction · 0.70
toAddressFamilyFunction · 0.70
toSockTypeFunction · 0.70
toProtocolFunction · 0.70
fromEAIErrNoFunction · 0.70
fromAIFlagsFunction · 0.70
fromSockTypeFunction · 0.70
fromProtocolFunction · 0.70

Tested by

no test coverage detected