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

Method fdPwrite

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

Source from the content-addressed store, hash-verified

432}
433
434WasiExpect<void> INode::fdPwrite(Span<Span<const uint8_t>> IOVs,
435 __wasi_filesize_t Offset,
436 __wasi_size_t &NWritten) const noexcept {
437 iovec SysIOVs[kIOVMax];
438 size_t SysIOVsSize = 0;
439 for (auto &IOV : IOVs) {
440 SysIOVs[SysIOVsSize].iov_base = const_cast<uint8_t *>(IOV.data());
441 SysIOVs[SysIOVsSize].iov_len = IOV.size();
442 ++SysIOVsSize;
443 }
444
445#if __GLIBC_PREREQ(2, 10)
446 if (auto Res = ::pwritev(Fd, SysIOVs, SysIOVsSize, Offset);
447 unlikely(Res < 0)) {
448 return WasiUnexpect(fromErrNo(errno));
449 } else {
450 NWritten = EndianValue(static_cast<__wasi_size_t>(Res)).le();
451 }
452#else
453 const auto OldOffset = ::lseek(Fd, 0, SEEK_CUR);
454 if (OldOffset < 0) {
455 return WasiUnexpect(fromErrNo(errno));
456 }
457 if (::lseek(Fd, Offset, SEEK_SET) < 0 ||
458 ::lseek(Fd, OldOffset, SEEK_SET) < 0) {
459 return WasiUnexpect(fromErrNo(errno));
460 }
461 if (auto Res = ::writev(Fd, SysIOVs, SysIOVsSize); unlikely(Res < 0)) {
462 ::lseek(Fd, OldOffset, SEEK_SET);
463 return WasiUnexpect(fromErrNo(errno));
464 } else {
465 if (::lseek(Fd, OldOffset, SEEK_SET) < 0) {
466 return WasiUnexpect(fromErrNo(errno));
467 }
468 NWritten = EndianValue(static_cast<__wasi_size_t>(Res)).le();
469 }
470#endif
471
472 return {};
473}
474
475WasiExpect<void> INode::fdRead(Span<Span<uint8_t>> IOVs,
476 __wasi_size_t &NRead) const noexcept {

Callers

nothing calls this directly

Calls 7

unlikelyFunction · 0.85
WasiUnexpectFunction · 0.85
EndianValueClass · 0.85
leMethod · 0.80
fromErrNoFunction · 0.70
dataMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected