slings 0.3.47

A small async runtime based on io-uring for Rust
Documentation
use std::io;
use std::mem;
use std::os::unix::io::RawFd;

use io_uring::{opcode, types};

use crate::driver::{Completable, CqeResult, Op};
use crate::socket::Socket;

pub(crate) struct Accept {
    pub(crate) socketaddr: Box<(libc::sockaddr_storage, libc::socklen_t)>,
}

impl Op<Accept> {
    pub(crate) fn accept(fd: RawFd) -> io::Result<Op<Accept>> {
        let mut socketaddr = Box::new((
            unsafe { mem::zeroed() },
            mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t,
        ));
        let entry = opcode::Accept::new(
            types::Fd(fd),
            &mut socketaddr.0 as *mut _ as *mut _,
            &mut socketaddr.1,
        )
        .flags(libc::SOCK_CLOEXEC)
        .build();
        Op::submit(Accept { socketaddr }, entry)
    }
}

impl Completable for Accept {
    type Output = io::Result<(Socket, Box<(libc::sockaddr_storage, libc::socklen_t)>)>;

    fn complete(self, cqe: CqeResult) -> Self::Output {
        let fd = cqe.result? as i32;
        Ok((Socket::from(fd), self.socketaddr))
    }
}