Make fd_seek host independent
This commit is contained in:
@@ -7,7 +7,7 @@ use crate::sys::{errno_from_host, host_impl, hostcalls_impl};
|
|||||||
use crate::{host, wasm32};
|
use crate::{host, wasm32};
|
||||||
use log::trace;
|
use log::trace;
|
||||||
use std::convert::identity;
|
use std::convert::identity;
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Seek, SeekFrom, Write};
|
||||||
|
|
||||||
use wasi_common_cbindgen::wasi_common_cbindgen;
|
use wasi_common_cbindgen::wasi_common_cbindgen;
|
||||||
|
|
||||||
@@ -299,7 +299,7 @@ pub fn fd_seek(
|
|||||||
} else {
|
} else {
|
||||||
host::__WASI_RIGHT_FD_SEEK | host::__WASI_RIGHT_FD_TELL
|
host::__WASI_RIGHT_FD_SEEK | host::__WASI_RIGHT_FD_TELL
|
||||||
};
|
};
|
||||||
let fd = match wasi_ctx
|
let mut fd = match wasi_ctx
|
||||||
.get_fd_entry(fd, rights, 0)
|
.get_fd_entry(fd, rights, 0)
|
||||||
.and_then(|fe| fe.fd_object.descriptor.as_file())
|
.and_then(|fe| fe.fd_object.descriptor.as_file())
|
||||||
{
|
{
|
||||||
@@ -307,8 +307,17 @@ pub fn fd_seek(
|
|||||||
Err(e) => return return_enc_errno(e),
|
Err(e) => return return_enc_errno(e),
|
||||||
};
|
};
|
||||||
|
|
||||||
let host_newoffset = match hostcalls_impl::fd_seek(fd, offset, whence) {
|
let pos = match whence {
|
||||||
Ok(host_newoffset) => host_newoffset,
|
host::__WASI_WHENCE_CUR => SeekFrom::Current(offset),
|
||||||
|
host::__WASI_WHENCE_END => SeekFrom::End(offset),
|
||||||
|
host::__WASI_WHENCE_SET => SeekFrom::Start(offset as u64),
|
||||||
|
_ => return return_enc_errno(host::__WASI_EINVAL),
|
||||||
|
};
|
||||||
|
let host_newoffset = match fd
|
||||||
|
.seek(pos)
|
||||||
|
.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),
|
Err(e) => return return_enc_errno(e),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,25 +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))
|
.map_err(|e| e.raw_os_error().map_or(host::__WASI_EIO, errno_from_host))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn fd_seek(
|
|
||||||
file: &File,
|
|
||||||
offset: host::__wasi_filedelta_t,
|
|
||||||
whence: host::__wasi_whence_t,
|
|
||||||
) -> Result<u64> {
|
|
||||||
use nix::unistd::{lseek, Whence};
|
|
||||||
let nwhence = match whence {
|
|
||||||
host::__WASI_WHENCE_CUR => Whence::SeekCur,
|
|
||||||
host::__WASI_WHENCE_END => Whence::SeekEnd,
|
|
||||||
host::__WASI_WHENCE_SET => Whence::SeekSet,
|
|
||||||
_ => return Err(host::__WASI_EINVAL),
|
|
||||||
};
|
|
||||||
|
|
||||||
match lseek(file.as_raw_fd(), offset, nwhence) {
|
|
||||||
Ok(offset) => Ok(offset as u64),
|
|
||||||
Err(e) => Err(host_impl::errno_from_nix(e.as_errno().unwrap())),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn fd_tell(file: &File) -> Result<u64> {
|
pub(crate) fn fd_tell(file: &File) -> Result<u64> {
|
||||||
use nix::unistd::{lseek, Whence};
|
use nix::unistd::{lseek, Whence};
|
||||||
match lseek(file.as_raw_fd(), 0, Whence::SeekCur) {
|
match lseek(file.as_raw_fd(), 0, Whence::SeekCur) {
|
||||||
|
|||||||
@@ -46,14 +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))
|
.map_err(|err| err.raw_os_error().map_or(host::__WASI_EIO, errno_from_host))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn fd_seek(
|
|
||||||
file: &File,
|
|
||||||
offset: host::__wasi_filedelta_t,
|
|
||||||
whence: host::__wasi_whence_t,
|
|
||||||
) -> Result<u64> {
|
|
||||||
unimplemented!("fd_seek")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn fd_tell(file: &File) -> Result<u64> {
|
pub(crate) fn fd_tell(file: &File) -> Result<u64> {
|
||||||
unimplemented!("fd_tell")
|
unimplemented!("fd_tell")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user