diff --git a/src/hostcalls/fs.rs b/src/hostcalls/fs.rs index b75617b183..949c183156 100644 --- a/src/hostcalls/fs.rs +++ b/src/hostcalls/fs.rs @@ -340,15 +340,19 @@ pub fn fd_tell( trace!("fd_tell(fd={:?}, newoffset={:#x?})", fd, newoffset); let fd = dec_fd(fd); - let fd = match wasi_ctx + let mut fd = match wasi_ctx .get_fd_entry(fd, host::__WASI_RIGHT_FD_TELL, 0) .and_then(|fe| fe.fd_object.descriptor.as_file()) { Ok(f) => f, Err(e) => return return_enc_errno(e), }; - let host_offset = match hostcalls_impl::fd_tell(fd) { - Ok(host_offset) => host_offset, + + let host_offset = match fd + .seek(SeekFrom::Current(0)) + .map_err(|err| err.raw_os_error().map_or(host::__WASI_EIO, errno_from_host)) + { + Ok(offset) => offset, Err(e) => return return_enc_errno(e), }; diff --git a/src/sys/unix/hostcalls_impl/fs.rs b/src/sys/unix/hostcalls_impl/fs.rs index 9d3d9bc253..a3942a7aa9 100644 --- a/src/sys/unix/hostcalls_impl/fs.rs +++ b/src/sys/unix/hostcalls_impl/fs.rs @@ -27,14 +27,6 @@ pub(crate) fn fd_pwrite(file: &File, buf: &[u8], offset: host::__wasi_filesize_t .map_err(|e| e.raw_os_error().map_or(host::__WASI_EIO, errno_from_host)) } -pub(crate) fn fd_tell(file: &File) -> Result { - use nix::unistd::{lseek, Whence}; - match lseek(file.as_raw_fd(), 0, Whence::SeekCur) { - Ok(newoffset) => Ok(newoffset as u64), - Err(e) => Err(host_impl::errno_from_nix(e.as_errno().unwrap())), - } -} - pub(crate) fn fd_fdstat_get(fd: &File) -> Result { use nix::fcntl::{fcntl, OFlag, F_GETFL}; match fcntl(fd.as_raw_fd(), F_GETFL).map(OFlag::from_bits_truncate) { diff --git a/src/sys/windows/hostcalls_impl/fs.rs b/src/sys/windows/hostcalls_impl/fs.rs index b696694ce0..c2d6ffe743 100644 --- a/src/sys/windows/hostcalls_impl/fs.rs +++ b/src/sys/windows/hostcalls_impl/fs.rs @@ -46,10 +46,6 @@ pub(crate) fn fd_pwrite(file: &File, buf: &[u8], offset: host::__wasi_filesize_t .map_err(|err| err.raw_os_error().map_or(host::__WASI_EIO, errno_from_host)) } -pub(crate) fn fd_tell(file: &File) -> Result { - unimplemented!("fd_tell") -} - pub(crate) fn fd_fdstat_get(fd: &File) -> Result { use winx::file::AccessRight; match winx::file::get_file_access_rights(fd.as_raw_handle())