| 6001 | } |
| 6002 | |
| 6003 | static int win_io_once(cbm_daemon_ipc_connection_t *connection, void *buffer, DWORD length, |
| 6004 | bool writing, uint64_t deadline_ms, DWORD *transferred_out) { |
| 6005 | OVERLAPPED overlapped; |
| 6006 | memset(&overlapped, 0, sizeof(overlapped)); |
| 6007 | overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); |
| 6008 | if (!overlapped.hEvent) { |
| 6009 | return -1; |
| 6010 | } |
| 6011 | DWORD transferred = 0; |
| 6012 | BOOL completed = writing |
| 6013 | ? WriteFile(connection->handle, buffer, length, &transferred, &overlapped) |
| 6014 | : ReadFile(connection->handle, buffer, length, &transferred, &overlapped); |
| 6015 | int result = 1; |
| 6016 | if (!completed) { |
| 6017 | if (GetLastError() != ERROR_IO_PENDING) { |
| 6018 | result = -1; |
| 6019 | } else { |
| 6020 | result = win_overlapped_wait(connection->handle, &overlapped, |
| 6021 | win_deadline_remaining(deadline_ms), &transferred); |
| 6022 | } |
| 6023 | } |
| 6024 | (void)CloseHandle(overlapped.hEvent); |
| 6025 | if (result == 1) { |
| 6026 | *transferred_out = transferred; |
| 6027 | } |
| 6028 | return result; |
| 6029 | } |
| 6030 | |
| 6031 | static int connection_read_full(cbm_daemon_ipc_connection_t *connection, void *buffer, |
| 6032 | size_t length, uint64_t deadline_ms) { |
no test coverage detected