use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
pub type KernelStr<'a> = std::borrow::Cow<'a, str>;
pub(crate) type IoError = std::io::Error;
pub(crate) type IoResult<T> = std::result::Result<T, IoError>;
mod subvolume;
pub(crate) use subvolume::{
open_parent_with_name, set_subvol_name, set_vol_name, subvol_info_args_from_root_item,
};
pub(crate) mod send;
pub enum OptionFd<'r>
{
Owned(OwnedFd),
Borrowed(BorrowedFd<'r>),
}
impl<'r> Clone for OptionFd<'r>
{
fn clone(&self) -> Self
{
match self {
Self::Borrowed(b) => Self::Borrowed(*b),
Self::Owned(o) => {
Self::Borrowed(unsafe { BorrowedFd::borrow_raw(o.as_fd().as_raw_fd()) })
}
}
}
}
impl AsFd for OptionFd<'_>
{
fn as_fd(&self) -> BorrowedFd<'_>
{
match self {
Self::Owned(f) => f.as_fd(),
Self::Borrowed(f) => f.as_fd(),
}
}
}
impl AsRawFd for OptionFd<'_>
{
fn as_raw_fd(&self) -> RawFd
{
match self {
Self::Owned(f) => f.as_raw_fd(),
Self::Borrowed(f) => f.as_raw_fd(),
}
}
}
pub(crate) fn btrfs_ioctl<T, R: AsFd>(resource: R, op: libc::Ioctl, argp: *mut T) -> IoResult<()>
{
match syscall!(unsafe { ioctl(resource.as_fd().as_raw_fd(), op as libc::Ioctl, argp) }) {
Err(e) => {
if e.raw_os_error() == Some(libc::ENOTTY) {
Err(std::io::ErrorKind::Unsupported.into())
} else {
Err(e)
}
}
Ok(_) => Ok(()),
}
}