use std::time::{Duration, SystemTime, UNIX_EPOCH};
use fuser::FileAttr;
use crate::fs::FileEntry;
pub const TTL: Duration = Duration::from_secs(1);
pub const BLOCK_SIZE: u32 = 4096;
pub fn entry_to_attr(entry: &FileEntry) -> FileAttr {
let kind = if entry.file_type.is_dir() {
fuser::FileType::Directory
} else {
fuser::FileType::RegularFile
};
let mtime = datetime_to_system_time(&entry.modified_at);
let ctime = datetime_to_system_time(&entry.created_at);
let uid = unsafe { libc::getuid() };
let gid = unsafe { libc::getgid() };
let perm = if entry.file_type.is_dir() {
0o755
} else {
0o644
};
FileAttr {
ino: entry.id as u64,
size: entry.size,
blocks: (entry.size + 511) / 512,
atime: mtime, mtime,
ctime,
crtime: ctime, kind,
perm,
nlink: 1,
uid,
gid,
rdev: 0,
blksize: BLOCK_SIZE,
flags: 0,
}
}
pub fn root_attr(id: u64) -> FileAttr {
let now = SystemTime::now();
let uid = unsafe { libc::getuid() };
let gid = unsafe { libc::getgid() };
FileAttr {
ino: id,
size: 0,
blocks: 0,
atime: now,
mtime: now,
ctime: now,
crtime: now,
kind: fuser::FileType::Directory,
perm: 0o755,
nlink: 2,
uid,
gid,
rdev: 0,
blksize: BLOCK_SIZE,
flags: 0,
}
}
fn datetime_to_system_time(dt: &chrono::DateTime<chrono::Utc>) -> SystemTime {
let secs = dt.timestamp();
let nanos = dt.timestamp_subsec_nanos();
if secs >= 0 {
UNIX_EPOCH + Duration::new(secs as u64, nanos)
} else {
UNIX_EPOCH
}
}