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_set_len.rs17
3 files changed, 30 insertions, 2 deletions
diff --git a/std/wasi/README.md b/std/wasi/README.md
index 6b89db1de..530a9d827 100644
--- a/std/wasi/README.md
+++ b/std/wasi/README.md
@@ -20,7 +20,7 @@ This module provides an implementation of the WebAssembly System Interface
- [ ] fd_fdstat_set_flags
- [ ] fd_fdstat_set_rights
- [x] fd_filestat_get
-- [ ] fd_filestat_set_size
+- [x] fd_filestat_set_size
- [x] fd_filestat_set_times
- [x] fd_pread
- [x] fd_prestat_get
diff --git a/std/wasi/snapshot_preview1.ts b/std/wasi/snapshot_preview1.ts
index d52b81635..4fe4e02b4 100644
--- a/std/wasi/snapshot_preview1.ts
+++ b/std/wasi/snapshot_preview1.ts
@@ -607,7 +607,18 @@ export default class Module {
},
fd_filestat_set_size: (fd: number, size: bigint): number => {
- return ERRNO_NOSYS;
+ const entry = this.fds[fd];
+ if (!entry) {
+ return ERRNO_BADF;
+ }
+
+ try {
+ Deno.ftruncateSync(entry.handle.rid, Number(size));
+ } catch (err) {
+ return errno(err);
+ }
+
+ return ERRNO_SUCCESS;
},
fd_filestat_set_times: (
diff --git a/std/wasi/testdata/std_fs_file_set_len.rs b/std/wasi/testdata/std_fs_file_set_len.rs
new file mode 100644
index 000000000..27f1054c7
--- /dev/null
+++ b/std/wasi/testdata/std_fs_file_set_len.rs
@@ -0,0 +1,17 @@
+// { "preopens": { "/scratch": "scratch" } }
+
+fn main() {
+ let file = std::fs::File::create("/scratch/file").unwrap();
+
+ assert!(file.set_len(0).is_ok());
+ assert_eq!(file.metadata().unwrap().len(), 0);
+
+ assert!(file.set_len(5).is_ok());
+ assert_eq!(file.metadata().unwrap().len(), 5);
+
+ assert!(file.set_len(25).is_ok());
+ assert_eq!(file.metadata().unwrap().len(), 25);
+
+ assert!(file.set_len(0).is_ok());
+ assert_eq!(file.metadata().unwrap().len(), 0);
+}