summaryrefslogtreecommitdiff
path: root/std/wasi/snapshot_preview1.ts
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2020-06-29 21:34:18 +0800
committerGitHub <noreply@github.com>2020-06-29 09:34:18 -0400
commit06f34a1aed2541866f32438d7bbc75e35c1d5dc3 (patch)
tree0e0b85e08bcdb92aa51370722dfcace31062a363 /std/wasi/snapshot_preview1.ts
parenta690a206790778cf63df876fdeefebc17607e5c8 (diff)
feat(std/wasi) implement fd_filestat_get (#6555)
Diffstat (limited to 'std/wasi/snapshot_preview1.ts')
-rw-r--r--std/wasi/snapshot_preview1.ts71
1 files changed, 70 insertions, 1 deletions
diff --git a/std/wasi/snapshot_preview1.ts b/std/wasi/snapshot_preview1.ts
index 0067499cc..78b29b968 100644
--- a/std/wasi/snapshot_preview1.ts
+++ b/std/wasi/snapshot_preview1.ts
@@ -523,7 +523,76 @@ export default class Module {
},
fd_filestat_get: (fd: number, buf_out: number): number => {
- return ERRNO_NOSYS;
+ const entry = this.fds[fd];
+ if (!entry) {
+ return ERRNO_BADF;
+ }
+
+ const view = new DataView(this.memory.buffer);
+
+ try {
+ const info = Deno.fstatSync(entry.handle.rid);
+
+ if (entry.type === undefined) {
+ switch (true) {
+ case info.isFile:
+ entry.type = FILETYPE_REGULAR_FILE;
+ break;
+
+ case info.isDirectory:
+ entry.type = FILETYPE_DIRECTORY;
+ break;
+
+ case info.isSymlink:
+ entry.type = FILETYPE_SYMBOLIC_LINK;
+ break;
+
+ default:
+ entry.type = FILETYPE_UNKNOWN;
+ break;
+ }
+ }
+
+ view.setBigUint64(buf_out, BigInt(info.dev ? info.dev : 0), true);
+ buf_out += 8;
+
+ view.setBigUint64(buf_out, BigInt(info.ino ? info.ino : 0), true);
+ buf_out += 8;
+
+ view.setUint8(buf_out, entry.type);
+ buf_out += 8;
+
+ view.setUint32(buf_out, Number(info.nlink), true);
+ buf_out += 8;
+
+ view.setBigUint64(buf_out, BigInt(info.size), true);
+ buf_out += 8;
+
+ view.setBigUint64(
+ buf_out,
+ BigInt(info.atime ? info.atime.getTime() * 1e6 : 0),
+ true
+ );
+ buf_out += 8;
+
+ view.setBigUint64(
+ buf_out,
+ BigInt(info.mtime ? info.mtime.getTime() * 1e6 : 0),
+ true
+ );
+ buf_out += 8;
+
+ view.setBigUint64(
+ buf_out,
+ BigInt(info.birthtime ? info.birthtime.getTime() * 1e6 : 0),
+ true
+ );
+ buf_out += 8;
+ } catch (err) {
+ return errno(err);
+ }
+
+ return ERRNO_SUCCESS;
},
fd_filestat_set_size: (fd: number, size: bigint): number => {