| 1309 | // WSARecvFrom |
| 1310 | #[pymethod] |
| 1311 | fn WSARecvFrom( |
| 1312 | zelf: &Py<Self>, |
| 1313 | handle: isize, |
| 1314 | size: u32, |
| 1315 | flags: OptionalArg<u32>, |
| 1316 | vm: &VirtualMachine, |
| 1317 | ) -> PyResult { |
| 1318 | use windows_sys::Win32::Foundation::{ |
| 1319 | ERROR_BROKEN_PIPE, ERROR_IO_PENDING, ERROR_MORE_DATA, ERROR_SUCCESS, |
| 1320 | }; |
| 1321 | use windows_sys::Win32::Networking::WinSock::{WSABUF, WSAGetLastError, WSARecvFrom}; |
| 1322 | |
| 1323 | let mut inner = zelf.inner.lock(); |
| 1324 | if !matches!(inner.data, OverlappedData::None) { |
| 1325 | return Err(vm.new_value_error("operation already attempted")); |
| 1326 | } |
| 1327 | |
| 1328 | let mut flags = flags.unwrap_or(0); |
| 1329 | |
| 1330 | #[cfg(target_pointer_width = "32")] |
| 1331 | let size = core::cmp::min(size, isize::MAX as u32); |
| 1332 | |
| 1333 | let buf = vec![0u8; core::cmp::max(size, 1) as usize]; |
| 1334 | let buf = vm.ctx.new_bytes(buf); |
| 1335 | inner.handle = handle as HANDLE; |
| 1336 | |
| 1337 | let address: SOCKADDR_IN6 = unsafe { core::mem::zeroed() }; |
| 1338 | let address_length = core::mem::size_of::<SOCKADDR_IN6>() as i32; |
| 1339 | |
| 1340 | inner.data = OverlappedData::ReadFrom(OverlappedReadFrom { |
| 1341 | result: None, |
| 1342 | allocated_buffer: buf.clone(), |
| 1343 | address, |
| 1344 | address_length, |
| 1345 | }); |
| 1346 | |
| 1347 | let wsabuf = WSABUF { |
| 1348 | buf: buf.as_bytes().as_ptr() as *mut _, |
| 1349 | len: size, |
| 1350 | }; |
| 1351 | let mut nread: u32 = 0; |
| 1352 | |
| 1353 | // Get mutable reference to address in inner.data |
| 1354 | let (addr_ptr, addr_len_ptr) = match &mut inner.data { |
| 1355 | OverlappedData::ReadFrom(rf) => ( |
| 1356 | &mut rf.address as *mut SOCKADDR_IN6, |
| 1357 | &mut rf.address_length as *mut i32, |
| 1358 | ), |
| 1359 | _ => unreachable!(), |
| 1360 | }; |
| 1361 | |
| 1362 | let ret = unsafe { |
| 1363 | WSARecvFrom( |
| 1364 | handle as _, |
| 1365 | &wsabuf, |
| 1366 | 1, |
| 1367 | &mut nread, |
| 1368 | &mut flags, |