| 1869 | } |
| 1870 | |
| 1871 | WasiExpect<void> INode::sockSendTo(Span<Span<const uint8_t>> SiData, |
| 1872 | __wasi_siflags_t, |
| 1873 | __wasi_address_family_t AddressFamily, |
| 1874 | Span<const uint8_t> Address, uint16_t Port, |
| 1875 | __wasi_size_t &NWritten) const noexcept { |
| 1876 | EXPECTED_TRY(detail::ensureWSAStartup()); |
| 1877 | |
| 1878 | std::size_t TotalBufSize = 0; |
| 1879 | for (auto &IOV : SiData) { |
| 1880 | TotalBufSize += IOV.size(); |
| 1881 | } |
| 1882 | std::vector<uint8_t> TotalBuf(TotalBufSize); |
| 1883 | Span<uint8_t> TotalBufView(TotalBuf); |
| 1884 | for (auto &IOV : SiData) { |
| 1885 | std::copy_n(IOV.begin(), IOV.size(), TotalBufView.begin()); |
| 1886 | TotalBufView = TotalBufView.subspan(IOV.size()); |
| 1887 | } |
| 1888 | assuming(TotalBufView.empty()); |
| 1889 | |
| 1890 | Variant<sockaddr, sockaddr_in, sockaddr_in6> ClientAddr; |
| 1891 | socklen_t MsgNameLen = 0; |
| 1892 | |
| 1893 | if (AddressFamily == __WASI_ADDRESS_FAMILY_INET4) { |
| 1894 | auto &ClientAddr4 = ClientAddr.emplace<sockaddr_in>(); |
| 1895 | MsgNameLen = sizeof(ClientAddr4); |
| 1896 | |
| 1897 | ClientAddr4.sin_family = AF_INET; |
| 1898 | ClientAddr4.sin_port = htons(Port); |
| 1899 | assuming(Address.size() >= sizeof(in_addr)); |
| 1900 | std::memcpy(&ClientAddr4.sin_addr, Address.data(), sizeof(in_addr)); |
| 1901 | } else if (AddressFamily == __WASI_ADDRESS_FAMILY_INET6) { |
| 1902 | auto &ClientAddr6 = ClientAddr.emplace<sockaddr_in6>(); |
| 1903 | MsgNameLen = sizeof(ClientAddr6); |
| 1904 | |
| 1905 | ClientAddr6.sin6_family = AF_INET6; |
| 1906 | ClientAddr6.sin6_flowinfo = 0; |
| 1907 | ClientAddr6.sin6_port = htons(Port); |
| 1908 | assuming(Address.size() >= sizeof(in6_addr)); |
| 1909 | std::memcpy(&ClientAddr6.sin6_addr, Address.data(), sizeof(in6_addr)); |
| 1910 | } |
| 1911 | |
| 1912 | const int SysSiFlags = 0; |
| 1913 | |
| 1914 | if (auto Res = sendto(Socket, reinterpret_cast<char *>(TotalBuf.data()), |
| 1915 | static_cast<int>(TotalBufSize), SysSiFlags, |
| 1916 | MsgNameLen == 0 ? nullptr : &ClientAddr.get<sockaddr>(), |
| 1917 | MsgNameLen); |
| 1918 | unlikely(Res == SOCKET_ERROR_)) { |
| 1919 | return WasiUnexpect(detail::fromWSALastError()); |
| 1920 | } else { |
| 1921 | NWritten = static_cast<__wasi_size_t>(Res); |
| 1922 | } |
| 1923 | |
| 1924 | return {}; |
| 1925 | } |
| 1926 | |
| 1927 | WasiExpect<void> INode::sockShutdown(__wasi_sdflags_t SdFlags) const noexcept { |
| 1928 | EXPECTED_TRY(detail::ensureWSAStartup()); |
no test coverage detected