| 270 | |
| 271 | template <typename SockSendT> |
| 272 | void writeUntilFull(WasmEdge::Runtime::Instance::MemoryInstance &MemInst, |
| 273 | WasmEdge::Runtime::CallingFrame &CallFrame, |
| 274 | SockSendT &WasiSockSend, int32_t Fd) { |
| 275 | using namespace std::literals; |
| 276 | std::array<WasmEdge::ValVariant, 1> Errno; |
| 277 | while (true) { |
| 278 | const uint32_t IOVecSize = 1; |
| 279 | const uint32_t NWrittenPtr = 0; |
| 280 | const uint32_t RoFlagsPtr = NWrittenPtr + sizeof(__wasi_size_t); |
| 281 | const uint32_t IOVecPtr = RoFlagsPtr + sizeof(__wasi_size_t); |
| 282 | const uint32_t DataPtr = IOVecPtr + sizeof(__wasi_iovec_t) * IOVecSize; |
| 283 | const uint32_t SiFlags = 0; |
| 284 | const auto Data = "somedata"sv; |
| 285 | writeString(MemInst, Data, DataPtr); |
| 286 | auto IOVec = MemInst.getSpan<__wasi_ciovec_t>(IOVecPtr, IOVecSize); |
| 287 | IOVec[0].buf = WasmEdge::EndianValue(DataPtr).le(); |
| 288 | IOVec[0].buf_len = |
| 289 | WasmEdge::EndianValue(static_cast<__wasi_size_t>(Data.size())).le(); |
| 290 | EXPECT_TRUE( |
| 291 | WasiSockSend.run(CallFrame, |
| 292 | std::initializer_list<WasmEdge::ValVariant>{ |
| 293 | Fd, IOVecPtr, IOVecSize, SiFlags, NWrittenPtr}, |
| 294 | Errno)); |
| 295 | if (Errno[0].get<int32_t>() != __WASI_ERRNO_SUCCESS) { |
| 296 | EXPECT_EQ(Errno[0].get<int32_t>(), __WASI_ERRNO_AGAIN); |
| 297 | break; |
| 298 | } |
| 299 | } |
| 300 | } |
| 301 | |
| 302 | } // namespace |
| 303 |
no test coverage detected