diff --git a/Userland/Libraries/LibWasm/WASI/Wasi.cpp b/Userland/Libraries/LibWasm/WASI/Wasi.cpp index 0a703eeadf..911c0823ce 100644 --- a/Userland/Libraries/LibWasm/WASI/Wasi.cpp +++ b/Userland/Libraries/LibWasm/WASI/Wasi.cpp @@ -760,6 +760,24 @@ ErrorOr> Implementation::impl$random_get(Configuration& configurati return Result {}; } +ErrorOr> Implementation::impl$fd_read(Configuration& configuration, FD fd, Pointer iovs, Size iovs_len) +{ + auto mapped_fd = map_fd(fd); + if (!mapped_fd.has()) + return errno_value_from_errno(EBADF); + + u32 fd_value = mapped_fd.get(); + Size bytes_read = 0; + for (auto& iovec : TRY(copy_typed_array(configuration, iovs, iovs_len))) { + auto slice = TRY(slice_typed_memory(configuration, iovec.buf, iovec.buf_len)); + auto result = read(fd_value, slice.data(), slice.size()); + if (result < 0) + return errno_value_from_errno(errno); + bytes_read += static_cast(result); + } + return bytes_read; +} + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -777,7 +795,6 @@ ErrorOr> Implementation::impl$fd_filestat_set_size(Configuration&, ErrorOr> Implementation::impl$fd_filestat_set_times(Configuration&, FD, Timestamp atim, Timestamp mtim, FSTFlags) { return Errno::NoSys; } ErrorOr> Implementation::impl$fd_pread(Configuration&, FD, Pointer iovs, Size iovs_len, FileSize offset) { return Errno::NoSys; } ErrorOr> Implementation::impl$fd_pwrite(Configuration&, FD, Pointer iovs, Size iovs_len, FileSize offset) { return Errno::NoSys; } -ErrorOr> Implementation::impl$fd_read(Configuration&, FD, Pointer iovs, Size iovs_len) { return Errno::NoSys; } ErrorOr> Implementation::impl$fd_readdir(Configuration&, FD, Pointer buf, Size buf_len, DirCookie cookie) { return Errno::NoSys; } ErrorOr> Implementation::impl$fd_renumber(Configuration&, FD from, FD to) { return Errno::NoSys; } ErrorOr> Implementation::impl$fd_seek(Configuration&, FD, FileDelta offset, Whence whence) { return Errno::NoSys; }