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)
    }
}