| ... | @@ -203,7 +203,9 @@ struct DirEntry { | ... | @@ -203,7 +203,9 @@ struct DirEntry { |
| 203 | static uint32_t fd_len; | 203 | static uint32_t fd_len; |
| 204 | static struct FileDescriptor { | 204 | static struct FileDescriptor { |
| 205 | uint32_t de; | 205 | uint32_t de; |
| | 206 | enum wasi_fdflags fdflags; |
| 206 | FILE *stream; | 207 | FILE *stream; |
| | 208 | uint64_t fs_rights_inheriting; |
| 207 | } *fds; | 209 | } *fds; |
| 208 | | 210 | |
| 209 | static void *dupe(const void *data, size_t len) { | 211 | static 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 | ... | @@ -707,13 +709,17 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u |
| 707 | } | 709 | } |
| 708 | | 710 | |
| 709 | uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) { | 711 | uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) { |
| 710 | (void)fd; | 712 | uint8_t *const m = *wasm_memory; |
| 711 | (void)res_fdstat; | 713 | struct wasi_fdstat *res_fdstat_ptr = (struct wasi_fdstat *)&m[res_fdstat]; |
| 712 | #if LOG_TRACE | 714 | #if LOG_TRACE |
| 713 | fprintf(stderr, "wasi_snapshot_preview1_fd_fdstat_get(%u)\n", fd); | 715 | fprintf(stderr, "wasi_snapshot_preview1_fd_fdstat_get(%u)\n", fd); |
| 714 | #endif | 716 | #endif |
| 715 | | 717 | |
| 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; |
| 717 | return wasi_errno_success; | 723 | return wasi_errno_success; |
| 718 | } | 724 | } |
| 719 | | 725 | |
| ... | @@ -770,7 +776,6 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io | ... | @@ -770,7 +776,6 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io |
| 770 | uint32_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) { | 776 | uint32_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) { |
| 771 | uint8_t *const m = *wasm_memory; | 777 | uint8_t *const m = *wasm_memory; |
| 772 | const char *path_ptr = (const char *)&m[path]; | 778 | const char *path_ptr = (const char *)&m[path]; |
| 773 | (void)fs_rights_inheriting; | | |
| 774 | uint32_t *res_fd_ptr = (uint32_t *)&m[res_fd]; | 779 | uint32_t *res_fd_ptr = (uint32_t *)&m[res_fd]; |
| 775 | #if LOG_TRACE | 780 | #if LOG_TRACE |
| 776 | 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); | 781 | 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 | ... | @@ -792,10 +797,12 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 792 | fds = new_fds; | 797 | fds = new_fds; |
| 793 | | 798 | |
| 794 | fds[fd_len].de = de; | 799 | fds[fd_len].de = de; |
| | 800 | fds[fd_len].fdflags = fdflags; |
| 795 | switch (des[de].filetype) { | 801 | switch (des[de].filetype) { |
| 796 | case wasi_filetype_directory: fds[fd_len].stream = NULL; break; | 802 | case wasi_filetype_directory: fds[fd_len].stream = NULL; break; |
| 797 | default: panic("unimplemented"); | 803 | default: panic("unimplemented"); |
| 798 | } | 804 | } |
| | 805 | fds[fd_len].fs_rights_inheriting = fs_rights_inheriting; |
| 799 | | 806 | |
| 800 | #if LOG_TRACE | 807 | #if LOG_TRACE |
| 801 | fprintf(stderr, "fd = %u\n", fd_len); | 808 | 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 | ... | @@ -855,7 +862,9 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 855 | fprintf(stderr, "fd = %u\n", fd_len); | 862 | fprintf(stderr, "fd = %u\n", fd_len); |
| 856 | #endif | 863 | #endif |
| 857 | fds[fd_len].de = de; | 864 | fds[fd_len].de = de; |
| | 865 | fds[fd_len].fdflags = fdflags; |
| 858 | fds[fd_len].stream = stream; | 866 | fds[fd_len].stream = stream; |
| | 867 | fds[fd_len].fs_rights_inheriting = fs_rights_inheriting; |
| 859 | *res_fd_ptr = fd_len; | 868 | *res_fd_ptr = fd_len; |
| 860 | fd_len += 1; | 869 | fd_len += 1; |
| 861 | return wasi_errno_success; | 870 | return wasi_errno_success; |