diff options
Diffstat (limited to '')
| -rw-r--r-- | src/fuse/mod.rs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/fuse/mod.rs b/src/fuse/mod.rs new file mode 100644 index 0000000..0e39e6b --- /dev/null +++ b/src/fuse/mod.rs @@ -0,0 +1,87 @@ +use std::{ + collections::HashMap, + marker::PhantomData, + os::unix::io::RawFd, + sync::{Arc, Mutex}, +}; + +use tokio::{ + io::unix::AsyncFd, + sync::{broadcast, Notify, Semaphore}, +}; + +use crate::{proto, util::DumbFd, FuseResult, Ino}; + +pub mod io; + +#[doc(cfg(feature = "server"))] +pub mod fs; + +#[doc(cfg(feature = "server"))] +pub mod ops; + +#[doc(cfg(feature = "mount"))] +pub mod mount; + +mod session; +use fs::Fuse; + +#[doc(cfg(feature = "server"))] +pub struct Session<Fs: Fuse> { + _fusermount_fd: DumbFd, + session_fd: AsyncFd<RawFd>, + proto_minor: u32, + fs: Fs, + input_semaphore: Arc<Semaphore>, + large_buffers: Mutex<Vec<Box<[u8]>>>, + known: Mutex<HashMap<Ino, (Fs::Farc, u64)>>, + destroy: Notify, + interrupt_tx: broadcast::Sender<u64>, +} + +#[doc(cfg(feature = "server"))] +pub struct Start { + fusermount_fd: DumbFd, + session_fd: DumbFd, +} + +mod private_trait { + pub trait Operation<'o, Fs: super::Fuse> { + type RequestBody = (); + type ReplyTail = (); + + fn consume_errno(_errno: i32, _tail: &mut Self::ReplyTail) {} + } +} + +use private_trait::Operation; + +#[doc(cfg(feature = "server"))] +pub type Op<'o, Fs, O> = (Request<'o, Fs, O>, Reply<'o, Fs, O>, &'o Arc<Session<Fs>>); + +#[doc(cfg(feature = "server"))] +pub struct Request<'o, Fs: Fuse, O: Operation<'o, Fs>> { + header: &'o proto::InHeader, + body: O::RequestBody, +} + +#[doc(cfg(feature = "server"))] +pub struct Reply<'o, Fs: Fuse, O: Operation<'o, Fs>> { + session: &'o Session<Fs>, + unique: u64, + tail: O::ReplyTail, +} + +#[must_use] +#[doc(cfg(feature = "server"))] +pub struct Done<'o>(FuseResult<PhantomData<&'o ()>>); + +impl Done<'_> { + fn from_result(result: FuseResult<()>) -> Self { + Done(result.map(|()| PhantomData)) + } + + fn into_result(self) -> FuseResult<()> { + self.0.map(|PhantomData| ()) + } +} |
