use std::ffi::OsString;
use std::num::NonZeroU32;
use std::time::{Duration, SystemTime};
use futures_util::stream::Stream;
#[cfg(feature = "file-lock")]
pub use crate::raw::reply::ReplyLock;
pub use crate::raw::reply::{
ReplyBmap, ReplyCopyFileRange, ReplyData, ReplyLSeek, ReplyOpen, ReplyPoll, ReplyStatFs,
ReplyWrite, ReplyXAttr,
};
use crate::{FileType, Inode, Result};
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct FileAttr {
pub size: u64,
pub blocks: u64,
pub atime: SystemTime,
pub mtime: SystemTime,
pub ctime: SystemTime,
#[cfg(target_os = "macos")]
pub crtime: SystemTime,
pub kind: FileType,
pub perm: u16,
pub nlink: u32,
pub uid: u32,
pub gid: u32,
pub rdev: u32,
#[cfg(target_os = "macos")]
pub flags: u32,
pub blksize: u32,
}
impl From<(Inode, FileAttr)> for crate::raw::reply::FileAttr {
fn from((inode, attr): (u64, FileAttr)) -> Self {
crate::raw::reply::FileAttr {
ino: inode,
size: attr.size,
blocks: attr.blocks,
atime: attr.atime.into(),
mtime: attr.mtime.into(),
ctime: attr.ctime.into(),
#[cfg(target_os = "macos")]
crtime: attr.crtime.into(),
kind: attr.kind,
perm: attr.perm,
nlink: attr.nlink,
uid: attr.uid,
gid: attr.gid,
rdev: attr.rdev,
#[cfg(target_os = "macos")]
flags: attr.flags,
blksize: attr.blksize,
}
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct ReplyInit {
pub max_write: NonZeroU32,
}
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct ReplyEntry {
pub ttl: Duration,
pub attr: FileAttr,
}
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct ReplyAttr {
pub ttl: Duration,
pub attr: FileAttr,
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct ReplyCreated {
pub ttl: Duration,
pub attr: FileAttr,
pub generation: u64,
pub fh: u64,
pub flags: u32,
}
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct DirectoryEntry {
pub kind: FileType,
pub name: OsString,
pub offset: i64,
}
pub struct ReplyDirectory<S: Stream<Item = Result<DirectoryEntry>>> {
pub entries: S,
}
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct DirectoryEntryPlus {
pub kind: FileType,
pub name: OsString,
pub offset: i64,
pub attr: FileAttr,
pub entry_ttl: Duration,
pub attr_ttl: Duration,
}
pub struct ReplyDirectoryPlus<S: Stream<Item = Result<DirectoryEntryPlus>>> {
pub entries: S,
}