| 5722 | } |
| 5723 | |
| 5724 | static int win_io_once(cbm_daemon_ipc_connection_t *connection, void *buffer, DWORD length, |
| 5725 | bool writing, uint64_t deadline_ms, DWORD *transferred_out) { |
| 5726 | OVERLAPPED overlapped; |
| 5727 | memset(&overlapped, 0, sizeof(overlapped)); |
| 5728 | overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); |
| 5729 | if (!overlapped.hEvent) { |
| 5730 | return -1; |
| 5731 | } |
| 5732 | DWORD transferred = 0; |
| 5733 | BOOL completed = writing |
| 5734 | ? WriteFile(connection->handle, buffer, length, &transferred, &overlapped) |
| 5735 | : ReadFile(connection->handle, buffer, length, &transferred, &overlapped); |
| 5736 | int result = 1; |
| 5737 | if (!completed) { |
| 5738 | if (GetLastError() != ERROR_IO_PENDING) { |
| 5739 | result = -1; |
| 5740 | } else { |
| 5741 | result = win_overlapped_wait(connection->handle, &overlapped, |
| 5742 | win_deadline_remaining(deadline_ms), &transferred); |
| 5743 | } |
| 5744 | } |
| 5745 | (void)CloseHandle(overlapped.hEvent); |
| 5746 | if (result == 1) { |
| 5747 | *transferred_out = transferred; |
| 5748 | } |
| 5749 | return result; |
| 5750 | } |
| 5751 | |
| 5752 | static int connection_read_full(cbm_daemon_ipc_connection_t *connection, void *buffer, |
| 5753 | size_t length, uint64_t deadline_ms) { |
no test coverage detected