use std::{
io::{self, Error},
mem,
os::fd::{FromRawFd, RawFd},
};
use crate::{api::resource::Resource, op::Op, typed_op::TypedOp};
pub struct AcceptUnix {
res: Resource,
addr: Box<libc::sockaddr_storage>,
len: Box<libc::socklen_t>,
}
impl AcceptUnix {
pub(crate) fn new(res: Resource) -> Self {
let addr: Box<libc::sockaddr_storage> = Box::new(unsafe { mem::zeroed() });
let len =
Box::new(mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t);
Self { res, addr, len }
}
}
impl TypedOp for AcceptUnix {
type Result = io::Result<Resource>;
fn into_op(&mut self) -> Op {
Op::Accept {
fd: self.res.clone(),
addr: &mut *self.addr as *mut _,
len: &mut *self.len as *mut _,
}
}
fn extract_result(self, res: isize) -> Self::Result {
if res < 0 {
return Err(Error::from_raw_os_error(-res as i32));
}
let resource = unsafe { Resource::from_raw_fd(res as RawFd) };
Ok(resource)
}
}