summaryrefslogtreecommitdiff
path: root/src/fuse/mod.rs
blob: 0e39e6bc9f6ffae9488ac8d6e3b0291cc7bf1fb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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| ())
    }
}