use std::ffi::{c_int, c_uchar}; use super::{CMsgHdr, MsgHdr}; #[derive(Copy, Clone)] #[repr(align(8))] // Conservative bound for align_of pub(crate) struct Aligned(pub(crate) T); /// Helpers for [`libc::msghdr`] impl MsgHdr for libc::msghdr { type ControlMessage = libc::cmsghdr; fn cmsg_first_hdr(&self) -> *mut Self::ControlMessage { unsafe { libc::CMSG_FIRSTHDR(self) } } fn cmsg_nxt_hdr(&self, cmsg: &Self::ControlMessage) -> *mut Self::ControlMessage { unsafe { libc::CMSG_NXTHDR(self, cmsg) } } fn set_control_len(&mut self, len: usize) { self.msg_controllen = len as _; if len == 0 { // netbsd is particular about this being a NULL pointer if there are no control // messages. self.msg_control = std::ptr::null_mut(); } } fn control_len(&self) -> usize { self.msg_controllen as _ } } #[cfg(apple_fast)] impl MsgHdr for crate::imp::msghdr_x { type ControlMessage = libc::cmsghdr; fn cmsg_first_hdr(&self) -> *mut Self::ControlMessage { let selfp = self as *const _ as *mut libc::msghdr; unsafe { libc::CMSG_FIRSTHDR(selfp) } } fn cmsg_nxt_hdr(&self, cmsg: &Self::ControlMessage) -> *mut Self::ControlMessage { let selfp = self as *const _ as *mut libc::msghdr; unsafe { libc::CMSG_NXTHDR(selfp, cmsg) } } fn set_control_len(&mut self, len: usize) { self.msg_controllen = len as _; } fn control_len(&self) -> usize { self.msg_controllen as _ } } /// Helpers for [`libc::cmsghdr`] impl CMsgHdr for libc::cmsghdr { fn cmsg_len(length: usize) -> usize { unsafe { libc::CMSG_LEN(length as _) as usize } } fn cmsg_space(length: usize) -> usize { unsafe { libc::CMSG_SPACE(length as _) as usize } } fn cmsg_data(&self) -> *mut c_uchar { unsafe { libc::CMSG_DATA(self) } } fn set(&mut self, level: c_int, ty: c_int, len: usize) { self.cmsg_level = level as _; self.cmsg_type = ty as _; self.cmsg_len = len as _; } fn len(&self) -> usize { self.cmsg_len as _ } }