| ... | @@ -184,6 +184,26 @@ enum wasi_whence { | ... | @@ -184,6 +184,26 @@ enum wasi_whence { |
| 184 | wasi_whence_end = 2, | 184 | wasi_whence_end = 2, |
| 185 | }; | 185 | }; |
| 186 | | 186 | |
| | 187 | extern uint16_t load16_align0(const uint8_t *ptr); |
| | 188 | extern uint16_t load16_align1(const uint16_t *ptr); |
| | 189 | extern uint32_t load32_align0(const uint8_t *ptr); |
| | 190 | extern uint32_t load32_align1(const uint16_t *ptr); |
| | 191 | extern uint32_t load32_align2(const uint32_t *ptr); |
| | 192 | extern uint64_t load64_align0(const uint8_t *ptr); |
| | 193 | extern uint64_t load64_align1(const uint16_t *ptr); |
| | 194 | extern uint64_t load64_align2(const uint32_t *ptr); |
| | 195 | extern uint64_t load64_align3(const uint64_t *ptr); |
| | 196 | |
| | 197 | extern void store16_align0(uint8_t *ptr, uint16_t val); |
| | 198 | extern void store16_align1(uint16_t *ptr, uint16_t val); |
| | 199 | extern void store32_align0(uint8_t *ptr, uint32_t val); |
| | 200 | extern void store32_align1(uint16_t *ptr, uint32_t val); |
| | 201 | extern void store32_align2(uint32_t *ptr, uint32_t val); |
| | 202 | extern void store64_align0(uint8_t *ptr, uint64_t val); |
| | 203 | extern void store64_align1(uint16_t *ptr, uint64_t val); |
| | 204 | extern void store64_align2(uint32_t *ptr, uint64_t val); |
| | 205 | extern void store64_align3(uint64_t *ptr, uint64_t val); |
| | 206 | |
| 187 | extern uint8_t **const wasm_memory; | 207 | extern uint8_t **const wasm_memory; |
| 188 | extern void wasm__start(void); | 208 | extern void wasm__start(void); |
| 189 | | 209 | |
| ... | @@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch | ... | @@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch |
| 362 | } | 382 | } |
| 363 | | 383 | |
| 364 | static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) { | 384 | static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) { |
| 365 | res_filestat->dev = 0; | 385 | store64_align3(&res_filestat->dev, 0); |
| 366 | res_filestat->ino = de; | 386 | store64_align3(&res_filestat->ino, de); |
| 367 | res_filestat->filetype = des[de].filetype; | 387 | store64_align3(&res_filestat->filetype, des[de].filetype); |
| 368 | res_filestat->nlink = 1; | 388 | store64_align3(&res_filestat->nlink, 1); |
| 369 | res_filestat->size = 0; | 389 | store64_align3(&res_filestat->size, 0); |
| 370 | res_filestat->atim = des[de].atim * UINT64_C(1000000000); | 390 | store64_align3(&res_filestat->atim, des[de].atim * UINT64_C(1000000000)); |
| 371 | res_filestat->mtim = des[de].mtim * UINT64_C(1000000000); | 391 | store64_align3(&res_filestat->mtim, des[de].mtim * UINT64_C(1000000000)); |
| 372 | res_filestat->ctim = des[de].ctim * UINT64_C(1000000000); | 392 | store64_align3(&res_filestat->ctim, des[de].ctim * UINT64_C(1000000000)); |
| 373 | } | 393 | } |
| 374 | | 394 | |
| 375 | static void DirEntry_unlink(uint32_t de) { | 395 | static void DirEntry_unlink(uint32_t de) { |
| ... | @@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv | ... | @@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv |
| 394 | if (i == 1) continue; | 414 | if (i == 1) continue; |
| 395 | size += strlen(c_argv[i]) + 1; | 415 | size += strlen(c_argv[i]) + 1; |
| 396 | } | 416 | } |
| 397 | *argv_size_ptr = c_argc - 1; | 417 | store32_align2(argv_size_ptr, c_argc - 1); |
| 398 | *argv_buf_size_ptr = size; | 418 | store32_align2(argv_buf_size_ptr, size); |
| 399 | return wasi_errno_success; | 419 | return wasi_errno_success; |
| 400 | } | 420 | } |
| 401 | | 421 | |
| ... | @@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) { | ... | @@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) { |
| 413 | uint32_t argv_buf_i = 0; | 433 | uint32_t argv_buf_i = 0; |
| 414 | for (int src_i = 0; src_i < c_argc; src_i += 1) { | 434 | for (int src_i = 0; src_i < c_argc; src_i += 1) { |
| 415 | if (src_i == 1) continue; | 435 | if (src_i == 1) continue; |
| 416 | argv_ptr[dst_i] = argv_buf + argv_buf_i; | 436 | store32_align2(&argv_ptr[dst_i], argv_buf + argv_buf_i); |
| 417 | dst_i += 1; | 437 | dst_i += 1; |
| 418 | strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]); | 438 | strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]); |
| 419 | argv_buf_i += strlen(c_argv[src_i]) + 1; | 439 | argv_buf_i += strlen(c_argv[src_i]) + 1; |
| ... | @@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat | ... | @@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat |
| 430 | | 450 | |
| 431 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; | 451 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 432 | | 452 | |
| 433 | res_prestat_ptr[0] = 0; | 453 | store32_align2(&res_prestat_ptr[0], 0); |
| 434 | res_prestat_ptr[1] = strlen(des[fds[fd].de].guest_path); | 454 | store32_align2(&res_prestat_ptr[1], strlen(des[fds[fd].de].guest_path)); |
| 435 | return wasi_errno_success; | 455 | return wasi_errno_success; |
| 436 | } | 456 | } |
| 437 | | 457 | |
| ... | @@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path, | ... | @@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path, |
| 443 | #endif | 463 | #endif |
| 444 | | 464 | |
| 445 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; | 465 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 446 | strncpy(path_ptr, des[fds[fd].de].guest_path, path_len); | 466 | strncpy(path_ptr, des[fds[fd].de].guest_path, path_len); |
| 447 | return wasi_errno_success; | 467 | return wasi_errno_success; |
| 448 | } | 468 | } |
| 449 | | 469 | |
| ... | @@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov | ... | @@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov |
| 502 | | 522 | |
| 503 | size_t size = 0; | 523 | size_t size = 0; |
| 504 | for (uint32_t i = 0; i < iovs_len; i += 1) { | 524 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| | 525 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 505 | size_t read_size = 0; | 526 | size_t read_size = 0; |
| 506 | if (fds[fd].stream != NULL) | 527 | if (fds[fd].stream != NULL) |
| 507 | read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); | 528 | read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 508 | size += read_size; | 529 | size += read_size; |
| 509 | if (read_size < iovs_ptr[i].len) break; | 530 | if (read_size < len) break; |
| 510 | } | 531 | } |
| 511 | | 532 | |
| 512 | if (size > 0) des[fds[fd].de].atim = time(NULL); | 533 | if (size > 0) des[fds[fd].de].atim = time(NULL); |
| 513 | *res_size_ptr = size; | 534 | store32_align2(res_size_ptr, size); |
| 514 | return wasi_errno_success; | 535 | return wasi_errno_success; |
| 515 | } | 536 | } |
| 516 | | 537 | |
| ... | @@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest | ... | @@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest |
| 530 | if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io; | 551 | if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io; |
| 531 | long size = ftell(fds[fd].stream); | 552 | long size = ftell(fds[fd].stream); |
| 532 | if (size < 0) return wasi_errno_io; | 553 | if (size < 0) return wasi_errno_io; |
| 533 | res_filestat_ptr->size = size; | 554 | store64_align3(&res_filestat_ptr->size, size); |
| 534 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; | 555 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| 535 | return wasi_errno_success; | 556 | return wasi_errno_success; |
| 536 | } | 557 | } |
| ... | @@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i | ... | @@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i |
| 617 | | 638 | |
| 618 | size_t size = 0; | 639 | size_t size = 0; |
| 619 | for (uint32_t i = 0; i < iovs_len; i += 1) { | 640 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| | 641 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 620 | size_t written_size = 0; | 642 | size_t written_size = 0; |
| 621 | if (fds[fd].stream != NULL) | 643 | if (fds[fd].stream != NULL) |
| 622 | written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); | 644 | written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 623 | else | 645 | else |
| 624 | written_size = iovs_ptr[i].len; | 646 | written_size = len; |
| 625 | size += written_size; | 647 | size += written_size; |
| 626 | if (written_size < iovs_ptr[i].len) break; | 648 | if (written_size < len) break; |
| 627 | } | 649 | } |
| 628 | | 650 | |
| 629 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; | 651 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| ... | @@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i | ... | @@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i |
| 633 | des[fds[fd].de].atim = now; | 655 | des[fds[fd].de].atim = now; |
| 634 | des[fds[fd].de].mtim = now; | 656 | des[fds[fd].de].mtim = now; |
| 635 | } | 657 | } |
| 636 | *res_size_ptr = size; | 658 | store32_align2(res_size_ptr, size); |
| 637 | return wasi_errno_success; | 659 | return wasi_errno_success; |
| 638 | } | 660 | } |
| 639 | | 661 | |
| ... | @@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_ | ... | @@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_ |
| 669 | fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n"); | 691 | fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n"); |
| 670 | #endif | 692 | #endif |
| 671 | | 693 | |
| 672 | *environ_size_ptr = 0; | 694 | store32_align2(environ_size_ptr, 0); |
| 673 | *environ_buf_size_ptr = 0; | 695 | store32_align2(environ_buf_size_ptr, 0); |
| 674 | return wasi_errno_success; | 696 | return wasi_errno_success; |
| 675 | } | 697 | } |
| 676 | | 698 | |
| ... | @@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u | ... | @@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u |
| 702 | if (stream != NULL) { | 724 | if (stream != NULL) { |
| 703 | if (fseek(stream, 0, SEEK_END) >= 0) { | 725 | if (fseek(stream, 0, SEEK_END) >= 0) { |
| 704 | long size = ftell(stream); | 726 | long size = ftell(stream); |
| 705 | if (size >= 0) res_filestat_ptr->size = size; | 727 | if (size >= 0) store64_align3(&res_filestat_ptr->size, size); |
| 706 | } | 728 | } |
| 707 | fclose(stream); | 729 | fclose(stream); |
| 708 | } | 730 | } |
| ... | @@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) | ... | @@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) |
| 718 | #endif | 740 | #endif |
| 719 | | 741 | |
| 720 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; | 742 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 721 | res_fdstat_ptr->fs_filetype = des[fds[fd].de].filetype; | 743 | store16_align1(&res_fdstat_ptr->fs_filetype, des[fds[fd].de].filetype); |
| 722 | res_fdstat_ptr->fs_flags = fds[fd].fdflags; | 744 | store16_align1(&res_fdstat_ptr->fs_flags, fds[fd].fdflags); |
| 723 | res_fdstat_ptr->padding = 0; | 745 | store32_align2(&res_fdstat_ptr->padding, 0); |
| 724 | res_fdstat_ptr->fs_rights_inheriting = fds[fd].fs_rights_inheriting; | 746 | store64_align3(&res_fdstat_ptr->fs_rights_inheriting, fds[fd].fs_rights_inheriting); |
| 725 | return wasi_errno_success; | 747 | return wasi_errno_success; |
| 726 | } | 748 | } |
| 727 | | 749 | |
| ... | @@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io | ... | @@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io |
| 757 | | 779 | |
| 758 | size_t size = 0; | 780 | size_t size = 0; |
| 759 | for (uint32_t i = 0; i < iovs_len; i += 1) { | 781 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| | 782 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 760 | size_t written_size = 0; | 783 | size_t written_size = 0; |
| 761 | if (fds[fd].stream != NULL) | 784 | if (fds[fd].stream != NULL) |
| 762 | written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); | 785 | written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 763 | else | 786 | else |
| 764 | written_size = iovs_ptr[i].len; | 787 | written_size = len; |
| 765 | size += written_size; | 788 | size += written_size; |
| 766 | if (written_size < iovs_ptr[i].len) break; | 789 | if (written_size < len) break; |
| 767 | } | 790 | } |
| 768 | | 791 | |
| 769 | if (size > 0) { | 792 | if (size > 0) { |
| ... | @@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io | ... | @@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io |
| 771 | des[fds[fd].de].atim = now; | 794 | des[fds[fd].de].atim = now; |
| 772 | des[fds[fd].de].mtim = now; | 795 | des[fds[fd].de].mtim = now; |
| 773 | } | 796 | } |
| 774 | *res_size_ptr = size; | 797 | store32_align2(res_size_ptr, size); |
| 775 | return wasi_errno_success; | 798 | return wasi_errno_success; |
| 776 | } | 799 | } |
| 777 | | 800 | |
| ... | @@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 | ... | @@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 809 | #if LOG_TRACE | 832 | #if LOG_TRACE |
| 810 | fprintf(stderr, "fd = %u\n", fd_len); | 833 | fprintf(stderr, "fd = %u\n", fd_len); |
| 811 | #endif | 834 | #endif |
| 812 | *res_fd_ptr = fd_len; | 835 | store32_align2(res_fd_ptr, fd_len); |
| 813 | fd_len += 1; | 836 | fd_len += 1; |
| 814 | } | 837 | } |
| 815 | if (lookup_errno != wasi_errno_noent) return lookup_errno; | 838 | if (lookup_errno != wasi_errno_noent) return lookup_errno; |
| ... | @@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 | ... | @@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 867 | fds[fd_len].fdflags = fdflags; | 890 | fds[fd_len].fdflags = fdflags; |
| 868 | fds[fd_len].stream = stream; | 891 | fds[fd_len].stream = stream; |
| 869 | fds[fd_len].fs_rights_inheriting = fs_rights_inheriting; | 892 | fds[fd_len].fs_rights_inheriting = fs_rights_inheriting; |
| 870 | *res_fd_ptr = fd_len; | 893 | store32_align2(res_fd_ptr, fd_len); |
| 871 | fd_len += 1; | 894 | fd_len += 1; |
| 872 | return wasi_errno_success; | 895 | return wasi_errno_success; |
| 873 | } | 896 | } |
| ... | @@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision, | ... | @@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision, |
| 882 | | 905 | |
| 883 | switch (id) { | 906 | switch (id) { |
| 884 | case wasi_clockid_realtime: | 907 | case wasi_clockid_realtime: |
| 885 | *res_timestamp_ptr = time(NULL) * UINT64_C(1000000000); | 908 | store64_align3(res_timestamp_ptr, time(NULL) * UINT64_C(1000000000)); |
| 886 | break; | 909 | break; |
| 887 | case wasi_clockid_monotonic: | 910 | case wasi_clockid_monotonic: |
| 888 | case wasi_clockid_process_cputime_id: | 911 | case wasi_clockid_process_cputime_id: |
| 889 | case wasi_clockid_thread_cputime_id: | 912 | case wasi_clockid_thread_cputime_id: |
| 890 | *res_timestamp_ptr = clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC); | 913 | store64_align3(res_timestamp_ptr, clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC)); |
| 891 | break; | 914 | break; |
| 892 | default: return wasi_errno_inval; | 915 | default: return wasi_errno_inval; |
| 893 | } | 916 | } |
| ... | @@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io | ... | @@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io |
| 947 | | 970 | |
| 948 | size_t size = 0; | 971 | size_t size = 0; |
| 949 | for (uint32_t i = 0; i < iovs_len; i += 1) { | 972 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| | 973 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 950 | size_t read_size = 0; | 974 | size_t read_size = 0; |
| 951 | if (fds[fd].stream != NULL) | 975 | if (fds[fd].stream != NULL) |
| 952 | read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); | 976 | read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 953 | else | 977 | else |
| 954 | panic("unimplemented"); | 978 | panic("unimplemented"); |
| 955 | size += read_size; | 979 | size += read_size; |
| 956 | if (read_size < iovs_ptr[i].len) break; | 980 | if (read_size < len) break; |
| 957 | } | 981 | } |
| 958 | | 982 | |
| 959 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; | 983 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| 960 | | 984 | |
| 961 | if (size > 0) des[fds[fd].de].atim = time(NULL); | 985 | if (size > 0) des[fds[fd].de].atim = time(NULL); |
| 962 | *res_size_ptr = size; | 986 | store32_align2(res_size_ptr, size); |
| 963 | return wasi_errno_success; | 987 | return wasi_errno_success; |
| 964 | } | 988 | } |
| 965 | | 989 | |
| ... | @@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_ | ... | @@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_ |
| 996 | if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io; | 1020 | if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io; |
| 997 | long res_offset = ftell(fds[fd].stream); | 1021 | long res_offset = ftell(fds[fd].stream); |
| 998 | if (res_offset < 0) return wasi_errno_io; | 1022 | if (res_offset < 0) return wasi_errno_io; |
| 999 | *res_filesize_ptr = (uint64_t)res_offset; | 1023 | store64_align3(res_filesize_ptr, res_offset); |
| 1000 | return wasi_errno_success; | 1024 | return wasi_errno_success; |
| 1001 | } | 1025 | } |
| 1002 | | 1026 | |