| 1163 | } |
| 1164 | |
| 1165 | WasiExpect<void> INode::sockSendTo(Span<Span<const uint8_t>> SiData, |
| 1166 | __wasi_siflags_t, |
| 1167 | __wasi_address_family_t AddressFamily, |
| 1168 | Span<const uint8_t> Address, uint16_t Port, |
| 1169 | __wasi_size_t &NWritten) const noexcept { |
| 1170 | int SysSiFlags = MSG_NOSIGNAL; |
| 1171 | sockaddr *ClientAddr = nullptr; |
| 1172 | socklen_t MsgNameLen = 0; |
| 1173 | VarAddrT AddressBuffer; |
| 1174 | |
| 1175 | if (Address.size()) { |
| 1176 | AddressBuffer = sockAddressAssignHelper(AddressFamily, Address, Port); |
| 1177 | ClientAddr = std::visit(VarAddrBuf(), AddressBuffer); |
| 1178 | MsgNameLen = std::visit(VarAddrSize(), AddressBuffer); |
| 1179 | } |
| 1180 | |
| 1181 | iovec SysIOVs[kIOVMax]; |
| 1182 | size_t SysIOVsSize = 0; |
| 1183 | for (auto &IOV : SiData) { |
| 1184 | SysIOVs[SysIOVsSize].iov_base = const_cast<uint8_t *>(IOV.data()); |
| 1185 | SysIOVs[SysIOVsSize].iov_len = IOV.size(); |
| 1186 | ++SysIOVsSize; |
| 1187 | } |
| 1188 | |
| 1189 | msghdr SysMsgHdr; |
| 1190 | SysMsgHdr.msg_name = MsgNameLen == 0 ? nullptr : ClientAddr; |
| 1191 | SysMsgHdr.msg_namelen = MsgNameLen; |
| 1192 | SysMsgHdr.msg_iov = SysIOVs; |
| 1193 | SysMsgHdr.msg_iovlen = SysIOVsSize; |
| 1194 | SysMsgHdr.msg_control = nullptr; |
| 1195 | SysMsgHdr.msg_controllen = 0; |
| 1196 | |
| 1197 | // Store recv bytes length and flags. |
| 1198 | if (auto Res = ::sendmsg(Fd, &SysMsgHdr, SysSiFlags); unlikely(Res < 0)) { |
| 1199 | return WasiUnexpect(fromErrNo(errno)); |
| 1200 | } else { |
| 1201 | NWritten = EndianValue(static_cast<__wasi_size_t>(Res)).le(); |
| 1202 | } |
| 1203 | |
| 1204 | return {}; |
| 1205 | } |
| 1206 | |
| 1207 | WasiExpect<void> INode::sockShutdown(__wasi_sdflags_t SdFlags) const noexcept { |
| 1208 | int SysFlags = 0; |
nothing calls this directly
no test coverage detected