MCPcopy Index your code
hub / github.com/RustPython/RustPython / WSARecv

Method WSARecv

crates/stdlib/src/overlapped.rs:683–746  ·  view source on GitHub ↗
(
            zelf: &Py<Self>,
            handle: isize,
            size: u32,
            flags: OptionalArg<u32>,
            vm: &VirtualMachine,
        )

Source from the content-addressed store, hash-verified

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()),

Callers 1

recvMethod · 0.95

Calls 11

minFunction · 0.85
ReadInterface · 0.85
mark_as_completedFunction · 0.85
set_from_windows_errFunction · 0.85
noneMethod · 0.80
ErrClass · 0.50
lockMethod · 0.45
new_bytesMethod · 0.45
cloneMethod · 0.45
as_ptrMethod · 0.45
as_bytesMethod · 0.45

Tested by

no test coverage detected