1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
use std::alloc::{dealloc, Layout}; use std::os::unix::io::RawFd; use std::mem::ManuallyDrop; use std::net::SocketAddr; use super::{Event, Cancellation}; pub struct Connect { pub fd: RawFd, addr: Box<libc::sockaddr_storage>, addrlen: libc::socklen_t, } impl Connect { pub fn new(fd: RawFd, addr: SocketAddr) -> Connect { let (addr, addrlen) = crate::net::addr_to_c(addr); Connect { fd, addr, addrlen } } } impl Event for Connect { unsafe fn prepare(&mut self, sqe: &mut iou::SubmissionQueueEvent<'_>) { let addr = &mut *self.addr as *mut libc::sockaddr_storage as *mut libc::sockaddr; uring_sys::io_uring_prep_connect(sqe.raw_mut(), self.fd, addr, self.addrlen); } unsafe fn cancel(this: &mut ManuallyDrop<Self>) -> Cancellation { unsafe fn callback(addr: *mut (), _: usize) { dealloc(addr as *mut u8, Layout::new::<libc::sockaddr_storage>()); } Cancellation::new(&mut *this.addr as *mut libc::sockaddr_storage as *mut (), 0, callback) } }