io_uring_op_connect/
connect.rs

1//! Connect Record
2
3use core::pin::Pin;
4
5use crate::error::ConnectError;
6
7use io_uring_opcode::OpExtConnect;
8use io_uring_opcode::{OpCode, OpCompletion, OpError};
9use io_uring_owner::Owner;
10
11use ysockaddr::YSockAddrC;
12
13/// Connect Record
14#[derive(Clone, Debug)]
15pub struct Connect {
16    /// Current owner of the record
17    owner: Owner,
18    /// Related filehandle
19    fixed_fd: u32,
20    ysaddr: YSockAddrC,
21}
22
23impl Connect {
24    /// Construct a new Connect
25    pub fn with_ysockaddr_c(fixed_fd: u32, ysaddr: YSockAddrC) -> Result<Self, ConnectError> {
26        Ok(Connect {
27            owner: Owner::Created,
28            fixed_fd,
29            ysaddr,
30        })
31    }
32}
33
34impl OpCompletion for Connect {
35    type Error = OpError;
36    fn entry(&self) -> io_uring::squeue::Entry {
37        let (saddr, slen) = self.ysaddr.as_c_sockaddr_len();
38
39        println!("OpCompletion entry() saddr = {:p}, slen = {}", saddr, slen);
40
41        io_uring::opcode::Connect::new(io_uring::types::Fixed(self.fixed_fd), saddr, slen).build()
42    }
43    fn owner(&self) -> Owner {
44        self.owner.clone()
45    }
46    fn force_owner_kernel(&mut self) -> bool {
47        self.owner = Owner::Kernel;
48        true
49    }
50}
51
52impl OpCode<Connect> for Connect {
53    fn submission(self) -> Result<Connect, OpError> {
54        Ok(self)
55    }
56    fn completion(&mut self, _: Pin<&mut Connect>) -> Result<(), OpError> {
57        todo!()
58    }
59}
60
61impl OpExtConnect for Connect {
62    /// Underlying Fixed Fd
63    fn fixed_fd(&self) -> u32 {
64        self.fixed_fd
65    }
66    /// Underlying YSockAddrC
67    fn ysaddr(&self) -> &YSockAddrC {
68        &self.ysaddr
69    }
70}