#[cfg(unix)]
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
#[cfg(unix)]
use super::{TcpListener, TcpSocket, TcpStream, UdpSocket};
#[cfg(unix)]
use std::io;
#[cfg(unix)]
impl AsFd for TcpStream {
fn as_fd(&self) -> BorrowedFd<'_> {
self.inner.fd.as_fd()
}
}
#[cfg(unix)]
impl AsRawFd for TcpStream {
fn as_raw_fd(&self) -> RawFd {
self.inner.fd.as_raw_fd()
}
}
#[cfg(unix)]
impl From<OwnedFd> for TcpStream {
fn from(fd: OwnedFd) -> Self {
Self::from_owned_fd(fd)
}
}
#[cfg(unix)]
impl AsFd for TcpListener {
fn as_fd(&self) -> BorrowedFd<'_> {
self.inner.fd.as_fd()
}
}
#[cfg(unix)]
impl AsRawFd for TcpListener {
fn as_raw_fd(&self) -> RawFd {
self.inner.fd.as_raw_fd()
}
}
#[cfg(unix)]
impl From<OwnedFd> for TcpListener {
fn from(fd: OwnedFd) -> Self {
Self::from_owned_fd(fd)
}
}
#[cfg(unix)]
impl AsFd for UdpSocket {
fn as_fd(&self) -> BorrowedFd<'_> {
self.inner.fd.as_fd()
}
}
#[cfg(unix)]
impl AsRawFd for UdpSocket {
fn as_raw_fd(&self) -> RawFd {
self.inner.fd.as_raw_fd()
}
}
#[cfg(unix)]
impl From<OwnedFd> for UdpSocket {
fn from(fd: OwnedFd) -> Self {
Self::from_owned_fd(fd)
}
}
#[cfg(unix)]
impl AsFd for TcpSocket {
fn as_fd(&self) -> BorrowedFd<'_> {
self.fd.as_fd()
}
}
#[cfg(unix)]
impl AsRawFd for TcpSocket {
fn as_raw_fd(&self) -> RawFd {
self.fd.as_raw_fd()
}
}
#[cfg(unix)]
impl From<OwnedFd> for TcpSocket {
fn from(fd: OwnedFd) -> Self {
Self::from_owned_fd(fd)
}
}
#[cfg(unix)]
impl TcpStream {
pub fn from_std(stream: std::net::TcpStream) -> io::Result<Self> {
let fd = OwnedFd::from(stream);
crate::sys::current::net::set_nonblocking(fd.as_raw_fd())?;
Ok(Self::from_owned_fd(fd))
}
}
#[cfg(unix)]
impl TcpListener {
pub fn from_std(listener: std::net::TcpListener) -> io::Result<Self> {
let fd = OwnedFd::from(listener);
crate::sys::current::net::set_nonblocking(fd.as_raw_fd())?;
Ok(Self::from_owned_fd(fd))
}
}
#[cfg(unix)]
impl UdpSocket {
pub fn from_std(socket: std::net::UdpSocket) -> io::Result<Self> {
let fd = OwnedFd::from(socket);
crate::sys::current::net::set_nonblocking(fd.as_raw_fd())?;
Ok(Self::from_owned_fd(fd))
}
}
#[cfg(windows)]
mod windows_interop {
use std::io;
use std::os::windows::io::{AsSocket, BorrowedSocket, OwnedSocket, RawSocket};
use crate::net::{TcpListener, TcpSocket, TcpStream, UdpSocket};
use crate::sys::handle::raw_sock;
impl AsSocket for TcpStream {
fn as_socket(&self) -> BorrowedSocket<'_> {
self.inner.fd.as_socket()
}
}
impl std::os::windows::io::AsRawSocket for TcpStream {
fn as_raw_socket(&self) -> RawSocket {
raw_sock(&self.inner.fd)
}
}
impl From<OwnedSocket> for TcpStream {
fn from(socket: OwnedSocket) -> Self {
let _ = crate::sys::current::net::associate_adopted(raw_sock(&socket));
Self::from_owned_fd(socket)
}
}
impl AsSocket for TcpListener {
fn as_socket(&self) -> BorrowedSocket<'_> {
self.inner.fd.as_socket()
}
}
impl std::os::windows::io::AsRawSocket for TcpListener {
fn as_raw_socket(&self) -> RawSocket {
raw_sock(&self.inner.fd)
}
}
impl From<OwnedSocket> for TcpListener {
fn from(socket: OwnedSocket) -> Self {
let _ = crate::sys::current::net::associate_adopted(raw_sock(&socket));
Self::from_owned_fd(socket)
}
}
impl AsSocket for UdpSocket {
fn as_socket(&self) -> BorrowedSocket<'_> {
self.inner.fd.as_socket()
}
}
impl std::os::windows::io::AsRawSocket for UdpSocket {
fn as_raw_socket(&self) -> RawSocket {
raw_sock(&self.inner.fd)
}
}
impl From<OwnedSocket> for UdpSocket {
fn from(socket: OwnedSocket) -> Self {
let _ = crate::sys::current::net::associate_adopted(raw_sock(&socket));
Self::from_owned_fd(socket)
}
}
impl AsSocket for TcpSocket {
fn as_socket(&self) -> BorrowedSocket<'_> {
self.fd.as_socket()
}
}
impl std::os::windows::io::AsRawSocket for TcpSocket {
fn as_raw_socket(&self) -> RawSocket {
raw_sock(&self.fd)
}
}
impl From<OwnedSocket> for TcpSocket {
fn from(socket: OwnedSocket) -> Self {
let _ = crate::sys::current::net::associate_adopted(raw_sock(&socket));
Self::from_owned_fd(socket)
}
}
impl TcpStream {
pub fn from_std(stream: std::net::TcpStream) -> io::Result<Self> {
let socket = OwnedSocket::from(stream);
crate::sys::current::net::associate_adopted(raw_sock(&socket))?;
Ok(Self::from_owned_fd(socket))
}
}
impl TcpListener {
pub fn from_std(listener: std::net::TcpListener) -> io::Result<Self> {
let socket = OwnedSocket::from(listener);
crate::sys::current::net::associate_adopted(raw_sock(&socket))?;
Ok(Self::from_owned_fd(socket))
}
}
impl UdpSocket {
pub fn from_std(socket: std::net::UdpSocket) -> io::Result<Self> {
let socket = OwnedSocket::from(socket);
crate::sys::current::net::associate_adopted(raw_sock(&socket))?;
Ok(Self::from_owned_fd(socket))
}
}
}