use std::{
io::{self, IoSlice},
os::fd::BorrowedFd,
};
use super::SocketOps;
use crate::{connection::socket::RecvmsgResult, runtime::IoSource};
#[derive(Debug)]
pub(crate) struct PipeOps;
impl SocketOps for PipeOps {
fn recv(&self, source: &IoSource, buffer: &mut [u8]) -> RecvmsgResult {
let read = rustix::io::read(source, buffer)?;
Ok((read, vec![]))
}
fn send(
&self,
source: &IoSource,
buffers: &[IoSlice<'_>],
fds: &[BorrowedFd<'_>],
) -> io::Result<usize> {
if !fds.is_empty() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"fds cannot be sent over a pipe",
));
}
Ok(rustix::io::writev(source, buffers)?)
}
fn shutdown(&self, _source: &IoSource) -> io::Result<()> {
Ok(())
}
}