use std::marker::PhantomData;
use crate::types::*;
use crate::unix_fs;
macro_rules! fd_handler_readonly_methods {
($file_id:path) => {
pub fn flush(
&self,
_req: &RequestInfo,
_file_id: $file_id,
file_handle: BorrowedFileHandle,
_lock_owner: u64,
) -> FuseResult<()> {
unix_fs::flush(file_handle.as_borrowed_fd())
}
pub fn fsync(
&self,
_req: &RequestInfo,
_file_id: $file_id,
file_handle: BorrowedFileHandle,
datasync: bool,
) -> FuseResult<()> {
unix_fs::fsync(file_handle.as_borrowed_fd(), datasync)
}
pub fn lseek(
&self,
_req: &RequestInfo,
_file_id: $file_id,
file_handle: BorrowedFileHandle,
seek: SeekFrom,
) -> FuseResult<i64> {
unix_fs::lseek(file_handle.as_borrowed_fd(), seek)
}
pub fn read(
&self,
_req: &RequestInfo,
_file_id: $file_id,
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)
}
pub fn release(
&self,
_req: &RequestInfo,
_file_id: $file_id,
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 {
($file_id:path) => {
pub fn copy_file_range(
&self,
_req: &RequestInfo,
_file_in: $file_id,
file_handle_in: BorrowedFileHandle,
offset_in: i64,
_file_out: $file_id,
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,
)
}
pub fn fallocate(
&self,
_req: &RequestInfo,
_file_id: $file_id,
file_handle: BorrowedFileHandle,
offset: i64,
length: i64,
mode: FallocateFlags,
) -> FuseResult<()> {
unix_fs::fallocate(file_handle.as_borrowed_fd(), offset, length, mode)
}
pub fn write(
&self,
_req: &RequestInfo,
_file_id: $file_id,
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> {
phantom: PhantomData<TId>,
}
impl<TId: FileIdType> Default for FdHandlerHelper<TId> {
fn default() -> Self {
Self::new()
}
}
impl<TId: FileIdType> FdHandlerHelper<TId> {
pub fn new() -> Self {
Self {
phantom: PhantomData,
}
}
}
impl<TId: FileIdType> FdHandlerHelper<TId> {
fd_handler_readonly_methods!(TId);
fd_handler_readwrite_methods!(TId);
}
pub struct FdHandlerHelperReadOnly<TId: FileIdType> {
phantom: PhantomData<TId>,
}
impl<TId: FileIdType> Default for FdHandlerHelperReadOnly<TId> {
fn default() -> Self {
Self::new()
}
}
impl<TId: FileIdType> FdHandlerHelperReadOnly<TId> {
pub fn new() -> Self {
Self {
phantom: PhantomData,
}
}
}
impl<TId: FileIdType> FdHandlerHelperReadOnly<TId> {
fd_handler_readonly_methods!(TId);
}
pub(super) use fd_handler_readonly_methods;
pub(super) use fd_handler_readwrite_methods;