diff options
-rw-r--r-- | std/wasi/README.md | 2 | ||||
-rw-r--r-- | std/wasi/snapshot_preview1.ts | 13 | ||||
-rw-r--r-- | std/wasi/testdata/std_fs_file_sync_all.rs | 15 |
3 files changed, 28 insertions, 2 deletions
diff --git a/std/wasi/README.md b/std/wasi/README.md index 530a9d827..70149c771 100644 --- a/std/wasi/README.md +++ b/std/wasi/README.md @@ -30,7 +30,7 @@ This module provides an implementation of the WebAssembly System Interface - [ ] fd_readdir - [x] fd_renumber - [x] fd_seek -- [ ] fd_sync +- [x] fd_sync - [x] fd_tell - [x] fd_write - [x] path_create_directory diff --git a/std/wasi/snapshot_preview1.ts b/std/wasi/snapshot_preview1.ts index 4fe4e02b4..e42d7eec2 100644 --- a/std/wasi/snapshot_preview1.ts +++ b/std/wasi/snapshot_preview1.ts @@ -842,7 +842,18 @@ export default class Module { }, fd_sync: (fd: number): number => { - return ERRNO_NOSYS; + const entry = this.fds[fd]; + if (!entry) { + return ERRNO_BADF; + } + + try { + Deno.fsyncSync(entry.handle.rid); + } catch (err) { + return errno(err); + } + + return ERRNO_SUCCESS; }, fd_tell: (fd: number, offset_out: number): number => { diff --git a/std/wasi/testdata/std_fs_file_sync_all.rs b/std/wasi/testdata/std_fs_file_sync_all.rs new file mode 100644 index 000000000..bb7bb34c7 --- /dev/null +++ b/std/wasi/testdata/std_fs_file_sync_all.rs @@ -0,0 +1,15 @@ +// { "preopens": { "/scratch": "scratch" } } + +fn main() { + let file = std::fs::File::create("/scratch/file").unwrap(); + + assert!(file.set_len(5).is_ok()); + assert!(file.sync_all().is_ok()); + let metadata = std::fs::metadata("/scratch/file").unwrap(); + assert_eq!(metadata.len(), 5); + + assert!(file.set_len(25).is_ok()); + assert!(file.sync_all().is_ok()); + let metadata = std::fs::metadata("/scratch/file").unwrap(); + assert_eq!(metadata.len(), 25); +} |