summaryrefslogtreecommitdiff
path: root/src/fuse/mod.rs
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2021-12-27 00:44:23 -0600
committerAlejandro Soto <alejandro@34project.org>2021-12-28 19:43:44 -0600
commita3212a0ba07da7bdae9e17637fbc237e2ae01c08 (patch)
tree00be583beba0f321ebeea3af21582ce927943b44 /src/fuse/mod.rs
parent311b2a40213aa48131a189f99dc4258d354c0c78 (diff)
Redesign the API around a user-provided main loop
This is basically a full library rewrite.
Diffstat (limited to '')
-rw-r--r--src/fuse/mod.rs69
1 files changed, 14 insertions, 55 deletions
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<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,
-}
+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<Session<Fs>>);
+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<Fs>,
+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<PhantomData<&'o ()>>);
+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)
}
}