|
11 | 11 | #include <common/errors.h> |
12 | 12 | #endif |
13 | 13 |
|
| 14 | +#ifdef __wasip3__ |
| 15 | +#include <wasi/wasip3_block.h> |
| 16 | +#endif |
| 17 | + |
14 | 18 | ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) { |
15 | 19 | if (offset < 0) { |
16 | 20 | errno = EINVAL; |
@@ -62,12 +66,34 @@ ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) { |
62 | 66 |
|
63 | 67 | return bytes_written; |
64 | 68 | #elif defined(__wasip3__) |
65 | | - (void) fildes; |
66 | | - (void) buf; |
67 | | - (void) nbyte; |
68 | | - // TODO(wasip3) |
69 | | - errno = ENOTSUP; |
70 | | - return -1; |
| 69 | + filesystem_borrow_descriptor_t file_handle; |
| 70 | + if (fd_to_file_handle(fildes, &file_handle) < 0) |
| 71 | + return -1; |
| 72 | + |
| 73 | + // Create a read/write stream, use `write-via-stream` to start writing, |
| 74 | + // then perform the write to see how much was accepted. |
| 75 | + filesystem_stream_u8_writer_t writer; |
| 76 | + filesystem_stream_u8_t reader = filesystem_stream_u8_new(&writer); |
| 77 | + filesystem_result_void_error_code_t result; |
| 78 | + wasip3_subtask_status_t subtask_status = |
| 79 | + filesystem_method_descriptor_write_via_stream(file_handle, reader, offset, &result); |
| 80 | + bool closed; |
| 81 | + size_t ret = __wasilibc_stream_block_on( |
| 82 | + filesystem_stream_u8_write(writer, buf, nbyte), |
| 83 | + writer, |
| 84 | + &closed); |
| 85 | + filesystem_stream_u8_drop_writable(writer); |
| 86 | + |
| 87 | + // Wait for the subtask to resolve now that the writer half is closed and if |
| 88 | + // we failed to write bytes (0 bytes written) and the result is an error we |
| 89 | + // can return -1. |
| 90 | + if (WASIP3_SUBTASK_STATE(subtask_status) != WASIP3_SUBTASK_RETURNED) |
| 91 | + __wasilibc_subtask_block_on_and_drop(WASIP3_SUBTASK_HANDLE(subtask_status)); |
| 92 | + if (ret == 0 && result.is_err) { |
| 93 | + translate_error(result.val.err); |
| 94 | + return -1; |
| 95 | + } |
| 96 | + return ret; |
71 | 97 | #else |
72 | 98 | # error "Unsupported WASI version" |
73 | 99 | #endif |
|
0 commit comments