use crate::{net::Shutdown, os::unix::net::SocketAddr};
#[cfg(feature = "read_initializer")]
use std::io::Initializer;
use std::{
io::{self, IoSlice, IoSliceMut, Read, Write},
os::unix::{
self,
io::{AsRawFd, FromRawFd, IntoRawFd, RawFd},
},
time::Duration,
};
pub struct UnixStream {
std: unix::net::UnixStream,
}
impl UnixStream {
#[inline]
pub unsafe fn from_std(std: unix::net::UnixStream) -> Self {
Self { std }
}
#[inline]
pub fn pair() -> io::Result<(Self, Self)> {
unix::net::UnixStream::pair()
.map(|(a, b)| unsafe { (Self::from_std(a), Self::from_std(b)) })
}
#[inline]
pub fn try_clone(&self) -> io::Result<Self> {
let unix_stream = self.std.try_clone()?;
Ok(unsafe { Self::from_std(unix_stream) })
}
#[inline]
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.std.local_addr()
}
#[inline]
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.std.peer_addr()
}
#[inline]
pub fn set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()> {
self.std.set_read_timeout(timeout)
}
#[inline]
pub fn set_write_timeout(&self, timeout: Option<Duration>) -> io::Result<()> {
self.std.set_write_timeout(timeout)
}
#[inline]
pub fn read_timeout(&self) -> io::Result<Option<Duration>> {
self.std.read_timeout()
}
#[inline]
pub fn write_timeout(&self) -> io::Result<Option<Duration>> {
self.std.write_timeout()
}
#[inline]
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.std.set_nonblocking(nonblocking)
}
#[inline]
pub fn take_error(&self) -> io::Result<Option<io::Error>> {
self.std.take_error()
}
#[inline]
pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
self.std.shutdown(how)
}
}
impl FromRawFd for UnixStream {
#[inline]
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self::from_std(unix::net::UnixStream::from_raw_fd(fd))
}
}
impl AsRawFd for UnixStream {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.std.as_raw_fd()
}
}
impl IntoRawFd for UnixStream {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.std.into_raw_fd()
}
}
impl Read for UnixStream {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.std.read(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut]) -> io::Result<usize> {
self.std.read_vectored(bufs)
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
self.std.read_exact(buf)
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
self.std.read_to_end(buf)
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
self.std.read_to_string(buf)
}
#[cfg(feature = "can_vector")]
#[inline]
fn is_read_vectored(&self) -> bool {
self.std.is_read_vectored()
}
#[cfg(feature = "read_initializer")]
#[inline]
unsafe fn initializer(&self) -> Initializer {
self.std.initializer()
}
}
impl Read for &UnixStream {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
(&mut &self.std).read(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut]) -> io::Result<usize> {
(&mut &self.std).read_vectored(bufs)
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
(&mut &self.std).read_exact(buf)
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
(&mut &self.std).read_to_end(buf)
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
(&mut &self.std).read_to_string(buf)
}
#[cfg(feature = "can_vector")]
#[inline]
fn is_read_vectored(&self) -> bool {
(&mut &self.std).is_read_vectored()
}
#[cfg(feature = "read_initializer")]
#[inline]
unsafe fn initializer(&self) -> Initializer {
(&mut &self.std).initializer()
}
}
impl Write for UnixStream {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.std.write(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
self.std.flush()
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice]) -> io::Result<usize> {
self.std.write_vectored(bufs)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
self.std.write_all(buf)
}
#[cfg(feature = "can_vector")]
#[inline]
fn is_write_vectored(&self) -> bool {
self.std.is_write_vectored()
}
#[cfg(feature = "write_all_vectored")]
#[inline]
fn write_all_vectored(&mut self, bufs: &mut [IoSlice]) -> io::Result<()> {
self.std.write_all_vectored(bufs)
}
}
impl Write for &UnixStream {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
(&mut &self.std).write(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
(&mut &self.std).flush()
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice]) -> io::Result<usize> {
(&mut &self.std).write_vectored(bufs)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
(&mut &self.std).write_all(buf)
}
#[cfg(feature = "can_vector")]
#[inline]
fn is_write_vectored(&self) -> bool {
(&mut &self.std).is_write_vectored()
}
#[cfg(feature = "write_all_vectored")]
#[inline]
fn write_all_vectored(&mut self, bufs: &mut [IoSlice]) -> io::Result<()> {
(&mut &self.std).write_all_vectored(bufs)
}
}