(
&self,
buffers: Vec<ArgBytesLike>,
ancdata: OptionalArg,
flags: OptionalArg<i32>,
addr: OptionalOption,
vm: &VirtualMachine,
| 1813 | #[cfg(all(unix, not(target_os = "redox")))] |
| 1814 | #[pymethod] |
| 1815 | fn sendmsg( |
| 1816 | &self, |
| 1817 | buffers: Vec<ArgBytesLike>, |
| 1818 | ancdata: OptionalArg, |
| 1819 | flags: OptionalArg<i32>, |
| 1820 | addr: OptionalOption, |
| 1821 | vm: &VirtualMachine, |
| 1822 | ) -> PyResult<usize> { |
| 1823 | let flags = flags.unwrap_or(0); |
| 1824 | let mut msg = socket2::MsgHdr::new(); |
| 1825 | |
| 1826 | let sockaddr; |
| 1827 | if let Some(addr) = addr.flatten() { |
| 1828 | sockaddr = self |
| 1829 | .extract_address(addr, "sendmsg", vm) |
| 1830 | .map_err(|e| e.into_pyexception(vm))?; |
| 1831 | msg = msg.with_addr(&sockaddr); |
| 1832 | } |
| 1833 | |
| 1834 | let buffers = buffers |
| 1835 | .iter() |
| 1836 | .map(|buf| buf.borrow_buf()) |
| 1837 | .collect::<Vec<_>>(); |
| 1838 | let buffers = buffers |
| 1839 | .iter() |
| 1840 | .map(|buf| io::IoSlice::new(buf)) |
| 1841 | .collect::<Vec<_>>(); |
| 1842 | msg = msg.with_buffers(&buffers); |
| 1843 | |
| 1844 | let control_buf; |
| 1845 | if let OptionalArg::Present(ancdata) = ancdata { |
| 1846 | let cmsgs = vm.extract_elements_with( |
| 1847 | &ancdata, |
| 1848 | |obj| -> PyResult<(i32, i32, ArgBytesLike)> { |
| 1849 | let seq: Vec<PyObjectRef> = obj.try_into_value(vm)?; |
| 1850 | let [lvl, typ, data]: [PyObjectRef; 3] = seq |
| 1851 | .try_into() |
| 1852 | .map_err(|_| vm.new_type_error("expected a sequence of length 3"))?; |
| 1853 | Ok(( |
| 1854 | lvl.try_into_value(vm)?, |
| 1855 | typ.try_into_value(vm)?, |
| 1856 | data.try_into_value(vm)?, |
| 1857 | )) |
| 1858 | }, |
| 1859 | )?; |
| 1860 | control_buf = Self::pack_cmsgs_to_send(&cmsgs, vm)?; |
| 1861 | if !control_buf.is_empty() { |
| 1862 | msg = msg.with_control(&control_buf); |
| 1863 | } |
| 1864 | } |
| 1865 | |
| 1866 | self.sock_op(vm, SelectKind::Write, || { |
| 1867 | let sock = self.sock()?; |
| 1868 | sock.sendmsg(&msg, flags) |
| 1869 | }) |
| 1870 | .map_err(|e| e.into_pyexception(vm)) |
| 1871 | } |
| 1872 |
nothing calls this directly
no test coverage detected