Skip to main content

dope_core/io/socket/
msg.rs

1use core::ptr::addr_of_mut;
2use core::ptr::null_mut;
3use libc::c_int;
4use libc::c_void;
5use libc::iovec;
6use libc::msghdr;
7
8#[derive(Clone, Copy, Debug)]
9#[repr(transparent)]
10pub struct IoVec {
11    raw: iovec,
12}
13
14impl IoVec {
15    #[must_use]
16    pub const fn empty() -> Self {
17        Self {
18            raw: iovec {
19                iov_base: null_mut(),
20                iov_len: 0,
21            },
22        }
23    }
24
25    #[must_use]
26    pub fn from_slice(buf: &[u8]) -> Self {
27        Self {
28            raw: iovec {
29                iov_base: buf.as_ptr() as *mut c_void,
30                iov_len: buf.len(),
31            },
32        }
33    }
34
35    #[must_use]
36    pub fn from_mut_slice(buf: &mut [u8]) -> Self {
37        Self {
38            raw: iovec {
39                iov_base: buf.as_mut_ptr() as *mut c_void,
40                iov_len: buf.len(),
41            },
42        }
43    }
44
45    #[must_use]
46    pub fn len(&self) -> usize {
47        self.raw.iov_len
48    }
49
50    #[must_use]
51    pub fn is_empty(&self) -> bool {
52        self.raw.iov_len == 0
53    }
54
55    #[must_use]
56    pub fn as_ptr(&self) -> *const u8 {
57        self.raw.iov_base as *const u8
58    }
59}
60
61#[derive(Clone, Copy, Debug)]
62#[repr(transparent)]
63pub struct MsgHdr {
64    raw: msghdr,
65}
66
67impl MsgHdr {
68    pub fn empty() -> Self {
69        Self {
70            raw: msghdr {
71                msg_name: null_mut(),
72                msg_namelen: 0,
73                msg_iov: null_mut(),
74                msg_iovlen: 0,
75                msg_control: null_mut(),
76                msg_controllen: 0,
77                msg_flags: 0,
78            },
79        }
80    }
81
82    pub fn set_name_ptr(&mut self, ptr: *mut c_void, len: u32) {
83        self.raw.msg_name = ptr;
84        self.raw.msg_namelen = len;
85    }
86
87    pub fn set_namelen(&mut self, len: u32) {
88        self.raw.msg_namelen = len;
89    }
90
91    pub fn set_iov(&mut self, iov: &[IoVec]) {
92        self.raw.msg_iov = iov.as_ptr() as *mut iovec;
93        self.raw.msg_iovlen = iov.len() as _;
94    }
95
96    pub fn set_control(&mut self, ptr: *mut c_void, len: usize) {
97        self.raw.msg_control = ptr;
98        self.raw.msg_controllen = len as _;
99    }
100
101    pub fn flags(&self) -> c_int {
102        self.raw.msg_flags
103    }
104
105    pub fn raw(&self) -> &msghdr {
106        &self.raw
107    }
108
109    pub fn as_mut_ptr(&mut self) -> *mut msghdr {
110        addr_of_mut!(self.raw)
111    }
112}