diff --git a/Cargo.toml b/Cargo.toml index 85ce27dd..4812f308 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ tokio = { version = "1.2", features = ["net", "rt", "sync"] } slab = "0.4.2" libc = "0.2.80" io-uring = "0.6.0" -socket2 = { version = "0.4.4", features = ["all"] } +socket2 = { version = "0.6.0", features = ["all"] } bytes = { version = "1.0", optional = true } futures-util = { version = "0.3.26", default-features = false, features = ["std"] } diff --git a/src/io/accept.rs b/src/io/accept.rs index d4e19d58..d70ffeb3 100644 --- a/src/io/accept.rs +++ b/src/io/accept.rs @@ -46,8 +46,10 @@ impl Completable for Accept { let fd = SharedFd::new(fd as i32); let socket = Socket { fd }; let (_, addr) = unsafe { - socket2::SockAddr::init(move |addr_storage, len| { - self.socketaddr.0.clone_into(&mut *addr_storage); + socket2::SockAddr::try_init(move |addr_storage, len| { + // SAFETY: socket2::SockAddrStorage contains + // libc::sockaddr_storage, so this cast is safe. + self.socketaddr.0.clone_into(&mut *addr_storage.cast()); *len = self.socketaddr.1; Ok(()) })? diff --git a/src/io/connect.rs b/src/io/connect.rs index 242aa981..f39d154c 100644 --- a/src/io/connect.rs +++ b/src/io/connect.rs @@ -26,7 +26,7 @@ impl Op { |connect| { opcode::Connect::new( types::Fd(connect.fd.raw_fd()), - connect.socket_addr.as_ptr(), + connect.socket_addr.as_ptr().cast(), connect.socket_addr.len(), ) .build() diff --git a/src/io/recv_from.rs b/src/io/recv_from.rs index e9b360ca..e20ff2bf 100644 --- a/src/io/recv_from.rs +++ b/src/io/recv_from.rs @@ -24,7 +24,7 @@ impl Op> { std::slice::from_raw_parts_mut(buf.stable_mut_ptr(), buf.bytes_total()) })]; - let socket_addr = Box::new(unsafe { SockAddr::init(|_, _| Ok(()))?.1 }); + let socket_addr = Box::new(unsafe { SockAddr::try_init(|_, _| Ok(()))?.1 }); let mut msghdr: Box = Box::new(unsafe { std::mem::zeroed() }); msghdr.msg_iov = io_slices.as_mut_ptr().cast(); diff --git a/src/io/recvmsg.rs b/src/io/recvmsg.rs index 3cae2e50..db2c6e7e 100644 --- a/src/io/recvmsg.rs +++ b/src/io/recvmsg.rs @@ -28,7 +28,7 @@ impl Op> { })); } - let socket_addr = Box::new(unsafe { SockAddr::init(|_, _| Ok(()))?.1 }); + let socket_addr = Box::new(unsafe { SockAddr::try_init(|_, _| Ok(()))?.1 }); let mut msghdr: Box = Box::new(unsafe { std::mem::zeroed() }); msghdr.msg_iov = io_slices.as_mut_ptr().cast(); diff --git a/src/io/shared_fd.rs b/src/io/shared_fd.rs index 0636fc46..77fb4160 100644 --- a/src/io/shared_fd.rs +++ b/src/io/shared_fd.rs @@ -3,7 +3,7 @@ use std::future::poll_fn; use std::{ cell::RefCell, io, - os::unix::io::{FromRawFd, RawFd}, + os::unix::io::{BorrowedFd, FromRawFd, RawFd}, rc::Rc, task::Waker, }; @@ -58,6 +58,12 @@ impl SharedFd { self.inner.fd } + pub(crate) fn fd(&self) -> BorrowedFd { + // SAFETY: we're ensuring the fd stays open as long as SharedFd is + // alive. + unsafe { BorrowedFd::borrow_raw(self.inner.fd) } + } + /// An FD cannot be closed until all in-flight operation have completed. /// This prevents bugs where in-flight reads could operate on the incorrect /// file descriptor. diff --git a/src/io/socket.rs b/src/io/socket.rs index 0b894eb1..1d1effe9 100644 --- a/src/io/socket.rs +++ b/src/io/socket.rs @@ -9,7 +9,7 @@ use crate::{ use std::{ io, net::SocketAddr, - os::unix::io::{AsRawFd, IntoRawFd, RawFd}, + os::unix::io::{AsFd, AsRawFd, BorrowedFd, IntoRawFd, RawFd}, path::Path, }; @@ -276,7 +276,7 @@ impl Socket { /// small packets. pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> { let socket_ref = socket2::SockRef::from(self); - socket_ref.set_nodelay(nodelay) + socket_ref.set_tcp_nodelay(nodelay) } } @@ -285,3 +285,9 @@ impl AsRawFd for Socket { self.fd.raw_fd() } } + +impl AsFd for Socket { + fn as_fd(&self) -> BorrowedFd { + self.fd.fd() + } +}