about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorLinkTed <LinkTed@users.noreply.github.com>2020-09-25 20:19:02 +0200
committerLinkTed <LinkTed@users.noreply.github.com>2020-10-10 15:19:13 +0200
commitce167f8be7cad4140628771f7d37cde59d76936f (patch)
tree21746bde5490138fa427108fa661e7df01ea4c3f /library/std/src
parent889c9272cb670891ed3b2dca4aef4f333110fee7 (diff)
downloadrust-ce167f8be7cad4140628771f7d37cde59d76936f.tar.gz
rust-ce167f8be7cad4140628771f7d37cde59d76936f.zip
Fix type mismatching for different OSes.
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/sys/unix/ext/net/ancillary.rs146
1 files changed, 105 insertions, 41 deletions
diff --git a/library/std/src/sys/unix/ext/net/ancillary.rs b/library/std/src/sys/unix/ext/net/ancillary.rs
index 112d72dc29b..c53b213e0f9 100644
--- a/library/std/src/sys/unix/ext/net/ancillary.rs
+++ b/library/std/src/sys/unix/ext/net/ancillary.rs
@@ -4,7 +4,7 @@ use crate::marker::PhantomData;
 use crate::mem::{size_of, zeroed};
 use crate::os::unix::io::RawFd;
 use crate::path::Path;
-use crate::ptr::{null_mut, read_unaligned};
+use crate::ptr::read_unaligned;
 use crate::slice::from_raw_parts;
 use crate::sys::unix::ext::net::addr::{sockaddr_un, SocketAddr};
 use crate::sys::unix::net::Socket;
@@ -20,19 +20,31 @@ pub(super) fn recv_vectored_with_ancillary_from(
     unsafe {
         let mut msg_name: libc::sockaddr_un = zeroed();
 
-        let mut msg = libc::msghdr {
-            msg_name: &mut msg_name as *mut _ as *mut _,
-            msg_namelen: size_of::<libc::sockaddr_un>() as libc::socklen_t,
-            msg_iov: bufs.as_mut_ptr().cast(),
-            msg_iovlen: bufs.len(),
-            msg_control: ancillary.buffer.as_mut_ptr().cast(),
-            msg_controllen: ancillary.buffer.len(),
-            msg_flags: 0,
-        };
+        let mut msg: libc::msghdr = zeroed();
+        msg.msg_name = &mut msg_name as *mut _ as *mut _;
+        msg.msg_namelen = size_of::<libc::sockaddr_un>() as libc::socklen_t;
+        msg.msg_iov = bufs.as_mut_ptr().cast();
+        msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
+        cfg_if::cfg_if! {
+            if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
+                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)?;
 
-        ancillary.length = msg.msg_controllen;
+        ancillary.length = msg.msg_controllen as usize;
         ancillary.truncated = msg.msg_flags & libc::MSG_CTRUNC == libc::MSG_CTRUNC;
 
         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) =
             if let Some(path) = path { sockaddr_un(path)? } else { (zeroed(), 0) };
 
-        let mut msg = libc::msghdr {
-            msg_name: &mut msg_name as *mut _ as *mut _,
-            msg_namelen,
-            msg_iov: bufs.as_mut_ptr().cast(),
-            msg_iovlen: bufs.len(),
-            msg_control: ancillary.buffer.as_mut_ptr().cast(),
-            msg_controllen: ancillary.length,
-            msg_flags: 0,
-        };
+        let mut msg: libc::msghdr = zeroed();
+        msg.msg_name = &mut msg_name as *mut _ as *mut _;
+        msg.msg_namelen = msg_namelen;
+        msg.msg_iov = bufs.as_mut_ptr().cast();
+        msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
+        cfg_if::cfg_if! {
+            if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
+                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;
 
@@ -102,15 +126,22 @@ fn add_to_ancillary_data<T>(
 
         *length = new_length;
 
-        let msg = libc::msghdr {
-            msg_name: null_mut(),
-            msg_namelen: 0,
-            msg_iov: null_mut(),
-            msg_iovlen: 0,
-            msg_control: buffer.as_mut_ptr().cast(),
-            msg_controllen: *length,
-            msg_flags: 0,
-        };
+        let mut msg: libc::msghdr = zeroed();
+        msg.msg_control = buffer.as_mut_ptr().cast();
+        cfg_if::cfg_if! {
+            if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
+                msg.msg_controllen = *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_controllen = *length as libc::socklen_t;
+            }
+        }
 
         let mut cmsg = libc::CMSG_FIRSTHDR(&msg);
         let mut previous_cmsg = cmsg;
@@ -125,7 +156,20 @@ fn add_to_ancillary_data<T>(
 
         (*previous_cmsg).cmsg_level = cmsg_level;
         (*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();
 
@@ -295,10 +339,23 @@ impl<'a> AncillaryData<'a> {
 
     fn try_from_cmsghdr(cmsg: &'a libc::cmsghdr) -> Result<Self, AncillaryError> {
         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 = 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 {
                 libc::SOL_SOCKET => match (*cmsg).cmsg_type {
@@ -330,15 +387,22 @@ impl<'a> Iterator for Messages<'a> {
 
     fn next(&mut self) -> Option<Self::Item> {
         unsafe {
-            let msg = libc::msghdr {
-                msg_name: null_mut(),
-                msg_namelen: 0,
-                msg_iov: null_mut(),
-                msg_iovlen: 0,
-                msg_control: self.buffer.as_ptr() as *mut _,
-                msg_controllen: self.buffer.len(),
-                msg_flags: 0,
-            };
+            let mut msg: libc::msghdr = zeroed();
+            msg.msg_control = self.buffer.as_ptr() as *mut _;
+            cfg_if::cfg_if! {
+                if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
+                    msg.msg_controllen = self.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_controllen = self.buffer.len() as libc::socklen_t;;
+                }
+            }
 
             let cmsg = if let Some(current) = self.current {
                 libc::CMSG_NXTHDR(&msg, current)