Skip to content

Commit 9359b12

Browse files
authored
fix: implement fd_fdstat_get WASIp1 function (#55)
1 parent d1bd056 commit 9359b12

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

packages/wasi-preview1/src/dataStructure.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ export function writeFilestat(
3535
view.setBigUint64(56, ctim, true);
3636
}
3737

38+
export function writeFdstat(
39+
memory: ArrayBuffer,
40+
ptr: number,
41+
filetype: number,
42+
fs_flags: number,
43+
fs_rights_base: bigint,
44+
fs_rights_inheriting: bigint
45+
) {
46+
const view = new DataView(memory, ptr, 24);
47+
view.setUint8(0, filetype);
48+
view.setUint16(2, fs_flags, true);
49+
view.setBigUint64(8, fs_rights_base, true);
50+
view.setBigUint64(16, fs_rights_inheriting, true);
51+
}
52+
3853
export function generateOneReaddirEntry(
3954
ent: DirEntry,
4055
index: number

packages/wasi-preview1/src/wasi.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as error from "./error.js";
55
import {
66
generateOneReaddirEntry,
77
getFiletypeOfStat,
8+
writeFdstat,
89
writeFilestat,
910
writePrestatDir,
1011
} from "./dataStructure.js";
@@ -304,7 +305,26 @@ export function initWASI(config: WASIConfig): WASIAPI & WASIMeta {
304305
}
305306
},
306307
fd_fdstat_get: (fd, ret_buf) => {
307-
throw new Error("Function not implemented.");
308+
const fdObj = fs.get(fd);
309+
if (fdObj === undefined) {
310+
return error.badf;
311+
}
312+
try {
313+
const stat = fs.stat(fdObj);
314+
// fd_write | path_create_directory | path_open | fd_readdir | path_filestat_get | fd_filestat_get
315+
const fs_flags = 0b0001_0010_0011_0001_0010_0000n;
316+
writeFdstat(
317+
memory(),
318+
ret_buf,
319+
getFiletypeOfStat(stat),
320+
0,
321+
fs_flags,
322+
fs_flags
323+
);
324+
return 0;
325+
} catch (e) {
326+
return handleFsError(e, debug);
327+
}
308328
},
309329
random_get: (buf, buf_len): number => {
310330
crypto.randomFillSync(new Uint8Array(memory(), buf, buf_len));

0 commit comments

Comments
 (0)