dope 0.5.0

The manifold runtime
Documentation
use io_uring::{opcode::SetSockOpt, types::Fixed};

use super::Driver;
use crate::backend::token::{ROUTE_FRAMEWORK, Token};
use crate::{PushError, Sockopt};

impl Sockopt for Driver {
    fn set(&mut self, fixed_idx: u32, level: u32, optname: u32, value: i32) -> Result<(), crate::backend::PushError> {
        let Some(key) = self.setsockopt.alloc(Box::new(value)) else {
            return Err(crate::backend::PushError);
        };
        let optval_ptr =
            (&**self.setsockopt.get(key).unwrap() as *const libc::c_int).cast::<libc::c_void>();
        let ud = Token::from_key(ROUTE_FRAMEWORK, key);
        let sqe = SetSockOpt::new(
            Fixed(fixed_idx),
            level,
            optname,
            optval_ptr,
            size_of::<libc::c_int>() as u32,
        )
        .build()
        .user_data(ud.raw());
        if self.try_push(&sqe).is_ok() {
            Ok(())
        } else {
            self.setsockopt.remove(key);
            Err(PushError)
        }
    }
}