use crate::prelude::*;
use crate::unix_fs;
macro_rules! fd_handler_readonly_methods {
() => {
fn flush(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
_lock_owner: u64,
) -> FuseResult<()> {
unix_fs::flush(file_handle.as_borrowed_fd())
}
fn fsync(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
datasync: bool,
) -> FuseResult<()> {
unix_fs::fsync(file_handle.as_borrowed_fd(), datasync)
}
fn lseek(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
seek: SeekFrom,
) -> FuseResult<i64> {
unix_fs::lseek(file_handle.as_borrowed_fd(), seek)
}
fn read(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
seek: SeekFrom,
size: u32,
_flags: FUSEOpenFlags,
_lock_owner: Option<u64>,
) -> FuseResult<Vec<u8>> {
unix_fs::read(file_handle.as_borrowed_fd(), seek, size as usize)
}
fn release(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: OwnedFileHandle,
_flags: OpenFlags,
_lock_owner: Option<u64>,
_flush: bool,
) -> FuseResult<()> {
unix_fs::release(file_handle.into_owned_fd())
}
};
}
macro_rules! fd_handler_readwrite_methods {
() => {
fn copy_file_range(
&self,
_req: &RequestInfo,
_file_in: TId,
file_handle_in: BorrowedFileHandle,
offset_in: i64,
_file_out: TId,
file_handle_out: BorrowedFileHandle,
offset_out: i64,
len: u64,
_flags: u32,
) -> FuseResult<u32> {
unix_fs::copy_file_range(
file_handle_in.as_borrowed_fd(),
offset_in,
file_handle_out.as_borrowed_fd(),
offset_out,
len,
)
}
fn fallocate(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
offset: i64,
length: i64,
mode: FallocateFlags,
) -> FuseResult<()> {
unix_fs::fallocate(file_handle.as_borrowed_fd(), offset, length, mode)
}
fn write(
&self,
_req: &RequestInfo,
_file_id: TId,
file_handle: BorrowedFileHandle,
seek: SeekFrom,
data: Vec<u8>,
_write_flags: FUSEWriteFlags,
_flags: OpenFlags,
_lock_owner: Option<u64>,
) -> FuseResult<u32> {
unix_fs::write(file_handle.as_borrowed_fd(), seek, &data).map(|res| res as u32)
}
};
}
pub struct FdHandlerHelper<TId: FileIdType> {
inner: Box<dyn FuseHandler<TId>>,
}
impl<TId: FileIdType> FdHandlerHelper<TId> {
pub fn new<THandler: FuseHandler<TId>>(inner: THandler) -> Self {
Self {
inner: Box::new(inner),
}
}
}
impl<TId: FileIdType> FuseHandler<TId> for FdHandlerHelper<TId> {
fn get_inner(&self) -> &dyn FuseHandler<TId> {
self.inner.as_ref()
}
fd_handler_readonly_methods!();
fd_handler_readwrite_methods!();
}
pub struct FdHandlerHelperReadOnly<TId: FileIdType> {
inner: Box<dyn FuseHandler<TId>>,
}
impl<TId: FileIdType> FdHandlerHelperReadOnly<TId> {
pub fn new<THandler: FuseHandler<TId>>(inner: THandler) -> Self {
Self {
inner: Box::new(inner),
}
}
}
impl<TId: FileIdType> FuseHandler<TId> for FdHandlerHelperReadOnly<TId> {
fn get_inner(&self) -> &dyn FuseHandler<TId> {
self.inner.as_ref()
}
fd_handler_readonly_methods!();
}