diff --git a/lib/wasix/src/syscalls/wasi/fd_seek.rs b/lib/wasix/src/syscalls/wasi/fd_seek.rs index 65d60514933..527ed185dcd 100644 --- a/lib/wasix/src/syscalls/wasi/fd_seek.rs +++ b/lib/wasix/src/syscalls/wasi/fd_seek.rs @@ -62,6 +62,9 @@ pub(crate) fn fd_seek_internal( if !fd_entry.rights.contains(Rights::FD_SEEK) { return Ok(Err(Errno::Access)); } + if fd_entry.flags.contains(Fdflags::APPEND) { + return Ok(Ok(fd_entry.offset.load(Ordering::Acquire))); + } // TODO: handle case if fd is a dir? let new_offset = match whence { diff --git a/tests/wasi-fyi/fs_seek_append_mode.rs b/tests/wasi-fyi/fs_seek_append_mode.rs new file mode 100644 index 00000000000..7e1d54321f0 --- /dev/null +++ b/tests/wasi-fyi/fs_seek_append_mode.rs @@ -0,0 +1,24 @@ +use std::fs::OpenOptions; +use std::io::prelude::*; +use std::io::SeekFrom; + +fn main() { + let mut file = OpenOptions::new() + .append(true) + .read(true) + .create(true) + .open("file") + .unwrap(); + + // file offset must be 1 now + write!(file, "{}", "a").unwrap(); + + // rewind should not work on file in append mode + // since the offset must always be at the end of the file + let _ = file.rewind(); + + // file offset must be 2 now + write!(file, "{}", "b").unwrap(); + + assert_eq!(file.seek(SeekFrom::Current(0)).unwrap(), 2); +}