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) }
             );
         };