#[cfg(unix)]
use std::os::fd::OwnedFd;
use std::
{
io::{self, IoSlice, IoSliceMut},
marker::PhantomData,
net::{Shutdown, TcpListener, TcpStream, UdpSocket},
time::Duration
};
#[cfg(unix)]
use crate::So9MarkerSockUnix;
use crate::
{
AsOsDescr, So9MsgFlags, So9Marker, So9MarkerStateless, Socket9, Socket9ExtIp, Socket9ExtIp6, Socket9ExtIpTcp, Socket9ExtIpTcpExt, Socket9ExtSo, SocketTypeImps, address::IntoSockAddrSpec
};
#[derive(Debug)]
pub struct Socket9Read<SO: So9Marker>
{
so9: Option<Socket9<SO>>,
orig_fd: <SO::SockType as SocketTypeImps>::RawType,
_p: PhantomData<SO>
}
impl<SO: So9Marker> Drop for Socket9Read<SO>
{
fn drop(&mut self)
{
let Some(socket) = self.so9.take()
else { return };
let _ = socket.shutdown(Shutdown::Read);
}
}
impl<SO: So9Marker> Eq for Socket9Read<SO> {}
impl<SO: So9Marker> PartialEq for Socket9Read<SO>
{
fn eq(&self, other: &Self) -> bool
{
self.orig_fd == other.orig_fd && self._p == other._p
}
}
impl<SO: So9Marker> PartialEq<Socket9Write<SO>> for Socket9Read<SO>
{
fn eq(&self, other: &Socket9Write<SO>) -> bool
{
self.orig_fd == other.orig_id
}
}
#[cfg(unix)]
mod unix_spec_read
{
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, RawFd};
use super::*;
impl<SO: So9Marker> AsFd for Socket9Read<SO>
{
fn as_fd(&self) -> BorrowedFd<'_>
{
return self.so9.as_ref().unwrap().as_fd();
}
}
impl<SO: So9Marker> AsRawFd for Socket9Read<SO>
{
fn as_raw_fd(&self) -> RawFd
{
return self.so9.as_ref().unwrap().as_raw_fd();
}
}
}
#[cfg(windows)]
mod unix_spec_read
{
use std::os::windows::io::{AsRawSocket, AsSocket, BorrowedSocket, RawSocket};
use super::*;
impl<SO: So9Marker> AsSocket for Socket9Read<SO>
{
fn as_socket(&self) -> BorrowedSocket<'_>
{
return self.so9.as_ref().unwrap().as_socket();
}
}
impl<SO: So9Marker> AsRawSocket for Socket9Read<SO>
{
fn as_raw_socket(&self) -> RawSocket
{
return self.so9.as_ref().unwrap().as_raw_socket();
}
}
}
impl<SO: So9Marker> io::Read for Socket9Read<SO>
{
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().recv(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().read_vectored(bufs)
}
}
impl<'temp, SO: So9Marker> io::Read for &'temp Socket9Read<SO>
{
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().recv(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().recv_vectored(bufs)
}
}
impl<SO: So9Marker> Socket9Read<SO>
{
#[inline]
pub
fn local_addr(&self) -> io::Result<SO::SockAddrType>
{
self.so9.as_ref().unwrap().local_addr()
}
#[inline]
pub
fn peer_addr(&self) -> io::Result<SO::SockAddrType>
{
self.so9.as_ref().unwrap().peer_addr()
}
}
#[cfg(unix)]
impl<SO: So9Marker> Socket9Read<SO>
{
#[inline]
pub
fn is_nonblocking(&self) -> io::Result<bool>
{
self.so9.as_ref().unwrap().is_nonblocking()
}
#[inline]
pub
fn is_cloexec_sock(&self) -> io::Result<bool>
{
self.so9.as_ref().unwrap().is_cloexec_sock()
}
}
impl<SO: So9Marker> Socket9Read<SO>
{
#[inline]
pub
fn recv(&self, buffer: &mut[u8]) -> Result<usize, io::Error>
{
self.so9.as_ref().unwrap().recv(buffer)
}
#[inline]
pub
fn recv_with_flags(&self, buffer: &mut[u8], flags: i32) -> Result<usize, io::Error>
{
self.so9.as_ref().unwrap().recv_with_flags(buffer, flags)
}
#[inline]
pub
fn recv_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().recv_vectored(bufs)
}
#[inline]
pub
fn peek(&self, buf: &mut [u8]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().peek(buf)
}
}
impl<SO: So9Marker + So9MarkerStateless> Socket9Read<SO>
{
#[inline]
pub
fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SO::SockAddrType)>
{
self.so9.as_ref().unwrap().peek_from(buf)
}
#[inline]
pub
fn recv_from(&self, buf: &mut [u8], flags: So9MsgFlags) -> io::Result<(usize, SO::SockAddrType)>
{
self.so9.as_ref().unwrap().recv_from(buf, flags)
}
#[inline]
pub
fn recv_from_timeout(&self, buf: &mut [u8], flags: So9MsgFlags, timeout: Duration) -> io::Result<(usize, SO::SockAddrType)>
{
self.so9.as_ref().unwrap().recv_from_flags_timeout(buf, flags, timeout)
}
}
impl<SO: So9Marker> Socket9Read<SO>
{
pub(crate)
fn new(so9: Socket9<SO>, orig_fd: <SO::SockType as SocketTypeImps>::RawType) -> Self
{
return
Self
{
so9: Some(so9),
orig_fd: orig_fd,
_p: PhantomData,
};
}
pub(crate)
fn take(mut self) -> Socket9<SO>
{
return self.so9.take().unwrap();
}
}
impl<SO: So9Marker> AsOsDescr for Socket9Read<SO>{}
impl Socket9ExtSo for Socket9Read<TcpListener> {}
impl Socket9ExtIp for Socket9Read<TcpListener> {}
impl Socket9ExtIp6 for Socket9Read<TcpListener> {}
impl Socket9ExtSo for Socket9Read<TcpStream> {}
impl Socket9ExtIp for Socket9Read<TcpStream> {}
impl Socket9ExtIp6 for Socket9Read<TcpStream> {}
impl Socket9ExtIpTcp for Socket9Read<TcpStream> {}
impl Socket9ExtIpTcpExt for Socket9Read<TcpStream> {}
impl Socket9ExtSo for Socket9Read<UdpSocket> {}
impl Socket9ExtIp for Socket9Read<UdpSocket> {}
impl Socket9ExtIp6 for Socket9Read<UdpSocket> {}
#[cfg(unix)]
pub mod unix_things
{
use std::os::
{
unix::net::{UnixDatagram, UnixListener, UnixStream}
};
use uds_fork::{UnixSeqpacketConn, UnixSeqpacketListener};
use super::*;
impl Socket9ExtSo for Socket9Read<UnixDatagram> {}
impl Socket9ExtSo for Socket9Read<UnixStream> {}
impl Socket9ExtSo for Socket9Read<UnixListener> {}
impl Socket9ExtSo for Socket9Read<UnixSeqpacketListener> {}
impl Socket9ExtSo for Socket9Read<UnixSeqpacketConn> {}
}
#[derive(Debug)]
pub struct Socket9Write<SO: So9Marker>
{
so9: Option<Socket9<SO>>,
orig_id: <SO::SockType as SocketTypeImps>::RawType,
_p: PhantomData<SO>
}
impl<SO: So9Marker> Drop for Socket9Write<SO>
{
fn drop(&mut self)
{
let Some(so9) = self.so9.take()
else { return };
let _ = so9.shutdown(Shutdown::Write);
}
}
#[cfg(unix)]
mod unix_spec_write
{
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, RawFd};
use super::*;
impl<SO: So9Marker> AsFd for Socket9Write<SO>
{
fn as_fd(&self) -> BorrowedFd<'_>
{
return self.so9.as_ref().unwrap().as_fd();
}
}
impl<SO: So9Marker> AsRawFd for Socket9Write<SO>
{
fn as_raw_fd(&self) -> RawFd
{
return self.so9.as_ref().unwrap().as_raw_fd();
}
}
}
#[cfg(windows)]
mod unix_spec_write
{
use std::os::windows::io::{AsRawSocket, AsSocket, BorrowedSocket, RawSocket};
use crate::{So9Marker, socket_split::Socket9Write};
impl<SO: So9Marker> AsSocket for Socket9Write<SO>
{
fn as_socket(&self) -> BorrowedSocket<'_>
{
return self.so9.as_ref().unwrap().as_socket();
}
}
impl<SO: So9Marker> AsRawSocket for Socket9Write<SO>
{
fn as_raw_socket(&self) -> RawSocket
{
return self.so9.as_ref().unwrap().as_raw_socket();
}
}
}
impl<SO: So9Marker> io::Write for Socket9Write<SO>
{
fn write(&mut self, buf: &[u8]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send(buf)
}
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_vectored(bufs)
}
fn flush(&mut self) -> io::Result<()>
{
Ok(())
}
}
impl<'temp, SO: So9Marker> io::Write for &'temp Socket9Write<SO>
{
fn write(&mut self, buf: &[u8]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send(buf)
}
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_vectored(bufs)
}
fn flush(&mut self) -> io::Result<()>
{
Ok(())
}
}
impl<SO: So9Marker> Socket9Write<SO>
{
pub(crate)
fn new(so9: Socket9<SO>, orig_id: <SO::SockType as SocketTypeImps>::RawType) -> Self
{
return
Self
{
so9: Some(so9),
orig_id: orig_id,
_p: PhantomData,
};
}
pub(crate)
fn take(mut self) -> Socket9<SO>
{
return self.so9.take().unwrap();
}
}
impl<SO: So9Marker> Socket9Write<SO>
{
#[inline]
pub
fn local_addr(&self) -> io::Result<SO::SockAddrType>
{
self.so9.as_ref().unwrap().local_addr()
}
#[inline]
pub
fn peer_addr(&self) -> io::Result<SO::SockAddrType>
{
self.so9.as_ref().unwrap().peer_addr()
}
}
#[cfg(unix)]
impl<SO: So9Marker> Socket9Write<SO>
{
#[inline]
pub
fn is_nonblocking(&self) -> io::Result<bool>
{
self.so9.as_ref().unwrap().is_nonblocking()
}
#[inline]
pub
fn is_cloexec_sock(&self) -> io::Result<bool>
{
self.so9.as_ref().unwrap().is_cloexec_sock()
}
}
impl<SO: So9Marker> Socket9Write<SO>
{
#[inline]
pub
fn send(&self, data: &[u8]) -> Result<usize, io::Error>
{
self.so9.as_ref().unwrap().send(data)
}
#[inline]
pub
fn send_with_flags(&self, data: &[u8], flags: So9MsgFlags) -> Result<usize, io::Error>
{
self.so9.as_ref().unwrap().send_with_flags(data, flags)
}
#[inline]
pub
fn send_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_vectored(bufs)
}
}
impl<SO: So9Marker + So9MarkerStateless> Socket9Write<SO>
{
#[inline]
pub
fn send_to<S>(&self, buf: &[u8], addr_to: &S) -> io::Result<usize>
where
S: IntoSockAddrSpec<SO::SockAddrType>
{
self.so9.as_ref().unwrap().send_to(buf, addr_to)
}
#[inline]
pub
fn send_to_with_flags<S>(&self, buf: &[u8], addr_to: &S, flags: i32) -> io::Result<usize>
where
S: IntoSockAddrSpec<SO::SockAddrType>
{
self.so9.as_ref().unwrap().send_to_with_flags(buf, addr_to, flags)
}
}
#[cfg(unix)]
impl<SO: So9Marker + So9MarkerSockUnix> Socket9Write<SO>
{
#[inline]
pub
fn send_vectored_with(&self, slices: &[IoSlice]) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_vectored_with(slices)
}
#[inline]
pub
fn send_vectored_with_flags(&self, slices: &[IoSlice], flags: So9MsgFlags) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_vectored_with_flags(slices, flags)
}
}
#[cfg(unix)]
impl<SO: So9Marker + So9MarkerSockUnix> Socket9Write<SO>
{
#[inline]
pub
fn send_fd(&self, fd: OwnedFd) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_fd(fd)
}
#[inline]
pub
fn send_fd_with_flags(&self, fd: OwnedFd, flags: So9MsgFlags) -> io::Result<usize>
{
self.so9.as_ref().unwrap().send_fd_with_flags(fd, flags)
}
}
impl<SO: So9Marker> AsOsDescr for Socket9Write<SO>{}
impl Socket9ExtSo for Socket9Write<TcpListener> {}
impl Socket9ExtIp for Socket9Write<TcpListener> {}
impl Socket9ExtIp6 for Socket9Write<TcpListener> {}
impl Socket9ExtSo for Socket9Write<TcpStream> {}
impl Socket9ExtIp for Socket9Write<TcpStream> {}
impl Socket9ExtIp6 for Socket9Write<TcpStream> {}
impl Socket9ExtIpTcp for Socket9Write<TcpStream> {}
impl Socket9ExtIpTcpExt for Socket9Write<TcpStream> {}
impl Socket9ExtSo for Socket9Write<UdpSocket> {}
impl Socket9ExtIp for Socket9Write<UdpSocket> {}
impl Socket9ExtIp6 for Socket9Write<UdpSocket> {}
#[cfg(unix)]
pub mod unix_things_w
{
use std::os::
{
unix::net::{UnixDatagram, UnixListener, UnixStream}
};
use uds_fork::{UnixSeqpacketConn, UnixSeqpacketListener};
use super::*;
impl Socket9ExtSo for Socket9Write<UnixDatagram> {}
impl Socket9ExtSo for Socket9Write<UnixStream> {}
impl Socket9ExtSo for Socket9Write<UnixListener> {}
impl Socket9ExtSo for Socket9Write<UnixSeqpacketListener> {}
impl Socket9ExtSo for Socket9Write<UnixSeqpacketConn> {}
}