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

Method WSASend

crates/stdlib/src/overlapped.rs:877–936  ·  view source on GitHub ↗
(
            zelf: &Py<Self>,
            handle: isize,
            buf: PyBuffer,
            flags: u32,
            vm: &VirtualMachine,
        )

Source from the content-addressed store, hash-verified

875 // WSASend
876 #[pymethod]
877 fn WSASend(
878 zelf: &Py<Self>,
879 handle: isize,
880 buf: PyBuffer,
881 flags: u32,
882 vm: &VirtualMachine,
883 ) -> PyResult {
884 use windows_sys::Win32::Foundation::{ERROR_IO_PENDING, ERROR_SUCCESS};
885 use windows_sys::Win32::Networking::WinSock::{WSABUF, WSAGetLastError, WSASend};
886
887 let mut inner = zelf.inner.lock();
888 if !matches!(inner.data, OverlappedData::None) {
889 return Err(vm.new_value_error("operation already attempted"));
890 }
891
892 inner.handle = handle as HANDLE;
893 let buf_len = buf.desc.len;
894 if buf_len > u32::MAX as usize {
895 return Err(vm.new_value_error("buffer too large"));
896 }
897
898 let Some(contiguous) = buf.as_contiguous() else {
899 return Err(vm.new_buffer_error("buffer is not contiguous"));
900 };
901
902 inner.data = OverlappedData::Write(buf.clone());
903
904 let wsabuf = WSABUF {
905 buf: contiguous.as_ptr() as *mut _,
906 len: buf_len as u32,
907 };
908 let mut written: u32 = 0;
909
910 let ret = unsafe {
911 WSASend(
912 handle as _,
913 &wsabuf,
914 1,
915 &mut written,
916 flags,
917 &mut inner.overlapped,
918 None,
919 )
920 };
921
922 let err = if ret < 0 {
923 unsafe { WSAGetLastError() as u32 }
924 } else {
925 ERROR_SUCCESS
926 };
927 inner.error = err;
928
929 match err {
930 ERROR_SUCCESS | ERROR_IO_PENDING => Ok(vm.ctx.none()),
931 _ => {
932 inner.data = OverlappedData::NotStarted;
933 Err(set_from_windows_err(err, vm))
934 }

Callers 1

sendMethod · 0.95

Calls 8

set_from_windows_errFunction · 0.85
noneMethod · 0.80
ErrClass · 0.50
WriteInterface · 0.50
lockMethod · 0.45
as_contiguousMethod · 0.45
cloneMethod · 0.45
as_ptrMethod · 0.45

Tested by

no test coverage detected