diff --git a/Cargo.toml b/Cargo.toml index 8b43e51..89c3838 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ categories = ["network-programming"] description = "Small library to allow cross-platform handling of IP_PKTINFO and IPV6_PKTINFO with socket2 crate" [dependencies.socket2] -version = "0.5.8" +version = "0.6.0" features = ["all"] [target.'cfg(windows)'.dependencies.windows-sys] diff --git a/src/unix.rs b/src/unix.rs index 709bb80..f7a9db9 100644 --- a/src/unix.rs +++ b/src/unix.rs @@ -5,7 +5,7 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::os::unix::io::{AsRawFd, RawFd}; use std::{io, mem, ptr}; -use socket2::{Domain, Protocol, SockAddr, Socket, Type}; +use socket2::{Domain, Protocol, SockAddr, SockAddrStorage, Socket, Type}; use crate::PktInfo; @@ -133,7 +133,7 @@ impl PktInfoUdpSocket { } pub fn recv(&self, buf: &mut [u8]) -> io::Result<(usize, PktInfo)> { - let mut addr_src: MaybeUninit = MaybeUninit::uninit(); + let mut addr_src = SockAddrStorage::zeroed(); let mut msg_iov = IoSliceMut::new(buf); let mut cmsg = { let space = if self.domain == Domain::IPV4 { @@ -151,7 +151,7 @@ impl PktInfoUdpSocket { let mut mhdr = unsafe { let mut mhdr = MaybeUninit::::zeroed(); let p = mhdr.as_mut_ptr(); - (*p).msg_name = addr_src.as_mut_ptr() as *mut libc::c_void; + (*p).msg_name = addr_src.view_as::(); (*p).msg_namelen = mem::size_of::() as libc::socklen_t; (*p).msg_iov = &mut msg_iov as *mut IoSliceMut as *mut libc::iovec; (*p).msg_iovlen = 1; @@ -167,14 +167,8 @@ impl PktInfoUdpSocket { return Err(Error::last_os_error()); } - let addr_src = unsafe { - SockAddr::new( - addr_src.assume_init(), - mem::size_of::() as _, - ) - } - .as_socket() - .unwrap(); + let len = addr_src.size_of(); + let addr_src = unsafe { SockAddr::new(addr_src, len) }.as_socket().unwrap(); let mut header = if mhdr.msg_controllen > 0 { debug_assert!(!mhdr.msg_control.is_null()); diff --git a/src/win.rs b/src/win.rs index 70e4006..dfee078 100644 --- a/src/win.rs +++ b/src/win.rs @@ -4,7 +4,7 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::os::windows::io::{AsRawSocket, RawSocket}; use std::{io, mem, ptr}; -use socket2::{Domain, Protocol, SockAddr, Socket, Type}; +use socket2::{Domain, Protocol, SockAddr, SockAddrStorage, Socket, Type}; use windows_sys::core::{PCSTR, PSTR}; use windows_sys::Win32::Networking::WinSock::{ self, CMSGHDR, IN6_PKTINFO, IN_PKTINFO, IPPROTO_IP, IPPROTO_IPV6, IPV6_PKTINFO, IP_PKTINFO, @@ -196,10 +196,10 @@ impl PktInfoUdpSocket { }, }; - let mut addr = unsafe { mem::zeroed() }; + let mut addr = SockAddrStorage::zeroed(); let mut wsa_msg = WSAMSG { name: &mut addr as *mut _ as *mut _, - namelen: mem::size_of_val(&addr) as i32, + namelen: addr.size_of(), lpBuffers: &mut data, Control: control, dwBufferCount: 1, @@ -223,9 +223,8 @@ impl PktInfoUdpSocket { return Err(io::Error::last_os_error()); } - let addr_src = unsafe { SockAddr::new(addr, mem::size_of_val(&addr) as i32) } - .as_socket() - .unwrap(); + let len = addr.size_of(); + let addr_src = unsafe { SockAddr::new(addr, len) }.as_socket().unwrap(); let mut info: Option = None;