use std::io::{IoSlice, IoSliceMut};
use compio_buf::{IntoInner, IoBuf, IoBufMut, IoVectoredBuf, IoVectoredBufMut};
use libc::{sockaddr_storage, socklen_t};
use socket2::SockAddr;
#[cfg(doc)]
use crate::op::*;
use crate::RawFd;
pub struct Accept {
pub(crate) fd: RawFd,
pub(crate) buffer: sockaddr_storage,
pub(crate) addr_len: socklen_t,
}
impl Accept {
pub fn new(fd: RawFd) -> Self {
Self {
fd,
buffer: unsafe { std::mem::zeroed() },
addr_len: std::mem::size_of::<sockaddr_storage>() as _,
}
}
pub fn into_addr(self) -> SockAddr {
unsafe { SockAddr::new(self.buffer, self.addr_len) }
}
}
pub struct Recv<T: IoBufMut> {
pub(crate) fd: RawFd,
pub(crate) buffer: T,
}
impl<T: IoBufMut> Recv<T> {
pub fn new(fd: RawFd, buffer: T) -> Self {
Self { fd, buffer }
}
}
impl<T: IoBufMut> IntoInner for Recv<T> {
type Inner = T;
fn into_inner(self) -> Self::Inner {
self.buffer
}
}
pub struct RecvVectored<T: IoVectoredBufMut> {
pub(crate) fd: RawFd,
pub(crate) buffer: T,
pub(crate) slices: Vec<IoSliceMut<'static>>,
}
impl<T: IoVectoredBufMut> RecvVectored<T> {
pub fn new(fd: RawFd, buffer: T) -> Self {
Self {
fd,
buffer,
slices: vec![],
}
}
}
impl<T: IoVectoredBufMut> IntoInner for RecvVectored<T> {
type Inner = T;
fn into_inner(self) -> Self::Inner {
self.buffer
}
}
pub struct Send<T: IoBuf> {
pub(crate) fd: RawFd,
pub(crate) buffer: T,
}
impl<T: IoBuf> Send<T> {
pub fn new(fd: RawFd, buffer: T) -> Self {
Self { fd, buffer }
}
}
impl<T: IoBuf> IntoInner for Send<T> {
type Inner = T;
fn into_inner(self) -> Self::Inner {
self.buffer
}
}
pub struct SendVectored<T: IoVectoredBuf> {
pub(crate) fd: RawFd,
pub(crate) buffer: T,
pub(crate) slices: Vec<IoSlice<'static>>,
}
impl<T: IoVectoredBuf> SendVectored<T> {
pub fn new(fd: RawFd, buffer: T) -> Self {
Self {
fd,
buffer,
slices: vec![],
}
}
}
impl<T: IoVectoredBuf> IntoInner for SendVectored<T> {
type Inner = T;
fn into_inner(self) -> Self::Inner {
self.buffer
}
}