From 8c7697d17c9c1e31c61189e404002c33a43a4739 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 13 Oct 2023 18:06:11 -0700 Subject: [PATCH] Implement `AsFd`/`AsSocket`/etc. conversions Generally these should be implemented anywhere the raw versions are. --- x11rb/src/rust_connection/stream.rs | 36 ++++++++++++++++++++++++++--- x11rb/src/xcb_ffi/mod.rs | 9 +++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/x11rb/src/rust_connection/stream.rs b/x11rb/src/rust_connection/stream.rs index 9e95d44f..569417fe 100644 --- a/x11rb/src/rust_connection/stream.rs +++ b/x11rb/src/rust_connection/stream.rs @@ -2,11 +2,13 @@ use rustix::fd::AsFd; use std::io::{IoSlice, Result}; use std::net::TcpStream; #[cfg(unix)] -use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd}; +use std::os::unix::io::{AsRawFd, BorrowedFd, IntoRawFd, OwnedFd, RawFd}; #[cfg(unix)] use std::os::unix::net::UnixStream; #[cfg(windows)] -use std::os::windows::io::{AsRawSocket, IntoRawSocket, RawSocket}; +use std::os::windows::io::{ + AsRawSocket, AsSocket, BorrowedSocket, IntoRawSocket, OwnedSocket, RawSocket, +}; use crate::utils::RawFdContainer; use x11rb_protocol::parse_display::ConnectAddress; @@ -222,6 +224,7 @@ impl DefaultStream { Ok((result, peer_addr::local())) } + #[allow(unused_qualifications)] fn as_fd(&self) -> rustix::fd::BorrowedFd<'_> { self.inner.as_fd() } @@ -234,6 +237,13 @@ impl AsRawFd for DefaultStream { } } +#[cfg(unix)] +impl AsFd for DefaultStream { + fn as_fd(&self) -> BorrowedFd<'_> { + self.inner.as_fd() + } +} + #[cfg(unix)] impl IntoRawFd for DefaultStream { fn into_raw_fd(self) -> RawFd { @@ -241,6 +251,13 @@ impl IntoRawFd for DefaultStream { } } +#[cfg(unix)] +impl From for OwnedFd { + fn from(stream: DefaultStream) -> Self { + stream.inner + } +} + #[cfg(windows)] impl AsRawSocket for DefaultStream { fn as_raw_socket(&self) -> RawSocket { @@ -248,6 +265,13 @@ impl AsRawSocket for DefaultStream { } } +#[cfg(windows)] +impl AsSocket for DefaultStream { + fn as_socket(&self) -> BorrowedSocket<'_> { + self.inner.as_socket() + } +} + #[cfg(windows)] impl IntoRawSocket for DefaultStream { fn into_raw_socket(self) -> RawSocket { @@ -255,13 +279,19 @@ impl IntoRawSocket for DefaultStream { } } +#[cfg(windows)] +impl From for OwnedSocket { + fn from(stream: DefaultStream) -> Self { + stream.inner.into() + } +} + #[cfg(unix)] fn do_write( stream: &DefaultStream, bufs: &[IoSlice<'_>], fds: &mut Vec, ) -> Result { - use rustix::fd::BorrowedFd; use rustix::io::Errno; use rustix::net::{sendmsg, SendAncillaryBuffer, SendAncillaryMessage, SendFlags}; diff --git a/x11rb/src/xcb_ffi/mod.rs b/x11rb/src/xcb_ffi/mod.rs index c347132c..7cbded96 100644 --- a/x11rb/src/xcb_ffi/mod.rs +++ b/x11rb/src/xcb_ffi/mod.rs @@ -7,7 +7,7 @@ use std::ffi::CStr; use std::io::{Error as IOError, ErrorKind, IoSlice}; use std::os::raw::c_int; #[cfg(unix)] -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; +use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; use std::ptr::{null, null_mut}; use std::sync::{atomic::Ordering, Mutex}; @@ -595,6 +595,13 @@ impl AsRawFd for XCBConnection { } } +#[cfg(unix)] +impl AsFd for XCBConnection { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + // SAFETY: We provide a valid xcb_connection_t that is valid for as long as required by the trait. unsafe impl as_raw_xcb_connection::AsRawXcbConnection for XCBConnection { fn as_raw_xcb_connection(&self) -> *mut as_raw_xcb_connection::xcb_connection_t {