base: unix: reimplement CMSG_* macros as const fns
These macros are no longer necessary, as we can replace them with const
fn implementations instead.
BUG=None
TEST=tools/dev_container tools/presubmit
Change-Id: If64cfa8fe08f113ead7236d11bb5a8b0fd51c290
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4484512
Reviewed-by: Zihan Chen <zihanchen@google.com>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
diff --git a/base/src/sys/unix/sock_ctrl_msg.rs b/base/src/sys/unix/sock_ctrl_msg.rs
index fcd5bf6..1aa1daa 100644
--- a/base/src/sys/unix/sock_ctrl_msg.rs
+++ b/base/src/sys/unix/sock_ctrl_msg.rs
@@ -39,25 +39,22 @@
use super::StreamChannel;
use crate::AsRawDescriptor;
-// Each of the following macros performs the same function as their C counterparts. They are each
-// macros because they are used to size statically allocated arrays.
+// Each of the following functions performs the same function as their C counterparts. They are
+// reimplemented as const fns here because they are used to size statically allocated arrays.
-macro_rules! CMSG_ALIGN {
- ($len:expr) => {
- ((($len) as usize) + size_of::<c_long>() - 1) & !(size_of::<c_long>() - 1)
- };
+#[allow(non_snake_case)]
+const fn CMSG_ALIGN(len: usize) -> usize {
+ (len + size_of::<c_long>() - 1) & !(size_of::<c_long>() - 1)
}
-macro_rules! CMSG_SPACE {
- ($len:expr) => {
- size_of::<cmsghdr>() + CMSG_ALIGN!($len)
- };
+#[allow(non_snake_case)]
+const fn CMSG_SPACE(len: usize) -> usize {
+ size_of::<cmsghdr>() + CMSG_ALIGN(len)
}
-macro_rules! CMSG_LEN {
- ($len:expr) => {
- size_of::<cmsghdr>() + (($len) as usize)
- };
+#[allow(non_snake_case)]
+const fn CMSG_LEN(len: usize) -> usize {
+ size_of::<cmsghdr>() + len
}
// This function (macro in the C version) is not used in any compile time constant slots, so is just
@@ -74,7 +71,7 @@
// does some pointer arithmetic on cmsg_ptr.
#[allow(clippy::cast_ptr_alignment, clippy::unnecessary_cast)]
fn get_next_cmsg(msghdr: &msghdr, cmsg: &cmsghdr, cmsg_ptr: *mut cmsghdr) -> *mut cmsghdr {
- let next_cmsg = (cmsg_ptr as *mut u8).wrapping_add(CMSG_ALIGN!(cmsg.cmsg_len)) as *mut cmsghdr;
+ let next_cmsg = (cmsg_ptr as *mut u8).wrapping_add(CMSG_ALIGN(cmsg.cmsg_len)) as *mut cmsghdr;
if next_cmsg
.wrapping_offset(1)
.wrapping_sub(msghdr.msg_control as usize) as usize
@@ -86,7 +83,7 @@
}
}
-const CMSG_BUFFER_INLINE_CAPACITY: usize = CMSG_SPACE!(size_of::<RawFd>() * 32);
+const CMSG_BUFFER_INLINE_CAPACITY: usize = CMSG_SPACE(size_of::<RawFd>() * 32);
enum CmsgBuffer {
Inline([u64; (CMSG_BUFFER_INLINE_CAPACITY + 7) / 8]),
@@ -124,7 +121,7 @@
// that is unnecessary when compiling for glibc.
#[allow(clippy::useless_conversion)]
fn raw_sendmsg<D: AsIobuf>(fd: RawFd, out_data: &[D], out_fds: &[RawFd]) -> Result<usize> {
- let cmsg_capacity = CMSG_SPACE!(size_of::<RawFd>() * out_fds.len());
+ let cmsg_capacity = CMSG_SPACE(size_of::<RawFd>() * out_fds.len());
let mut cmsg_buffer = CmsgBuffer::with_capacity(cmsg_capacity);
let iovec = AsIobuf::as_iobuf_slice(out_data);
@@ -141,7 +138,7 @@
// Safe because cmsghdr only contains primitive types for which zero
// initialization is valid.
let mut cmsg: cmsghdr = unsafe { MaybeUninit::zeroed().assume_init() };
- cmsg.cmsg_len = CMSG_LEN!(size_of::<RawFd>() * out_fds.len())
+ cmsg.cmsg_len = CMSG_LEN(size_of::<RawFd>() * out_fds.len())
.try_into()
.unwrap();
cmsg.cmsg_level = SOL_SOCKET;
@@ -177,7 +174,7 @@
// cmsg_len that is unnecessary when compiling for glibc.
#[allow(clippy::useless_conversion, clippy::unnecessary_cast)]
fn raw_recvmsg(fd: RawFd, iovs: &mut [IoSliceMut], in_fds: &mut [RawFd]) -> Result<(usize, usize)> {
- let cmsg_capacity = CMSG_SPACE!(size_of::<RawFd>() * in_fds.len());
+ let cmsg_capacity = CMSG_SPACE(size_of::<RawFd>() * in_fds.len());
let mut cmsg_buffer = CmsgBuffer::with_capacity(cmsg_capacity);
// msghdr on musl has private __pad1 and __pad2 fields that cannot be initialized.
@@ -212,7 +209,7 @@
let cmsg = unsafe { (cmsg_ptr as *mut cmsghdr).read_unaligned() };
if cmsg.cmsg_level == SOL_SOCKET && cmsg.cmsg_type == SCM_RIGHTS {
- let fd_count = (cmsg.cmsg_len as usize - CMSG_LEN!(0)) / size_of::<RawFd>();
+ let fd_count = (cmsg.cmsg_len as usize - CMSG_LEN(0)) / size_of::<RawFd>();
unsafe {
copy_nonoverlapping(
CMSG_DATA(cmsg_ptr),
@@ -435,12 +432,9 @@
mod tests {
use std::io::Write;
use std::mem::size_of;
- use std::os::raw::c_long;
use std::os::unix::net::UnixDatagram;
use std::slice::from_raw_parts;
- use libc::cmsghdr;
-
use super::*;
use crate::AsRawDescriptor;
use crate::Event;
@@ -450,7 +444,7 @@
macro_rules! CMSG_SPACE_TEST {
($len:literal) => {
assert_eq!(
- CMSG_SPACE!(size_of::<[RawFd; $len]>()) as libc::c_uint,
+ CMSG_SPACE(size_of::<[RawFd; $len]>()) as libc::c_uint,
unsafe { libc::CMSG_SPACE(size_of::<[RawFd; $len]>() as libc::c_uint) }
);
};