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

Method fdPread

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

Source from the content-addressed store, hash-verified

390}
391
392WasiExpect<void> INode::fdPread(Span<Span<uint8_t>> IOVs,
393 __wasi_filesize_t Offset,
394 __wasi_size_t &NRead) const noexcept {
395 iovec SysIOVs[kIOVMax];
396 size_t SysIOVsSize = 0;
397 for (auto &IOV : IOVs) {
398 SysIOVs[SysIOVsSize].iov_base = IOV.data();
399 SysIOVs[SysIOVsSize].iov_len = IOV.size();
400 ++SysIOVsSize;
401 }
402
403#if __GLIBC_PREREQ(2, 10)
404 // Store read bytes length.
405 if (auto Res = ::preadv(Fd, SysIOVs, SysIOVsSize, Offset);
406 unlikely(Res < 0)) {
407 return WasiUnexpect(fromErrNo(errno));
408 } else {
409 NRead = EndianValue(static_cast<__wasi_size_t>(Res)).le();
410 }
411#else
412 const auto OldOffset = ::lseek(Fd, 0, SEEK_CUR);
413 if (OldOffset < 0) {
414 return WasiUnexpect(fromErrNo(errno));
415 }
416 if (::lseek(Fd, Offset, SEEK_SET) < 0 ||
417 ::lseek(Fd, OldOffset, SEEK_SET) < 0) {
418 return WasiUnexpect(fromErrNo(errno));
419 }
420 if (auto Res = ::readv(Fd, SysIOVs, SysIOVsSize); unlikely(Res < 0)) {
421 ::lseek(Fd, OldOffset, SEEK_SET);
422 return WasiUnexpect(fromErrNo(errno));
423 } else {
424 if (::lseek(Fd, OldOffset, SEEK_SET) < 0) {
425 return WasiUnexpect(fromErrNo(errno));
426 }
427 NRead = EndianValue(static_cast<__wasi_size_t>(Res)).le();
428 }
429#endif
430
431 return {};
432}
433
434WasiExpect<void> INode::fdPwrite(Span<Span<const uint8_t>> IOVs,
435 __wasi_filesize_t Offset,

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