authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-04 03:47:17+01:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-04 03:48:29+01:00
log8fa7635419e557f0fbf5d1ca448a2d753b681740
treef08267698bf8b83943ff2e30c35549ca196bca70
parent26cb72086a5cb34255cc7d1d7447dcc77367aa78

stage1: implement fd_fdstat_get

I thought this might be needed, so may as well keep the implementation.

1 files changed, 13 insertions(+), 4 deletions(-)

stage1/wasi.c+13-4
......@@ -203,7 +203,9 @@ struct DirEntry {
203203static uint32_t fd_len;
204204static struct FileDescriptor {
205205 uint32_t de;
206 enum wasi_fdflags fdflags;
206207 FILE *stream;
208 uint64_t fs_rights_inheriting;
207209} *fds;
208210
209211static void *dupe(const void *data, size_t len) {
......@@ -707,13 +709,17 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u
707709}
708710
709711uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) {
710 (void)fd;
711 (void)res_fdstat;
712 uint8_t *const m = *wasm_memory;
713 struct wasi_fdstat *res_fdstat_ptr = (struct wasi_fdstat *)&m[res_fdstat];
712714#if LOG_TRACE
713715 fprintf(stderr, "wasi_snapshot_preview1_fd_fdstat_get(%u)\n", fd);
714716#endif
715717
716 panic("unimplemented");
718 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
719 res_fdstat_ptr->fs_filetype = des[fds[fd].de].filetype;
720 res_fdstat_ptr->fs_flags = fds[fd].fdflags;
721 res_fdstat_ptr->padding = 0;
722 res_fdstat_ptr->fs_rights_inheriting = fds[fd].fs_rights_inheriting;
717723 return wasi_errno_success;
718724}
719725
......@@ -770,7 +776,6 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io
770776uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32_t path, uint32_t path_len, uint32_t oflags, uint64_t fs_rights_base, uint64_t fs_rights_inheriting, uint32_t fdflags, uint32_t res_fd) {
771777 uint8_t *const m = *wasm_memory;
772778 const char *path_ptr = (const char *)&m[path];
773 (void)fs_rights_inheriting;
774779 uint32_t *res_fd_ptr = (uint32_t *)&m[res_fd];
775780#if LOG_TRACE
776781 fprintf(stderr, "wasi_snapshot_preview1_path_open(%u, 0x%X, \"%.*s\", 0x%X, 0x%llX, 0x%llX, 0x%X)\n", fd, dirflags, (int)path_len, path_ptr, oflags, (unsigned long long)fs_rights_base, (unsigned long long)fs_rights_inheriting, fdflags);
......@@ -792,10 +797,12 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
792797 fds = new_fds;
793798
794799 fds[fd_len].de = de;
800 fds[fd_len].fdflags = fdflags;
795801 switch (des[de].filetype) {
796802 case wasi_filetype_directory: fds[fd_len].stream = NULL; break;
797803 default: panic("unimplemented");
798804 }
805 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;
799806
800807#if LOG_TRACE
801808 fprintf(stderr, "fd = %u\n", fd_len);
......@@ -855,7 +862,9 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
855862 fprintf(stderr, "fd = %u\n", fd_len);
856863#endif
857864 fds[fd_len].de = de;
865 fds[fd_len].fdflags = fdflags;
858866 fds[fd_len].stream = stream;
867 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;
859868 *res_fd_ptr = fd_len;
860869 fd_len += 1;
861870 return wasi_errno_success;