pub trait PipeFileDescriptor: FileDescriptor + OnDiskFileDescriptor + PipeLikeFileDescriptor
{
fn clone_for_child_process(&self) -> Self;
fn change_capacity(&self, new_capacity: NonZeroU32) -> Result<NonZeroU32, ChangeCapacityError>
{
let result = unsafe { fcntl(self.as_raw_fd(), F_SETPIPE_SZ, new_capacity.get() as i32) };
if likely!(result > 0)
{
Ok(new_non_zero_u32(result as u32))
}
else if likely!(result == -1)
{
use self::ChangeCapacityError::*;
match errno().0
{
EPERM => Err(PermissionDenied),
EBUSY => Err(WouldReduceCapacityBelowThatInUse),
unexpected @ _ => panic!("Unexpected error {}", unexpected),
}
}
else
{
unreachable_code(format_args!("Unexpected result {} from fcntl(_, F_GETPIPE_SZ)", result))
}
}
fn get_capacity(&self) -> NonZeroU32
{
let result = unsafe { fcntl(self.as_raw_fd(), F_GETPIPE_SZ) };
if likely!(result > 0)
{
new_non_zero_u32(result as u32)
}
else if likely!(result == -1)
{
panic!("Unexpected error {}", errno());
}
else
{
unreachable_code(format_args!("Unexpected result {} from fcntl(_, F_GETPIPE_SZ)", result))
}
}
#[inline(always)]
fn get_number_of_unread_bytes(&self) -> usize
{
let mut count: i32 = unsafe_uninitialized();
let result = unsafe { ioctl(self.as_raw_fd(), FIONREAD, &mut count) };
if likely!(result == 0)
{
count as usize
}
else if likely!(result == -1)
{
panic!("Unexpected error {}", errno());
}
else
{
unreachable_code(format_args!("Unexpected result {} from ioctl(_, FIONREAD)", result))
}
}
}