(
zelf: &Py<Self>,
handle: isize,
size: u32,
flags: OptionalArg<u32>,
vm: &VirtualMachine,
)
| 681 | // WSARecv |
| 682 | #[pymethod] |
| 683 | fn WSARecv( |
| 684 | zelf: &Py<Self>, |
| 685 | handle: isize, |
| 686 | size: u32, |
| 687 | flags: OptionalArg<u32>, |
| 688 | vm: &VirtualMachine, |
| 689 | ) -> PyResult { |
| 690 | use windows_sys::Win32::Foundation::{ |
| 691 | ERROR_BROKEN_PIPE, ERROR_IO_PENDING, ERROR_MORE_DATA, ERROR_SUCCESS, |
| 692 | }; |
| 693 | use windows_sys::Win32::Networking::WinSock::{WSABUF, WSAGetLastError, WSARecv}; |
| 694 | |
| 695 | let mut inner = zelf.inner.lock(); |
| 696 | if !matches!(inner.data, OverlappedData::None) { |
| 697 | return Err(vm.new_value_error("operation already attempted")); |
| 698 | } |
| 699 | |
| 700 | let mut flags = flags.unwrap_or(0); |
| 701 | |
| 702 | #[cfg(target_pointer_width = "32")] |
| 703 | let size = core::cmp::min(size, isize::MAX as u32); |
| 704 | |
| 705 | let buf = vec![0u8; core::cmp::max(size, 1) as usize]; |
| 706 | let buf = vm.ctx.new_bytes(buf); |
| 707 | inner.handle = handle as HANDLE; |
| 708 | inner.data = OverlappedData::Read(buf.clone()); |
| 709 | |
| 710 | let wsabuf = WSABUF { |
| 711 | buf: buf.as_bytes().as_ptr() as *mut _, |
| 712 | len: size, |
| 713 | }; |
| 714 | let mut nread: u32 = 0; |
| 715 | |
| 716 | let ret = unsafe { |
| 717 | WSARecv( |
| 718 | handle as _, |
| 719 | &wsabuf, |
| 720 | 1, |
| 721 | &mut nread, |
| 722 | &mut flags, |
| 723 | &mut inner.overlapped, |
| 724 | None, |
| 725 | ) |
| 726 | }; |
| 727 | |
| 728 | let err = if ret < 0 { |
| 729 | unsafe { WSAGetLastError() as u32 } |
| 730 | } else { |
| 731 | ERROR_SUCCESS |
| 732 | }; |
| 733 | inner.error = err; |
| 734 | |
| 735 | match err { |
| 736 | ERROR_BROKEN_PIPE => { |
| 737 | mark_as_completed(&mut inner.overlapped); |
| 738 | Err(set_from_windows_err(err, vm)) |
| 739 | } |
| 740 | ERROR_SUCCESS | ERROR_MORE_DATA | ERROR_IO_PENDING => Ok(vm.ctx.none()), |
no test coverage detected