summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--std/wasi/README.md2
-rw-r--r--std/wasi/snapshot_preview1.ts13
-rw-r--r--std/wasi/testdata/std_fs_file_sync_all.rs15
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);
+}