dope_core/io/socket/
msg.rs1use 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}