dope-core 0.11.0

The manifold runtime
Documentation
use core::ptr;

#[derive(Clone, Copy, Debug)]
#[repr(transparent)]
pub struct IoVec {
    raw: libc::iovec,
}

impl IoVec {
    #[must_use]
    pub const fn empty() -> Self {
        Self {
            raw: libc::iovec {
                iov_base: ptr::null_mut(),
                iov_len: 0,
            },
        }
    }

    #[must_use]
    pub fn from_slice(buf: &[u8]) -> Self {
        Self {
            raw: libc::iovec {
                iov_base: buf.as_ptr() as *mut libc::c_void,
                iov_len: buf.len(),
            },
        }
    }

    #[must_use]
    pub fn from_mut_slice(buf: &mut [u8]) -> Self {
        Self {
            raw: libc::iovec {
                iov_base: buf.as_mut_ptr() as *mut libc::c_void,
                iov_len: buf.len(),
            },
        }
    }

    #[must_use]
    pub fn len(&self) -> usize {
        self.raw.iov_len
    }

    #[must_use]
    pub fn is_empty(&self) -> bool {
        self.raw.iov_len == 0
    }

    #[must_use]
    pub fn as_ptr(&self) -> *const u8 {
        self.raw.iov_base as *const u8
    }
}

#[derive(Clone, Copy, Debug)]
#[repr(transparent)]
pub struct MsgHdr {
    raw: libc::msghdr,
}

impl MsgHdr {
    pub fn empty() -> Self {
        Self {
            raw: libc::msghdr {
                msg_name: ptr::null_mut(),
                msg_namelen: 0,
                msg_iov: ptr::null_mut(),
                msg_iovlen: 0,
                msg_control: ptr::null_mut(),
                msg_controllen: 0,
                msg_flags: 0,
            },
        }
    }

    pub fn set_name_ptr(&mut self, ptr: *mut libc::c_void, len: u32) {
        self.raw.msg_name = ptr;
        self.raw.msg_namelen = len;
    }

    pub fn set_namelen(&mut self, len: u32) {
        self.raw.msg_namelen = len;
    }

    pub fn set_iov(&mut self, iov: &[IoVec]) {
        self.raw.msg_iov = iov.as_ptr() as *mut libc::iovec;
        self.raw.msg_iovlen = iov.len() as _;
    }

    pub fn set_control(&mut self, ptr: *mut libc::c_void, len: usize) {
        self.raw.msg_control = ptr;
        self.raw.msg_controllen = len as _;
    }

    pub fn flags(&self) -> libc::c_int {
        self.raw.msg_flags
    }

    pub fn raw(&self) -> &libc::msghdr {
        &self.raw
    }

    pub fn as_mut_ptr(&mut self) -> *mut libc::msghdr {
        ptr::addr_of_mut!(self.raw)
    }
}