use std::fmt;
use std::io::{self, Read, Write};
use std::net::Shutdown;
use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
use std::path::Path;
use iovec::IoVec;
use mio::{Evented, Poll, PollOpt, Ready, Token};
use super::net::{self, SocketAddr};
use super::poll::SelectorId;
use super::stdnet::{from_path, init, Socket};
use super::sys;
pub struct UnixStream {
sys: sys::UnixStream,
selector_id: SelectorId,
}
fn set_nonblocking(stream: &net::UnixStream) -> io::Result<()> {
stream.set_nonblocking(true)
}
impl UnixStream {
pub fn connect<P: AsRef<Path>>(path: P) -> io::Result<UnixStream> {
init();
fn inner(path: &Path) -> io::Result<UnixStream> {
let sock = Socket::new()?;
let sock = unsafe { net::UnixStream::from_raw_socket(sock.into_raw_socket()) };
let addr = from_path(path)?;
UnixStream::connect_stream(sock, &addr)
}
inner(path.as_ref())
}
pub fn connect_stream(stream: net::UnixStream, addr: &SocketAddr) -> io::Result<UnixStream> {
Ok(UnixStream {
sys: sys::UnixStream::connect(stream, addr)?,
selector_id: SelectorId::new(),
})
}
pub fn from_stream(stream: net::UnixStream) -> io::Result<UnixStream> {
set_nonblocking(&stream)?;
Ok(UnixStream {
sys: sys::UnixStream::from_stream(stream),
selector_id: SelectorId::new(),
})
}
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.sys.peer_addr()
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.sys.local_addr()
}
pub fn try_clone(&self) -> io::Result<UnixStream> {
self.sys.try_clone().map(|s| UnixStream {
sys: s,
selector_id: self.selector_id.clone(),
})
}
pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
self.sys.shutdown(how)
}
pub fn take_error(&self) -> io::Result<Option<io::Error>> {
self.sys.take_error()
}
pub fn read_bufs(&self, bufs: &mut [&mut IoVec]) -> io::Result<usize> {
self.sys.readv(bufs)
}
pub fn write_bufs(&self, bufs: &[&IoVec]) -> io::Result<usize> {
self.sys.writev(bufs)
}
}
impl Read for UnixStream {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
(&self.sys).read(buf)
}
}
impl<'a> Read for &'a UnixStream {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
(&self.sys).read(buf)
}
}
impl Write for UnixStream {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
(&self.sys).write(buf)
}
fn flush(&mut self) -> io::Result<()> {
(&self.sys).flush()
}
}
impl<'a> Write for &'a UnixStream {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
(&self.sys).write(buf)
}
fn flush(&mut self) -> io::Result<()> {
(&self.sys).flush()
}
}
impl Evented for UnixStream {
fn register(
&self,
poll: &Poll,
token: Token,
interest: Ready,
opts: PollOpt,
) -> io::Result<()> {
self.selector_id.associate_selector(poll)?;
self.sys.register(poll, token, interest, opts)
}
fn reregister(
&self,
poll: &Poll,
token: Token,
interest: Ready,
opts: PollOpt,
) -> io::Result<()> {
self.sys.reregister(poll, token, interest, opts)
}
fn deregister(&self, poll: &Poll) -> io::Result<()> {
self.sys.deregister(poll)
}
}
impl fmt::Debug for UnixStream {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(&self.sys, f)
}
}
impl AsRawSocket for UnixStream {
fn as_raw_socket(&self) -> RawSocket {
self.sys.as_raw_socket()
}
}