use std::time::{Duration, SystemTime, UNIX_EPOCH};
pub use async_trait::async_trait;
use nix::sys::stat::mode_t;
pub use errno::Errno;
pub use helper::{mode_from_kind_and_perm, perm_from_mode_and_kind};
pub use mount_options::MountOptions;
use raw::abi::{
fuse_setattr_in, FATTR_ATIME, FATTR_ATIME_NOW, FATTR_CTIME, FATTR_GID, FATTR_LOCKOWNER,
FATTR_MODE, FATTR_MTIME, FATTR_MTIME_NOW, FATTR_SIZE, FATTR_UID,
};
mod errno;
mod helper;
mod mount_options;
pub mod notify;
pub mod path;
pub mod raw;
pub type Inode = u64;
pub type Result<T> = std::result::Result<T, Errno>;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum FileType {
NamedPipe,
CharDevice,
BlockDevice,
Directory,
RegularFile,
Symlink,
Socket,
}
impl From<FileType> for mode_t {
fn from(kind: FileType) -> Self {
match kind {
FileType::NamedPipe => libc::S_IFIFO,
FileType::CharDevice => libc::S_IFCHR,
FileType::BlockDevice => libc::S_IFBLK,
FileType::Directory => libc::S_IFDIR,
FileType::RegularFile => libc::S_IFREG,
FileType::Symlink => libc::S_IFLNK,
FileType::Socket => libc::S_IFSOCK,
}
}
}
#[derive(Debug, Clone, Default, Eq, PartialEq)]
pub struct SetAttr {
pub mode: Option<u32>,
pub uid: Option<u32>,
pub gid: Option<u32>,
pub size: Option<u64>,
pub lock_owner: Option<u64>,
pub atime: Option<SystemTime>,
pub mtime: Option<SystemTime>,
pub ctime: Option<SystemTime>,
#[cfg(target_os = "macos")]
pub crtime: Option<SystemTime>,
#[cfg(target_os = "macos")]
pub chgtime: Option<SystemTime>,
#[cfg(target_os = "macos")]
pub bkuptime: Option<SystemTime>,
#[cfg(target_os = "macos")]
pub flags: Option<u32>,
}
impl From<&fuse_setattr_in> for SetAttr {
fn from(setattr_in: &fuse_setattr_in) -> Self {
let mut set_attr = Self::default();
if setattr_in.valid & FATTR_MODE > 0 {
set_attr.mode = Some(setattr_in.mode);
}
if setattr_in.valid & FATTR_UID > 0 {
set_attr.uid = Some(setattr_in.uid);
}
if setattr_in.valid & FATTR_GID > 0 {
set_attr.gid = Some(setattr_in.gid);
}
if setattr_in.valid & FATTR_SIZE > 0 {
set_attr.size = Some(setattr_in.size);
}
if setattr_in.valid & FATTR_ATIME > 0 {
set_attr.atime =
Some(UNIX_EPOCH + Duration::new(setattr_in.atime, setattr_in.atimensec));
}
if setattr_in.valid & FATTR_ATIME_NOW > 0 {
set_attr.atime = Some(SystemTime::now());
}
if setattr_in.valid & FATTR_MTIME > 0 {
set_attr.mtime =
Some(UNIX_EPOCH + Duration::new(setattr_in.mtime, setattr_in.mtimensec));
}
if setattr_in.valid & FATTR_MTIME_NOW > 0 {
set_attr.mtime = Some(SystemTime::now());
}
if setattr_in.valid & FATTR_LOCKOWNER > 0 {
set_attr.lock_owner = Some(setattr_in.lock_owner);
}
if setattr_in.valid & FATTR_CTIME > 0 {
set_attr.ctime =
Some(UNIX_EPOCH + Duration::new(setattr_in.ctime, setattr_in.ctimensec));
}
set_attr
}
}