use std::{io, net::SocketAddr, os::fd::FromRawFd};
#[allow(unused_imports)] use crate::{
api::{ops, resource::FromResource},
net::{Socket, TcpListener, TcpSocket},
typed_op::TypedOp,
};
pub struct SocketAccept {
inner: ops::Accept,
}
impl SocketAccept {
pub(crate) fn new(res: crate::api::resource::Resource) -> Self {
Self { inner: ops::Accept::new(res) }
}
}
impl TypedOp for SocketAccept {
type Result = io::Result<(Socket, SocketAddr)>;
fn into_op(&mut self) -> crate::op::Op {
self.inner.into_op()
}
fn extract_result(self, res: isize) -> Self::Result {
let (resource, addr) = self.inner.extract_result(res)?;
Ok((Socket::from_resource(resource), addr))
}
}
pub struct SocketNew {
domain: i32,
ty: i32,
proto: i32,
}
impl SocketNew {
pub(crate) fn new(domain: i32, ty: i32, proto: i32) -> Self {
Self { domain, ty, proto }
}
}
impl TypedOp for SocketNew {
type Result = io::Result<Socket>;
fn into_op(&mut self) -> crate::op::Op {
crate::op::Op::Socket {
domain: self.domain,
ty: self.ty,
proto: self.proto,
}
}
fn extract_result(self, res: isize) -> Self::Result {
let result = if res < 0 {
return Err(io::Error::from_raw_os_error(-res as i32));
} else {
res as std::os::fd::RawFd
};
let res = unsafe { crate::api::resource::Resource::from_raw_fd(result) };
Ok(Socket::from_resource(res))
}
}
pub struct TcpAccept {
inner: ops::Accept,
}
impl TcpAccept {
pub(crate) fn new(res: crate::api::resource::Resource) -> Self {
Self { inner: ops::Accept::new(res) }
}
}
impl TypedOp for TcpAccept {
type Result = io::Result<(TcpSocket, SocketAddr)>;
fn into_op(&mut self) -> crate::op::Op {
self.inner.into_op()
}
fn extract_result(self, res: isize) -> Self::Result {
let (resource, addr) = self.inner.extract_result(res)?;
Ok((TcpSocket::from_resource(resource), addr))
}
}