1
Fork 0

Fix type mismatching for different OSes.

This commit is contained in:
LinkTed 2020-09-25 20:19:02 +02:00
parent 889c9272cb
commit ce167f8be7

View file

@ -4,7 +4,7 @@ use crate::marker::PhantomData;
use crate::mem::{size_of, zeroed}; use crate::mem::{size_of, zeroed};
use crate::os::unix::io::RawFd; use crate::os::unix::io::RawFd;
use crate::path::Path; use crate::path::Path;
use crate::ptr::{null_mut, read_unaligned}; use crate::ptr::read_unaligned;
use crate::slice::from_raw_parts; use crate::slice::from_raw_parts;
use crate::sys::unix::ext::net::addr::{sockaddr_un, SocketAddr}; use crate::sys::unix::ext::net::addr::{sockaddr_un, SocketAddr};
use crate::sys::unix::net::Socket; use crate::sys::unix::net::Socket;
@ -20,19 +20,31 @@ pub(super) fn recv_vectored_with_ancillary_from(
unsafe { unsafe {
let mut msg_name: libc::sockaddr_un = zeroed(); let mut msg_name: libc::sockaddr_un = zeroed();
let mut msg = libc::msghdr { let mut msg: libc::msghdr = zeroed();
msg_name: &mut msg_name as *mut _ as *mut _, msg.msg_name = &mut msg_name as *mut _ as *mut _;
msg_namelen: size_of::<libc::sockaddr_un>() as libc::socklen_t, msg.msg_namelen = size_of::<libc::sockaddr_un>() as libc::socklen_t;
msg_iov: bufs.as_mut_ptr().cast(), msg.msg_iov = bufs.as_mut_ptr().cast();
msg_iovlen: bufs.len(), msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
msg_control: ancillary.buffer.as_mut_ptr().cast(), cfg_if::cfg_if! {
msg_controllen: ancillary.buffer.len(), if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg_flags: 0, msg.msg_iovlen = bufs.len() as libc::size_t;
}; msg.msg_controllen = ancillary.buffer.len() as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_iovlen = bufs.len() as libc::c_int;
msg.msg_controllen = ancillary.buffer.len() as libc::socklen_t;
}
}
let count = socket.recv_msg(&mut msg)?; let count = socket.recv_msg(&mut msg)?;
ancillary.length = msg.msg_controllen; ancillary.length = msg.msg_controllen as usize;
ancillary.truncated = msg.msg_flags & libc::MSG_CTRUNC == libc::MSG_CTRUNC; ancillary.truncated = msg.msg_flags & libc::MSG_CTRUNC == libc::MSG_CTRUNC;
let truncated = msg.msg_flags & libc::MSG_TRUNC == libc::MSG_TRUNC; let truncated = msg.msg_flags & libc::MSG_TRUNC == libc::MSG_TRUNC;
@ -52,15 +64,27 @@ pub(super) fn send_vectored_with_ancillary_to(
let (mut msg_name, msg_namelen) = let (mut msg_name, msg_namelen) =
if let Some(path) = path { sockaddr_un(path)? } else { (zeroed(), 0) }; if let Some(path) = path { sockaddr_un(path)? } else { (zeroed(), 0) };
let mut msg = libc::msghdr { let mut msg: libc::msghdr = zeroed();
msg_name: &mut msg_name as *mut _ as *mut _, msg.msg_name = &mut msg_name as *mut _ as *mut _;
msg_namelen, msg.msg_namelen = msg_namelen;
msg_iov: bufs.as_mut_ptr().cast(), msg.msg_iov = bufs.as_mut_ptr().cast();
msg_iovlen: bufs.len(), msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
msg_control: ancillary.buffer.as_mut_ptr().cast(), cfg_if::cfg_if! {
msg_controllen: ancillary.length, if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg_flags: 0, msg.msg_iovlen = bufs.len() as libc::size_t;
}; msg.msg_controllen = ancillary.length as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_iovlen = bufs.len() as libc::c_int;
msg.msg_controllen = ancillary.length as libc::socklen_t;
}
}
ancillary.truncated = false; ancillary.truncated = false;
@ -102,15 +126,22 @@ fn add_to_ancillary_data<T>(
*length = new_length; *length = new_length;
let msg = libc::msghdr { let mut msg: libc::msghdr = zeroed();
msg_name: null_mut(), msg.msg_control = buffer.as_mut_ptr().cast();
msg_namelen: 0, cfg_if::cfg_if! {
msg_iov: null_mut(), if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg_iovlen: 0, msg.msg_controllen = *length as libc::size_t;
msg_control: buffer.as_mut_ptr().cast(), } else if #[cfg(any(
msg_controllen: *length, target_os = "dragonfly",
msg_flags: 0, target_os = "emscripten",
}; target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_controllen = *length as libc::socklen_t;
}
}
let mut cmsg = libc::CMSG_FIRSTHDR(&msg); let mut cmsg = libc::CMSG_FIRSTHDR(&msg);
let mut previous_cmsg = cmsg; let mut previous_cmsg = cmsg;
@ -125,7 +156,20 @@ fn add_to_ancillary_data<T>(
(*previous_cmsg).cmsg_level = cmsg_level; (*previous_cmsg).cmsg_level = cmsg_level;
(*previous_cmsg).cmsg_type = cmsg_type; (*previous_cmsg).cmsg_type = cmsg_type;
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as usize; cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as libc::socklen_t;
}
}
let data = libc::CMSG_DATA(previous_cmsg).cast(); let data = libc::CMSG_DATA(previous_cmsg).cast();
@ -295,10 +339,23 @@ impl<'a> AncillaryData<'a> {
fn try_from_cmsghdr(cmsg: &'a libc::cmsghdr) -> Result<Self, AncillaryError> { fn try_from_cmsghdr(cmsg: &'a libc::cmsghdr) -> Result<Self, AncillaryError> {
unsafe { unsafe {
let cmsg_len_zero = libc::CMSG_LEN(0) as usize; cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
let cmsg_len_zero = libc::CMSG_LEN(0) as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
let cmsg_len_zero = libc::CMSG_LEN(0) as libc::socklen_t;
}
}
let data_len = (*cmsg).cmsg_len - cmsg_len_zero; let data_len = (*cmsg).cmsg_len - cmsg_len_zero;
let data = libc::CMSG_DATA(cmsg).cast(); let data = libc::CMSG_DATA(cmsg).cast();
let data = from_raw_parts(data, data_len); let data = from_raw_parts(data, data_len as usize);
match (*cmsg).cmsg_level { match (*cmsg).cmsg_level {
libc::SOL_SOCKET => match (*cmsg).cmsg_type { libc::SOL_SOCKET => match (*cmsg).cmsg_type {
@ -330,15 +387,22 @@ impl<'a> Iterator for Messages<'a> {
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
unsafe { unsafe {
let msg = libc::msghdr { let mut msg: libc::msghdr = zeroed();
msg_name: null_mut(), msg.msg_control = self.buffer.as_ptr() as *mut _;
msg_namelen: 0, cfg_if::cfg_if! {
msg_iov: null_mut(), if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg_iovlen: 0, msg.msg_controllen = self.buffer.len() as libc::size_t;
msg_control: self.buffer.as_ptr() as *mut _, } else if #[cfg(any(
msg_controllen: self.buffer.len(), target_os = "dragonfly",
msg_flags: 0, target_os = "emscripten",
}; target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_controllen = self.buffer.len() as libc::socklen_t;;
}
}
let cmsg = if let Some(current) = self.current { let cmsg = if let Some(current) = self.current {
libc::CMSG_NXTHDR(&msg, current) libc::CMSG_NXTHDR(&msg, current)