blob: 8642a8e285adb6ff39ad0a352b8769ceabde6948 [file] [log] [blame]
//! Portability abstractions over `Raw*`.
//!
//! On Unix, "everything is a file descriptor". On Windows, file/pipe/process
//! handles are distinct from socket descriptors. This file provides a minimal
//! layer of portability over this difference.
#[cfg(target_os = "hermit")]
use std::os::hermit::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(unix)]
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(target_os = "wasi")]
use std::os::wasi::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(windows)]
use std::os::windows::io::{
AsRawHandle, AsRawSocket, FromRawHandle, FromRawSocket, IntoRawHandle, IntoRawSocket,
RawHandle, RawSocket,
};
/// A raw filelike object.
///
/// This is a portability abstraction over Unix-like [`RawFd`] and
/// Windows' `RawHandle`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type RawFilelike = RawFd;
/// A raw filelike object.
///
/// This is a portability abstraction over Unix-like `RawFd` and
/// Windows' [`RawHandle`].
#[cfg(windows)]
pub type RawFilelike = RawHandle;
/// A raw socketlike object.
///
/// This is a portability abstraction over Unix-like [`RawFd`] and
/// Windows' `RawSocket`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type RawSocketlike = RawFd;
/// A raw socketlike object.
///
/// This is a portability abstraction over Unix-like `RawFd` and
/// Windows' [`RawSocket`].
#[cfg(windows)]
pub type RawSocketlike = RawSocket;
/// A portable trait to obtain the raw value of an underlying filelike object.
///
/// This is a portability abstraction over Unix-like [`AsRawFd`] and Windows'
/// `AsRawHandle`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait AsRawFilelike: AsRawFd {
/// Returns the raw value.
fn as_raw_filelike(&self) -> RawFilelike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: AsRawFd> AsRawFilelike for T {
#[inline]
fn as_raw_filelike(&self) -> RawFilelike {
self.as_raw_fd()
}
}
/// This is a portability abstraction over Unix-like `AsRawFd` and Windows'
/// [`AsRawHandle`].
#[cfg(windows)]
pub trait AsRawFilelike: AsRawHandle {
/// Returns the raw value.
fn as_raw_filelike(&self) -> RawFilelike;
}
#[cfg(windows)]
impl<T: AsRawHandle> AsRawFilelike for T {
#[inline]
fn as_raw_filelike(&self) -> RawFilelike {
self.as_raw_handle()
}
}
/// This is a portability abstraction over Unix-like [`AsRawFd`] and Windows'
/// `AsRawSocket`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait AsRawSocketlike: AsRawFd {
/// Returns the raw value.
fn as_raw_socketlike(&self) -> RawSocketlike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: AsRawFd> AsRawSocketlike for T {
#[inline]
fn as_raw_socketlike(&self) -> RawSocketlike {
self.as_raw_fd()
}
}
/// This is a portability abstraction over Unix-like `AsRawFd` and Windows'
/// [`AsRawSocket`].
#[cfg(windows)]
pub trait AsRawSocketlike: AsRawSocket {
/// Returns the raw value.
fn as_raw_socketlike(&self) -> RawSocketlike;
}
#[cfg(windows)]
impl<T: AsRawSocket> AsRawSocketlike for T {
#[inline]
fn as_raw_socketlike(&self) -> RawSocketlike {
self.as_raw_socket()
}
}
/// This is a portability abstraction over Unix-like [`IntoRawFd`] and Windows'
/// `IntoRawHandle`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait IntoRawFilelike: IntoRawFd {
/// Returns the raw value.
fn into_raw_filelike(self) -> RawFilelike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: IntoRawFd> IntoRawFilelike for T {
#[inline]
fn into_raw_filelike(self) -> RawFilelike {
self.into_raw_fd()
}
}
/// This is a portability abstraction over Unix-like `IntoRawFd` and Windows'
/// [`IntoRawHandle`].
#[cfg(windows)]
pub trait IntoRawFilelike: IntoRawHandle {
/// Returns the raw value.
fn into_raw_filelike(self) -> RawFilelike;
}
#[cfg(windows)]
impl<T: IntoRawHandle> IntoRawFilelike for T {
#[inline]
fn into_raw_filelike(self) -> RawFilelike {
self.into_raw_handle()
}
}
/// This is a portability abstraction over Unix-like [`IntoRawFd`] and Windows'
/// `IntoRawSocket`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait IntoRawSocketlike: IntoRawFd {
/// Returns the raw value.
fn into_raw_socketlike(self) -> RawSocketlike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: IntoRawFd> IntoRawSocketlike for T {
#[inline]
fn into_raw_socketlike(self) -> RawSocketlike {
self.into_raw_fd()
}
}
/// This is a portability abstraction over Unix-like `IntoRawFd` and Windows'
/// [`IntoRawSocket`].
#[cfg(windows)]
pub trait IntoRawSocketlike: IntoRawSocket {
/// Returns the raw value.
fn into_raw_socketlike(self) -> RawSocketlike;
}
#[cfg(windows)]
impl<T: IntoRawSocket> IntoRawSocketlike for T {
#[inline]
fn into_raw_socketlike(self) -> RawSocketlike {
self.into_raw_socket()
}
}
/// This is a portability abstraction over Unix-like [`FromRawFd`] and Windows'
/// `FromRawHandle`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait FromRawFilelike: FromRawFd {
/// Constructs `Self` from the raw value.
///
/// # Safety
///
/// This is `unsafe` for the same reason as [`from_raw_fd`] and
/// [`from_raw_handle`].
///
/// [`from_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.from_raw_fd
/// [`from_raw_handle`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.FromRawHandle.html#tymethod.from_raw_handle
unsafe fn from_raw_filelike(raw: RawFilelike) -> Self;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: FromRawFd> FromRawFilelike for T {
#[inline]
unsafe fn from_raw_filelike(raw: RawFilelike) -> Self {
Self::from_raw_fd(raw)
}
}
/// This is a portability abstraction over Unix-like `FromRawFd` and Windows'
/// [`FromRawHandle`].
#[cfg(windows)]
pub trait FromRawFilelike: FromRawHandle {
/// Constructs `Self` from the raw value.
unsafe fn from_raw_filelike(raw: RawFilelike) -> Self;
}
#[cfg(windows)]
impl<T: FromRawHandle> FromRawFilelike for T {
#[inline]
unsafe fn from_raw_filelike(raw: RawFilelike) -> Self {
Self::from_raw_handle(raw)
}
}
/// This is a portability abstraction over Unix-like [`FromRawFd`] and Windows'
/// `FromRawSocket`.
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait FromRawSocketlike: FromRawFd {
/// Constructs `Self` from the raw value.
///
/// # Safety
///
/// This is `unsafe` for the same reason as [`from_raw_fd`] and
/// [`from_raw_socket`].
///
/// [`from_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.from_raw_fd
/// [`from_raw_socket`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.FromRawSocket.html#tymethod.from_raw_socket
unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: FromRawFd> FromRawSocketlike for T {
#[inline]
unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self {
Self::from_raw_fd(raw)
}
}
/// This is a portability abstraction over Unix-like `FromRawFd` and Windows'
/// [`FromRawSocket`].
#[cfg(windows)]
pub trait FromRawSocketlike: FromRawSocket {
/// Constructs `Self` from the raw value.
unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self;
}
#[cfg(windows)]
impl<T: FromRawSocket> FromRawSocketlike for T {
#[inline]
unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self {
Self::from_raw_socket(raw)
}
}