From a3212a0ba07da7bdae9e17637fbc237e2ae01c08 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Mon, 27 Dec 2021 00:44:23 -0600 Subject: Redesign the API around a user-provided main loop This is basically a full library rewrite. --- src/fuse/mod.rs | 69 ++++++++++++--------------------------------------------- 1 file changed, 14 insertions(+), 55 deletions(-) (limited to 'src/fuse/mod.rs') diff --git a/src/fuse/mod.rs b/src/fuse/mod.rs index 0e39e6b..5fe6f46 100644 --- a/src/fuse/mod.rs +++ b/src/fuse/mod.rs @@ -1,87 +1,46 @@ -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}; +use crate::proto; +use std::marker::PhantomData; 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 { - _fusermount_fd: DumbFd, - session_fd: AsyncFd, - proto_minor: u32, - fs: Fs, - input_semaphore: Arc, - large_buffers: Mutex>>, - known: Mutex>, - destroy: Notify, - interrupt_tx: broadcast::Sender, -} - -#[doc(cfg(feature = "server"))] -pub struct Start { - fusermount_fd: DumbFd, - session_fd: DumbFd, -} +pub mod session; mod private_trait { - pub trait Operation<'o, Fs: super::Fuse> { - type RequestBody = (); - type ReplyTail = (); - - fn consume_errno(_errno: i32, _tail: &mut Self::ReplyTail) {} + pub trait Operation<'o> { + type RequestBody: crate::proto::Structured<'o>; + type ReplyTail: Default; } } use private_trait::Operation; -#[doc(cfg(feature = "server"))] -pub type Op<'o, Fs, O> = (Request<'o, Fs, O>, Reply<'o, Fs, O>, &'o Arc>); +pub type Op<'o, O = ops::Any> = (Request<'o, O>, Reply<'o, O>); #[doc(cfg(feature = "server"))] -pub struct Request<'o, Fs: Fuse, O: Operation<'o, Fs>> { - header: &'o proto::InHeader, +pub struct Request<'o, O: Operation<'o>> { + header: proto::InHeader, body: O::RequestBody, } #[doc(cfg(feature = "server"))] -pub struct Reply<'o, Fs: Fuse, O: Operation<'o, Fs>> { - session: &'o Session, +pub struct Reply<'o, O: Operation<'o>> { + session: &'o session::Session, unique: u64, tail: O::ReplyTail, } #[must_use] #[doc(cfg(feature = "server"))] -pub struct Done<'o>(FuseResult>); +pub struct Done<'o>(PhantomData<*mut &'o ()>); impl Done<'_> { - fn from_result(result: FuseResult<()>) -> Self { - Done(result.map(|()| PhantomData)) - } - - fn into_result(self) -> FuseResult<()> { - self.0.map(|PhantomData| ()) + fn done() -> Self { + Done(PhantomData) } } -- cgit v1.2.3