diff options
author | Casper Beyer <caspervonb@pm.me> | 2020-06-30 02:36:22 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-29 14:36:22 -0400 |
commit | 3c5459d849502963ee44efc7c3137db6e9fc63b2 (patch) | |
tree | ea3c88234835372fb1a8c0ca83371a3ceed889d9 | |
parent | 4cde7fdc9a52088f8dfe3e23569d6be2faa80d0f (diff) |
feat(std/wasi) implement fd_filestat_set_size (#6558)
-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_set_len.rs | 17 |
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); +} |