rustix/backend/linux_raw/net/
msghdr.rs1#![allow(unsafe_code)]
7
8use crate::backend::c;
9
10use crate::io::{self, IoSlice, IoSliceMut};
11use crate::net::addr::SocketAddrArg;
12use crate::net::{RecvAncillaryBuffer, SendAncillaryBuffer, SocketAddrBuf};
13
14use core::ptr::null_mut;
15
16fn msg_iov_len(len: usize) -> c::size_t {
17 len as c::size_t
19}
20
21fn msg_control_len(len: usize) -> c::size_t {
22 len as c::size_t
24}
25
26pub(crate) unsafe fn with_recv_msghdr<R>(
36 name: &mut SocketAddrBuf,
37 iov: &mut [IoSliceMut<'_>],
38 control: &mut RecvAncillaryBuffer<'_>,
39 f: impl FnOnce(&mut c::msghdr) -> io::Result<R>,
40) -> io::Result<R> {
41 control.clear();
42
43 let mut msghdr = c::msghdr {
44 msg_name: name.storage.as_mut_ptr().cast(),
45 msg_namelen: bitcast!(name.len),
46 msg_iov: iov.as_mut_ptr().cast(),
47 msg_iovlen: msg_iov_len(iov.len()),
48 msg_control: control.as_control_ptr().cast(),
49 msg_controllen: msg_control_len(control.control_len()),
50 msg_flags: 0,
51 };
52
53 let res = f(&mut msghdr);
54
55 if res.is_ok() {
57 control.set_control_len(msghdr.msg_controllen as usize);
60 }
61
62 name.len = bitcast!(msghdr.msg_namelen);
63
64 res
65}
66
67pub(crate) fn noaddr_msghdr(
72 iov: &[IoSlice<'_>],
73 control: &mut SendAncillaryBuffer<'_, '_, '_>,
74) -> c::msghdr {
75 c::msghdr {
76 msg_name: null_mut(),
77 msg_namelen: 0,
78 msg_iov: iov.as_ptr() as _,
79 msg_iovlen: msg_iov_len(iov.len()),
80 msg_control: control.as_control_ptr().cast(),
81 msg_controllen: msg_control_len(control.control_len()),
82 msg_flags: 0,
83 }
84}
85
86pub(crate) unsafe fn with_msghdr<R>(
97 addr: &impl SocketAddrArg,
98 iov: &[IoSlice<'_>],
99 control: &mut SendAncillaryBuffer<'_, '_, '_>,
100 f: impl FnOnce(&c::msghdr) -> R,
101) -> R {
102 addr.with_sockaddr(|addr_ptr, addr_len| {
103 let mut msghdr = noaddr_msghdr(iov, control);
107 msghdr.msg_name = addr_ptr as _;
108 msghdr.msg_namelen = bitcast!(addr_len);
109
110 f(&msghdr)
111 })
112}
113
114pub(crate) fn zero_msghdr() -> c::msghdr {
116 c::msghdr {
117 msg_name: null_mut(),
118 msg_namelen: 0,
119 msg_iov: null_mut(),
120 msg_iovlen: 0,
121 msg_control: null_mut(),
122 msg_controllen: 0,
123 msg_flags: 0,
124 }
125}