#[cfg(not(windows))]
use crate::os::posish::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
use crate::OwnsRaw;
#[cfg(feature = "os_pipe")]
use os_pipe::{PipeReader, PipeWriter};
#[cfg(unix)]
use std::os::unix::net::UnixStream;
use std::{
fmt,
fs::File,
io::{self, IoSlice, IoSliceMut, Read, Write},
marker::PhantomData,
mem::ManuallyDrop,
net::{TcpListener, TcpStream, UdpSocket},
ops::{Deref, DerefMut},
};
#[cfg(windows)]
use {
crate::os::windows::{
AsRawHandleOrSocket, FromRawHandleOrSocket, IntoRawHandleOrSocket, RawEnum,
RawHandleOrSocket,
},
std::os::windows::io::{
AsRawHandle, AsRawSocket, FromRawHandle, FromRawSocket, IntoRawHandle, IntoRawSocket,
RawHandle, RawSocket,
},
};
#[allow(clippy::module_name_repetitions)]
pub unsafe trait AsUnsafeHandle {
fn as_unsafe_handle(&self) -> UnsafeHandle;
#[inline]
fn eq_handle<Handlelike: AsUnsafeHandle>(&self, other: &Handlelike) -> bool {
unsafe { self.as_unsafe_handle().eq(other.as_unsafe_handle()) }
}
}
#[allow(clippy::module_name_repetitions)]
pub unsafe trait IntoUnsafeHandle {
fn into_unsafe_handle(self) -> UnsafeHandle;
}
#[allow(clippy::module_name_repetitions)]
pub trait FromUnsafeHandle {
unsafe fn from_unsafe_handle(unsafe_handle: UnsafeHandle) -> Self;
}
pub unsafe trait AsUnsafeFile: AsUnsafeHandle {
fn as_unsafe_file(&self) -> UnsafeFile;
#[inline]
fn as_file_view(&self) -> View<'_, File> {
let unsafe_file = self.as_unsafe_file();
let file = unsafe { File::from_unsafe_file(unsafe_file) };
View::new(file)
}
#[inline]
unsafe fn as_unscoped_file_view(&self) -> View<'static, File> {
let unsafe_file = self.as_unsafe_file();
let file = File::from_unsafe_file(unsafe_file);
View::new(file)
}
#[cfg(feature = "os_pipe")]
#[inline]
fn as_pipe_reader_view(&self) -> View<'_, PipeReader> {
let unsafe_file = self.as_unsafe_file();
let file = unsafe { PipeReader::from_unsafe_file(unsafe_file) };
View::new(file)
}
#[cfg(feature = "os_pipe")]
#[inline]
unsafe fn as_unscoped_pipe_reader_view(&self) -> View<'static, PipeReader> {
let unsafe_file = self.as_unsafe_file();
let file = PipeReader::from_unsafe_file(unsafe_file);
View::new(file)
}
#[cfg(feature = "os_pipe")]
#[inline]
fn as_pipe_writer_view(&self) -> View<'_, PipeWriter> {
let unsafe_file = self.as_unsafe_file();
let file = unsafe { PipeWriter::from_unsafe_file(unsafe_file) };
View::new(file)
}
#[cfg(feature = "os_pipe")]
#[inline]
unsafe fn as_unscoped_pipe_writer_view(&self) -> View<'static, PipeWriter> {
let unsafe_file = self.as_unsafe_file();
let file = PipeWriter::from_unsafe_file(unsafe_file);
View::new(file)
}
#[cfg(all(unix, feature = "use_mio_os_ext"))]
#[inline]
fn as_mio_pipe_receiver(&self) -> View<'_, mio::unix::pipe::Receiver> {
let unsafe_file = self.as_unsafe_file();
let file = unsafe { mio::unix::pipe::Receiver::from_unsafe_file(unsafe_file) };
View::new(file)
}
#[cfg(all(unix, feature = "use_mio_os_ext"))]
#[inline]
unsafe fn as_unscoped_mio_pipe_receiver_view(
&self,
) -> View<'static, mio::unix::pipe::Receiver> {
let unsafe_file = self.as_unsafe_file();
let file = mio::unix::pipe::Receiver::from_unsafe_file(unsafe_file);
View::new(file)
}
#[cfg(all(unix, feature = "use_mio_os_ext"))]
#[inline]
fn as_mio_pipe_sender_view(&self) -> View<'_, mio::unix::pipe::Sender> {
let unsafe_file = self.as_unsafe_file();
let file = unsafe { mio::unix::pipe::Sender::from_unsafe_file(unsafe_file) };
View::new(file)
}
#[cfg(all(unix, feature = "use_mio_os_ext"))]
#[inline]
unsafe fn as_unscoped_mio_pipe_sender_view(&self) -> View<'static, mio::unix::pipe::Sender> {
let unsafe_file = self.as_unsafe_file();
let file = mio::unix::pipe::Sender::from_unsafe_file(unsafe_file);
View::new(file)
}
#[inline]
fn eq_file<Filelike: AsUnsafeFile>(&self, other: &Filelike) -> bool {
unsafe { self.as_unsafe_handle().eq(other.as_unsafe_handle()) }
}
}
pub unsafe trait IntoUnsafeFile: IntoUnsafeHandle {
fn into_unsafe_file(self) -> UnsafeFile;
}
pub trait FromUnsafeFile {
unsafe fn from_unsafe_file(unsafe_file: UnsafeFile) -> Self;
#[inline]
fn from_filelike<Filelike: IntoUnsafeFile>(filelike: Filelike) -> Self
where
Self: Sized,
{
let unsafe_file = filelike.into_unsafe_file();
unsafe { Self::from_unsafe_file(unsafe_file) }
}
}
pub unsafe trait AsUnsafeSocket: AsUnsafeHandle {
fn as_unsafe_socket(&self) -> UnsafeSocket;
#[inline]
fn as_tcp_stream_view(&self) -> View<'_, TcpStream> {
let unsafe_socket = self.as_unsafe_socket();
let tcp_stream = unsafe { TcpStream::from_unsafe_socket(unsafe_socket) };
View::new(tcp_stream)
}
#[inline]
unsafe fn as_unscoped_tcp_stream_view(&self) -> View<'static, TcpStream> {
let unsafe_socket = self.as_unsafe_socket();
let tcp_stream = TcpStream::from_unsafe_socket(unsafe_socket);
View::new(tcp_stream)
}
#[inline]
fn as_tcp_listener_view(&self) -> View<'_, TcpListener> {
let unsafe_socket = self.as_unsafe_socket();
let tcp_listener = unsafe { TcpListener::from_unsafe_socket(unsafe_socket) };
View::new(tcp_listener)
}
#[inline]
unsafe fn as_unscoped_tcp_listener_view(&self) -> View<'static, TcpListener> {
let unsafe_socket = self.as_unsafe_socket();
let tcp_listener = TcpListener::from_unsafe_socket(unsafe_socket);
View::new(tcp_listener)
}
#[inline]
fn as_udp_socket_view(&self) -> View<'_, UdpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let udp_socket = unsafe { UdpSocket::from_unsafe_socket(unsafe_socket) };
View::new(udp_socket)
}
#[inline]
unsafe fn as_unscoped_udp_socket_view(&self) -> View<'static, UdpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let udp_socket = UdpSocket::from_unsafe_socket(unsafe_socket);
View::new(udp_socket)
}
#[cfg(unix)]
#[inline]
fn as_unix_stream_view(&self) -> View<'_, UnixStream> {
let unsafe_socket = self.as_unsafe_socket();
let unix_stream = unsafe { UnixStream::from_unsafe_socket(unsafe_socket) };
View::new(unix_stream)
}
#[cfg(unix)]
#[inline]
unsafe fn as_unscoped_unix_stream_view(&self) -> View<'static, UnixStream> {
let unsafe_socket = self.as_unsafe_socket();
let unix_stream = UnixStream::from_unsafe_socket(unsafe_socket);
View::new(unix_stream)
}
#[cfg(feature = "socket2")]
#[inline]
fn as_socket2_socket_view(&self) -> View<'_, socket2::Socket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { socket2::Socket::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(feature = "socket2")]
#[inline]
unsafe fn as_unscoped_socket2_socket_view(&self) -> View<'static, socket2::Socket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = socket2::Socket::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
fn as_mio_tcp_listener_view(&self) -> View<'_, mio::net::TcpListener> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::TcpListener::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
unsafe fn as_unscoped_mio_tcp_listener_view(&self) -> View<'static, mio::net::TcpListener> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::TcpListener::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
fn as_mio_tcp_socket_view(&self) -> View<'_, mio::net::TcpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::TcpSocket::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
unsafe fn as_unscoped_mio_tcp_socket_view(&self) -> View<'static, mio::net::TcpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::TcpSocket::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
fn as_mio_tcp_stream_view(&self) -> View<'_, mio::net::TcpStream> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::TcpStream::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
unsafe fn as_unscoped_mio_tcp_stream_view(&self) -> View<'static, mio::net::TcpStream> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::TcpStream::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
fn as_mio_udp_socket_view(&self) -> View<'_, mio::net::UdpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::UdpSocket::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(feature = "use_mio_net")]
#[inline]
unsafe fn as_unscoped_mio_udp_socket_view(&self) -> View<'static, mio::net::UdpSocket> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::UdpSocket::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
fn as_mio_unix_datagram_view(&self) -> View<'_, mio::net::UnixDatagram> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::UnixDatagram::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
unsafe fn as_unscoped_mio_unix_datagram_view(&self) -> View<'static, mio::net::UnixDatagram> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::UnixDatagram::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
fn as_mio_unix_listener_view(&self) -> View<'_, mio::net::UnixListener> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::UnixListener::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
unsafe fn as_unscoped_mio_unix_listener_view(&self) -> View<'static, mio::net::UnixListener> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::UnixListener::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
fn as_mio_unix_stream_view(&self) -> View<'_, mio::net::UnixStream> {
let unsafe_socket = self.as_unsafe_socket();
let socket = unsafe { mio::net::UnixStream::from_unsafe_socket(unsafe_socket) };
View::new(socket)
}
#[cfg(all(unix, feature = "use_mio_net"))]
#[inline]
unsafe fn as_unscoped_mio_unix_stream_view(&self) -> View<'static, mio::net::UnixStream> {
let unsafe_socket = self.as_unsafe_socket();
let socket = mio::net::UnixStream::from_unsafe_socket(unsafe_socket);
View::new(socket)
}
#[inline]
fn eq_socket<Socketlike: AsUnsafeSocket>(&self, other: &Socketlike) -> bool {
unsafe { self.as_unsafe_handle().eq(other.as_unsafe_handle()) }
}
}
pub unsafe trait IntoUnsafeSocket: IntoUnsafeHandle {
fn into_unsafe_socket(self) -> UnsafeSocket;
}
pub trait FromUnsafeSocket {
unsafe fn from_unsafe_socket(unsafe_socket: UnsafeSocket) -> Self;
#[inline]
fn from_socketlike<Socketlike: IntoUnsafeSocket>(socketlike: Socketlike) -> Self
where
Self: Sized,
{
let unsafe_socket = socketlike.into_unsafe_socket();
unsafe { Self::from_unsafe_socket(unsafe_socket) }
}
}
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct UnsafeHandle(InnerFileOrSocket);
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct UnsafeFile(InnerFile);
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct UnsafeSocket(InnerSocket);
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct UnsafeReadable(InnerFileOrSocket);
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct UnsafeWriteable(InnerFileOrSocket);
#[cfg(not(windows))]
type InnerFileOrSocket = RawFd;
#[cfg(not(windows))]
type InnerFile = RawFd;
#[cfg(not(windows))]
type InnerSocket = RawFd;
#[cfg(windows)]
type InnerFileOrSocket = RawHandleOrSocket;
#[cfg(windows)]
type InnerFile = RawHandle;
#[cfg(windows)]
type InnerSocket = RawSocket;
pub struct View<'resource, Target: AsUnsafeHandle> {
target: ManuallyDrop<Target>,
_phantom_data: PhantomData<&'resource ()>,
}
impl<Target: AsUnsafeHandle> View<'_, Target> {
#[inline]
fn new(target: Target) -> Self {
Self {
target: ManuallyDrop::new(target),
_phantom_data: PhantomData,
}
}
}
impl<Target: AsUnsafeHandle> Deref for View<'_, Target> {
type Target = Target;
#[inline]
fn deref(&self) -> &Self::Target {
&self.target
}
}
impl<Target: AsUnsafeHandle> DerefMut for View<'_, Target> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.target
}
}
impl<Target: AsUnsafeHandle + fmt::Debug> fmt::Debug for View<'_, Target> {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("View").field("target", &*self).finish()
}
}
impl UnsafeHandle {
#[inline]
#[must_use]
pub const unsafe fn as_readable(self) -> UnsafeReadable {
UnsafeReadable(self.0)
}
#[inline]
#[must_use]
pub const unsafe fn as_writeable(self) -> UnsafeWriteable {
UnsafeWriteable(self.0)
}
#[inline]
#[must_use]
pub unsafe fn eq(self, other: Self) -> bool {
PartialEq::eq(&self.0, &other.0)
}
#[cfg(not(windows))]
#[inline]
#[must_use]
pub const fn unowned_from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
#[cfg(windows)]
#[inline]
pub const fn unowned_from_raw_handle(raw_handle: RawHandle) -> Self {
Self(RawHandleOrSocket::unowned_from_raw_handle(raw_handle))
}
#[cfg(windows)]
#[inline]
#[must_use]
pub const fn unowned_from_raw_socket(raw_socket: RawSocket) -> Self {
Self(RawHandleOrSocket::unowned_from_raw_socket(raw_socket))
}
#[cfg(windows)]
#[inline]
#[must_use]
pub const fn unowned_from_raw_handle_or_socket(
raw_handle_or_socket: RawHandleOrSocket,
) -> Self {
Self(raw_handle_or_socket)
}
}
#[cfg(not(windows))]
impl UnsafeFile {
#[inline]
#[must_use]
pub const fn as_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_fd(self.0)
}
#[inline]
#[must_use]
pub const fn into_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_fd(self.0)
}
#[inline]
#[must_use]
pub const fn as_unowned_raw_fd(self) -> RawFd {
self.0
}
#[inline]
#[must_use]
pub const fn into_unowned_raw_fd(self) -> RawFd {
self.0
}
#[inline]
#[must_use]
pub const fn unowned_from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(windows)]
impl UnsafeFile {
#[inline]
#[must_use]
pub const fn as_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_handle(self.0)
}
#[inline]
#[must_use]
pub const fn into_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_handle(self.0)
}
#[inline]
#[must_use]
pub const fn as_unowned_raw_handle(self) -> RawHandle {
self.0
}
#[inline]
#[must_use]
pub const fn into_unowned_raw_handle(self) -> RawHandle {
self.0
}
#[inline]
pub const fn unowned_from_raw_handle(raw_handle: RawHandle) -> Self {
Self(raw_handle)
}
}
#[cfg(windows)]
unsafe impl Send for UnsafeFile {}
#[cfg(not(windows))]
impl UnsafeSocket {
#[inline]
#[must_use]
pub const fn as_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_fd(self.0)
}
#[inline]
#[must_use]
pub const fn into_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_fd(self.0)
}
#[inline]
#[must_use]
pub const fn unowned_from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(windows)]
impl UnsafeSocket {
#[inline]
#[must_use]
pub const fn as_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_socket(self.0)
}
#[inline]
#[must_use]
pub const fn into_unowned_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle::unowned_from_raw_socket(self.0)
}
#[inline]
#[must_use]
pub const fn unowned_from_raw_socket(raw_socket: RawSocket) -> Self {
Self(raw_socket)
}
}
impl FromUnsafeHandle for UnsafeHandle {
#[inline]
unsafe fn from_unsafe_handle(unsafe_handle: UnsafeHandle) -> Self {
unsafe_handle
}
}
impl FromUnsafeHandle for UnsafeReadable {
#[inline]
unsafe fn from_unsafe_handle(unsafe_handle: UnsafeHandle) -> Self {
Self(unsafe_handle.0)
}
}
impl FromUnsafeHandle for UnsafeWriteable {
#[inline]
unsafe fn from_unsafe_handle(unsafe_handle: UnsafeHandle) -> Self {
Self(unsafe_handle.0)
}
}
#[cfg(not(windows))]
unsafe impl<T: AsRawFd + OwnsRaw> AsUnsafeHandle for T {
#[inline]
fn as_unsafe_handle(&self) -> UnsafeHandle {
UnsafeHandle(self.as_raw_fd())
}
}
#[cfg(not(windows))]
unsafe impl<T: AsRawFd + OwnsRaw> AsUnsafeFile for T {
#[inline]
fn as_unsafe_file(&self) -> UnsafeFile {
UnsafeFile(self.as_raw_fd())
}
}
#[cfg(not(windows))]
unsafe impl<T: AsRawFd + OwnsRaw> AsUnsafeSocket for T {
#[inline]
fn as_unsafe_socket(&self) -> UnsafeSocket {
UnsafeSocket(self.as_raw_fd())
}
}
#[cfg(not(windows))]
unsafe impl<T: IntoRawFd + OwnsRaw> IntoUnsafeHandle for T {
#[inline]
fn into_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle(self.into_raw_fd())
}
}
#[cfg(not(windows))]
unsafe impl<T: IntoRawFd + OwnsRaw> IntoUnsafeFile for T {
#[inline]
fn into_unsafe_file(self) -> UnsafeFile {
UnsafeFile(self.into_raw_fd())
}
}
#[cfg(not(windows))]
unsafe impl<T: IntoRawFd + OwnsRaw> IntoUnsafeSocket for T {
#[inline]
fn into_unsafe_socket(self) -> UnsafeSocket {
UnsafeSocket(self.into_raw_fd())
}
}
#[cfg(not(windows))]
impl<T: FromRawFd + OwnsRaw> FromUnsafeFile for T {
#[inline]
unsafe fn from_unsafe_file(unsafe_file: UnsafeFile) -> Self {
Self::from_raw_fd(unsafe_file.0)
}
}
#[cfg(not(windows))]
impl<T: FromRawFd + OwnsRaw> FromUnsafeSocket for T {
#[inline]
unsafe fn from_unsafe_socket(unsafe_socket: UnsafeSocket) -> Self {
Self::from_raw_fd(unsafe_socket.0)
}
}
#[cfg(not(windows))]
impl AsRawFd for UnsafeHandle {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl IntoRawFd for UnsafeHandle {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl FromRawFd for UnsafeHandle {
#[inline]
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(not(windows))]
impl AsRawFd for UnsafeReadable {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl IntoRawFd for UnsafeReadable {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl FromRawFd for UnsafeReadable {
#[inline]
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(not(windows))]
impl UnsafeReadable {
#[inline]
unsafe fn as_file_view(&self) -> View<'_, File> {
let raw_fd = self.as_raw_fd();
let file = File::from_raw_fd(raw_fd);
View::new(file)
}
}
#[cfg(not(windows))]
impl AsRawFd for UnsafeWriteable {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl IntoRawFd for UnsafeWriteable {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl FromRawFd for UnsafeWriteable {
#[inline]
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(not(windows))]
impl UnsafeWriteable {
#[inline]
unsafe fn as_file_view(&self) -> View<'_, File> {
let raw_fd = self.as_raw_fd();
let file = File::from_raw_fd(raw_fd);
View::new(file)
}
}
#[cfg(not(windows))]
impl AsRawFd for UnsafeFile {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl IntoRawFd for UnsafeFile {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl FromRawFd for UnsafeFile {
#[inline]
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(not(windows))]
impl AsRawFd for UnsafeSocket {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl IntoRawFd for UnsafeSocket {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.0
}
}
#[cfg(not(windows))]
impl FromRawFd for UnsafeSocket {
#[inline]
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
Self(raw_fd)
}
}
#[cfg(windows)]
unsafe impl<T: AsRawHandleOrSocket + OwnsRaw> AsUnsafeHandle for T {
#[inline]
fn as_unsafe_handle(&self) -> UnsafeHandle {
UnsafeHandle(self.as_raw_handle_or_socket())
}
}
#[cfg(windows)]
unsafe impl<T: IntoRawHandleOrSocket + OwnsRaw> IntoUnsafeHandle for T {
#[inline]
fn into_unsafe_handle(self) -> UnsafeHandle {
UnsafeHandle(self.into_raw_handle_or_socket())
}
}
#[cfg(windows)]
unsafe impl<T: AsRawHandle + AsUnsafeHandle + OwnsRaw> AsUnsafeFile for T {
#[inline]
fn as_unsafe_file(&self) -> UnsafeFile {
UnsafeFile(AsRawHandle::as_raw_handle(self))
}
}
#[cfg(windows)]
unsafe impl<T: AsRawSocket + AsUnsafeHandle + OwnsRaw> AsUnsafeSocket for T {
#[inline]
fn as_unsafe_socket(&self) -> UnsafeSocket {
UnsafeSocket(AsRawSocket::as_raw_socket(self))
}
}
#[cfg(windows)]
unsafe impl<T: IntoRawHandle + IntoUnsafeHandle + OwnsRaw> IntoUnsafeFile for T {
#[inline]
fn into_unsafe_file(self) -> UnsafeFile {
UnsafeFile(Self::into_raw_handle(self))
}
}
#[cfg(windows)]
unsafe impl<T: IntoRawSocket + IntoUnsafeHandle + OwnsRaw> IntoUnsafeSocket for T {
#[inline]
fn into_unsafe_socket(self) -> UnsafeSocket {
UnsafeSocket(IntoRawSocket::into_raw_socket(self))
}
}
#[cfg(windows)]
impl<T: FromRawHandle + OwnsRaw> FromUnsafeFile for T {
#[inline]
unsafe fn from_unsafe_file(unsafe_file: UnsafeFile) -> Self {
Self::from_raw_handle(unsafe_file.0)
}
}
#[cfg(windows)]
impl<T: FromRawSocket + OwnsRaw> FromUnsafeSocket for T {
#[inline]
unsafe fn from_unsafe_socket(unsafe_socket: UnsafeSocket) -> Self {
Self::from_raw_socket(unsafe_socket.0)
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UnsafeHandle {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UnsafeHandle {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl FromRawHandleOrSocket for UnsafeHandle {
#[inline]
unsafe fn from_raw_handle_or_socket(raw_handle_or_socket: RawHandleOrSocket) -> Self {
Self(raw_handle_or_socket)
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UnsafeReadable {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UnsafeReadable {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl FromRawHandleOrSocket for UnsafeReadable {
#[inline]
unsafe fn from_raw_handle_or_socket(raw_handle_or_socket: RawHandleOrSocket) -> Self {
Self(raw_handle_or_socket)
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UnsafeWriteable {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UnsafeWriteable {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
self.0
}
}
#[cfg(windows)]
impl FromRawHandleOrSocket for UnsafeWriteable {
#[inline]
unsafe fn from_raw_handle_or_socket(raw_handle_or_socket: RawHandleOrSocket) -> Self {
Self(raw_handle_or_socket)
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UnsafeFile {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
RawHandleOrSocket::unowned_from_raw_handle(self.0)
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UnsafeFile {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
RawHandleOrSocket::unowned_from_raw_handle(self.0)
}
}
#[cfg(windows)]
impl AsRawHandle for UnsafeFile {
#[inline]
fn as_raw_handle(&self) -> RawHandle {
self.0
}
}
#[cfg(windows)]
impl IntoRawHandle for UnsafeFile {
#[inline]
fn into_raw_handle(self) -> RawHandle {
self.0
}
}
#[cfg(windows)]
impl FromRawHandle for UnsafeFile {
#[inline]
unsafe fn from_raw_handle(raw_handle: RawHandle) -> Self {
Self(raw_handle)
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UnsafeSocket {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
RawHandleOrSocket::unowned_from_raw_socket(self.0)
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UnsafeSocket {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
RawHandleOrSocket::unowned_from_raw_socket(self.0)
}
}
#[cfg(windows)]
impl AsRawSocket for UnsafeSocket {
#[inline]
fn as_raw_socket(&self) -> RawSocket {
self.0
}
}
#[cfg(windows)]
impl IntoRawSocket for UnsafeSocket {
#[inline]
fn into_raw_socket(self) -> RawSocket {
self.0
}
}
#[cfg(windows)]
impl FromRawSocket for UnsafeSocket {
#[inline]
unsafe fn from_raw_socket(raw_socket: RawSocket) -> Self {
Self(raw_socket)
}
}
#[cfg(not(windows))]
impl Read for UnsafeReadable {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
unsafe { self.as_file_view() }.read(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
unsafe { self.as_file_view() }.read_vectored(bufs)
}
#[cfg(can_vector)]
#[inline]
fn is_read_vectored(&self) -> bool {
unsafe { self.as_file_view() }.is_read_vectored()
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
unsafe { self.as_file_view() }.read_to_end(buf)
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
unsafe { self.as_file_view() }.read_to_string(buf)
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
unsafe { self.as_file_view() }.read_exact(buf)
}
}
#[cfg(windows)]
impl Read for UnsafeReadable {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => unsafe { as_file_view(self, raw_handle) }.read(buf),
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.read(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.read(buf),
}
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.read_vectored(bufs)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.read_vectored(bufs)
}
RawEnum::Stdio(ref mut stdio) => stdio.read_vectored(bufs),
}
}
#[cfg(can_vector)]
#[inline]
fn is_read_vectored(&self) -> bool {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.is_read_vectored()
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.is_read_vectored()
}
RawEnum::Stdio(ref stdio) => stdio.is_read_vectored(),
}
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.read_to_end(buf)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.read_to_end(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.read_to_end(buf),
}
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.read_to_string(buf)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.read_to_string(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.read_to_string(buf),
}
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.read_exact(buf)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.read_exact(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.read_exact(buf),
}
}
}
#[cfg(not(windows))]
impl Write for UnsafeWriteable {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
unsafe { self.as_file_view() }.write(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
unsafe { self.as_file_view() }.flush()
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
unsafe { self.as_file_view() }.write_vectored(bufs)
}
#[cfg(can_vector)]
#[inline]
fn is_write_vectored(&self) -> bool {
unsafe { self.as_file_view() }.is_write_vectored()
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
unsafe { self.as_file_view() }.write_all(buf)
}
#[cfg(write_all_vectored)]
#[inline]
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> io::Result<()> {
unsafe { self.as_file_view() }.write_all_vectored(bufs)
}
#[inline]
fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> {
unsafe { self.as_file_view() }.write_fmt(fmt)
}
}
#[cfg(windows)]
impl Write for UnsafeWriteable {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => unsafe { as_file_view(self, raw_handle) }.write(buf),
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.write(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.write(buf),
}
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => unsafe { as_file_view(self, raw_handle) }.flush(),
RawEnum::Socket(raw_socket) => unsafe { as_tcp_stream_view(self, raw_socket) }.flush(),
RawEnum::Stdio(ref mut stdio) => stdio.flush(),
}
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.write_vectored(bufs)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.write_vectored(bufs)
}
RawEnum::Stdio(ref mut stdio) => stdio.write_vectored(bufs),
}
}
#[cfg(can_vector)]
#[inline]
fn is_write_vectored(&self) -> bool {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.is_write_vectored()
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.is_write_vectored()
}
RawEnum::Stdio(ref stdio) => stdio.is_write_vectored(),
}
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => unsafe { as_file_view(self, raw_handle) }.write_all(buf),
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.write_all(buf)
}
RawEnum::Stdio(ref mut stdio) => stdio.write_all(buf),
}
}
#[cfg(write_all_vectored)]
#[inline]
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> io::Result<()> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => {
unsafe { as_file_view(self, raw_handle) }.write_all_vectored(bufs)
}
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.write_all_vectored(bufs)
}
RawEnum::Stdio(ref mut stdio) => stdio.write_all_vectored(bufs),
}
}
#[inline]
fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> {
match self.0 .0 {
RawEnum::Handle(raw_handle) => unsafe { as_file_view(self, raw_handle) }.write_fmt(fmt),
RawEnum::Socket(raw_socket) => {
unsafe { as_tcp_stream_view(self, raw_socket) }.write_fmt(fmt)
}
RawEnum::Stdio(ref mut stdio) => stdio.write_fmt(fmt),
}
}
}
#[cfg(windows)]
#[inline]
unsafe fn as_file_view<T>(_t: &T, raw_handle: RawHandle) -> View<'_, File> {
let file = File::from_raw_handle(raw_handle);
View::new(file)
}
#[cfg(windows)]
#[inline]
unsafe fn as_tcp_stream_view<T>(_t: &T, raw_socket: RawSocket) -> View<'_, TcpStream> {
let tcp_stream = TcpStream::from_raw_socket(raw_socket);
View::new(tcp_stream)
}
#[cfg(not(windows))]
impl fmt::Debug for UnsafeHandle {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeHandle")
.field("raw_fd", &self.as_raw_fd())
.finish()
}
}
#[cfg(windows)]
impl fmt::Debug for UnsafeHandle {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeHandle")
.field("raw_handle_or_socket", &self.as_raw_handle_or_socket())
.finish()
}
}
#[cfg(not(windows))]
impl fmt::Debug for UnsafeFile {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeFile")
.field("raw_fd", &self.0)
.finish()
}
}
#[cfg(windows)]
impl fmt::Debug for UnsafeFile {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeFile")
.field("raw_handle", &self.0)
.finish()
}
}
#[cfg(not(windows))]
impl fmt::Debug for UnsafeSocket {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeSocket")
.field("raw_fd", &self.0)
.finish()
}
}
#[cfg(windows)]
impl fmt::Debug for UnsafeSocket {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeSocket")
.field("raw_socket", &self.0)
.finish()
}
}
#[cfg(not(windows))]
impl fmt::Debug for UnsafeReadable {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeReadable")
.field("raw_fd", &self.0)
.finish()
}
}
#[cfg(windows)]
impl fmt::Debug for UnsafeReadable {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeReadable")
.field("raw_handle_or_socket", &self.0)
.finish()
}
}
#[cfg(not(windows))]
impl fmt::Debug for UnsafeWriteable {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeWriteable")
.field("raw_fd", &self.0)
.finish()
}
}
#[cfg(windows)]
impl fmt::Debug for UnsafeWriteable {
#[allow(clippy::missing_inline_in_public_items)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnsafeWriteable")
.field("raw_handle_or_socket", &self.0)
.finish()
}
}