diff --git a/tokio/src/doc/os.rs b/tokio/src/doc/os.rs index 0ddf86959b8..4365150f645 100644 --- a/tokio/src/doc/os.rs +++ b/tokio/src/doc/os.rs @@ -13,7 +13,7 @@ pub mod windows { /// See [std::os::windows::io::AsRawHandle](https://doc.rust-lang.org/std/os/windows/io/trait.AsRawHandle.html) pub trait AsRawHandle { - /// See [std::os::windows::io::FromRawHandle::from_raw_handle](https://doc.rust-lang.org/std/os/windows/io/trait.AsRawHandle.html#tymethod.as_raw_handle) + /// See [std::os::windows::io::AsRawHandle::as_raw_handle](https://doc.rust-lang.org/std/os/windows/io/trait.AsRawHandle.html#tymethod.as_raw_handle) fn as_raw_handle(&self) -> RawHandle; } @@ -22,5 +22,14 @@ pub mod windows { /// See [std::os::windows::io::FromRawHandle::from_raw_handle](https://doc.rust-lang.org/std/os/windows/io/trait.FromRawHandle.html#tymethod.from_raw_handle) unsafe fn from_raw_handle(handle: RawHandle) -> Self; } + + /// See [std::os::windows::io::BorrowedHandle](https://doc.rust-lang.org/std/os/windows/io/struct.BorrowedHandle.html) + pub type BorrowedHandle<'handle> = crate::doc::NotDefinedHere; + + /// See [std::os::windows::io::AsHandle](https://doc.rust-lang.org/std/os/windows/io/trait.AsHandle.html) + pub trait AsHandle { + /// See [std::os::windows::io::AsHandle::as_handle](https://doc.rust-lang.org/std/os/windows/io/trait.AsHandle.html#tymethod.as_handle) + fn as_handle(&self) -> BorrowedHandle<'_>; + } } } diff --git a/tokio/src/io/async_fd.rs b/tokio/src/io/async_fd.rs index b71bcd56e70..c73227bfbbc 100644 --- a/tokio/src/io/async_fd.rs +++ b/tokio/src/io/async_fd.rs @@ -516,6 +516,13 @@ impl AsRawFd for AsyncFd { } } +#[cfg(not(tokio_no_as_fd))] +impl std::os::unix::io::AsFd for AsyncFd { + fn as_fd(&self) -> std::os::unix::io::BorrowedFd<'_> { + unsafe { std::os::unix::io::BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + impl std::fmt::Debug for AsyncFd { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("AsyncFd") diff --git a/tokio/src/io/stderr.rs b/tokio/src/io/stderr.rs index 2f624fba9d6..565d9b61c80 100644 --- a/tokio/src/io/stderr.rs +++ b/tokio/src/io/stderr.rs @@ -74,16 +74,46 @@ cfg_io_std! { } #[cfg(unix)] -impl std::os::unix::io::AsRawFd for Stderr { - fn as_raw_fd(&self) -> std::os::unix::io::RawFd { - std::io::stderr().as_raw_fd() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::unix::io::{AsFd, BorrowedFd}; + use std::os::unix::io::{AsRawFd, RawFd}; + + use super::Stderr; + + impl AsRawFd for Stderr { + fn as_raw_fd(&self) -> RawFd { + std::io::stderr().as_raw_fd() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for Stderr { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } } } #[cfg(windows)] -impl std::os::windows::io::AsRawHandle for Stderr { - fn as_raw_handle(&self) -> std::os::windows::io::RawHandle { - std::io::stderr().as_raw_handle() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::windows::io::{AsHandle, BorrowedHandle}; + use std::os::windows::io::{AsRawHandle, RawHandle}; + + use super::Stderr; + + impl AsRawHandle for Stderr { + fn as_raw_handle(&self) -> RawHandle { + std::io::stderr().as_raw_handle() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for Stderr { + fn as_handle(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } + } } } diff --git a/tokio/src/io/stdin.rs b/tokio/src/io/stdin.rs index c9578f17b64..2c4abb4eaab 100644 --- a/tokio/src/io/stdin.rs +++ b/tokio/src/io/stdin.rs @@ -49,16 +49,46 @@ cfg_io_std! { } #[cfg(unix)] -impl std::os::unix::io::AsRawFd for Stdin { - fn as_raw_fd(&self) -> std::os::unix::io::RawFd { - std::io::stdin().as_raw_fd() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::unix::io::{AsFd, BorrowedFd}; + use std::os::unix::io::{AsRawFd, RawFd}; + + use super::Stdin; + + impl AsRawFd for Stdin { + fn as_raw_fd(&self) -> RawFd { + std::io::stdin().as_raw_fd() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for Stdin { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } } } #[cfg(windows)] -impl std::os::windows::io::AsRawHandle for Stdin { - fn as_raw_handle(&self) -> std::os::windows::io::RawHandle { - std::io::stdin().as_raw_handle() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::windows::io::{AsHandle, BorrowedHandle}; + use std::os::windows::io::{AsRawHandle, RawHandle}; + + use super::Stdin; + + impl AsRawHandle for Stdin { + fn as_raw_handle(&self) -> RawHandle { + std::io::stdin().as_raw_handle() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for Stdin { + fn as_handle(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } + } } } diff --git a/tokio/src/io/stdout.rs b/tokio/src/io/stdout.rs index a08ed01eede..d957ddb2a11 100644 --- a/tokio/src/io/stdout.rs +++ b/tokio/src/io/stdout.rs @@ -73,16 +73,46 @@ cfg_io_std! { } #[cfg(unix)] -impl std::os::unix::io::AsRawFd for Stdout { - fn as_raw_fd(&self) -> std::os::unix::io::RawFd { - std::io::stdout().as_raw_fd() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::unix::io::{AsFd, BorrowedFd}; + use std::os::unix::io::{AsRawFd, RawFd}; + + use super::Stdout; + + impl AsRawFd for Stdout { + fn as_raw_fd(&self) -> RawFd { + std::io::stdout().as_raw_fd() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for Stdout { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } } } #[cfg(windows)] -impl std::os::windows::io::AsRawHandle for Stdout { - fn as_raw_handle(&self) -> std::os::windows::io::RawHandle { - std::io::stdout().as_raw_handle() +mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::windows::io::{AsHandle, BorrowedHandle}; + use std::os::windows::io::{AsRawHandle, RawHandle}; + + use super::Stdout; + + impl AsRawHandle for Stdout { + fn as_raw_handle(&self) -> RawHandle { + std::io::stdout().as_raw_handle() + } + } + + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for Stdout { + fn as_handle(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } + } } } diff --git a/tokio/src/net/windows/named_pipe.rs b/tokio/src/net/windows/named_pipe.rs index 5f6cba1c9d8..91f016267ca 100644 --- a/tokio/src/net/windows/named_pipe.rs +++ b/tokio/src/net/windows/named_pipe.rs @@ -10,6 +10,8 @@ use std::ptr; use std::task::{Context, Poll}; use crate::io::{AsyncRead, AsyncWrite, Interest, PollEvented, ReadBuf, Ready}; +#[cfg(not(tokio_no_as_fd))] +use crate::os::windows::io::{AsHandle, BorrowedHandle}; use crate::os::windows::io::{AsRawHandle, FromRawHandle, RawHandle}; cfg_io_util! { @@ -928,6 +930,13 @@ impl AsRawHandle for NamedPipeServer { } } +#[cfg(not(tokio_no_as_fd))] +impl AsHandle for NamedPipeServer { + fn as_handle(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } + } +} + /// A [Windows named pipe] client. /// /// Constructed using [`ClientOptions::open`]. @@ -1711,6 +1720,13 @@ impl AsRawHandle for NamedPipeClient { } } +#[cfg(not(tokio_no_as_fd))] +impl AsHandle for NamedPipeClient { + fn as_handle(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } + } +} + /// A builder structure for construct a named pipe with named pipe-specific /// options. This is required to use for named pipe servers who wants to modify /// pipe-related options.