async_fusex/
file_system.rs

1//! The `FileSystem` trait
2use std::path::Path;
3
4use async_trait::async_trait;
5
6use super::fuse_reply::{
7    ReplyAttr, ReplyBMap, ReplyCreate, ReplyData, ReplyDirectory, ReplyEmpty, ReplyEntry,
8    ReplyLock, ReplyOpen, ReplyStatFs, ReplyWrite, ReplyXAttr,
9};
10use super::fuse_request::Request;
11use crate::fs_util::{CreateParam, FileLockParam, INum, RenameParam, SetAttrParam};
12
13/// FUSE filesystem trait
14#[async_trait]
15pub trait FileSystem {
16    /// Initialize filesystem
17    async fn init(&self, req: &Request<'_>) -> nix::Result<()>;
18
19    /// Clean up filesystem
20    async fn destroy(&self, req: &Request<'_>);
21
22    /// Interrupt another FUSE request
23    async fn interrupt(&self, req: &Request<'_>, unique: u64);
24
25    /// Look up a directory entry by name and get its attributes.
26    async fn lookup(
27        &self,
28        req: &Request<'_>,
29        parent: INum,
30        name: &str,
31        reply: ReplyEntry<'_>,
32    ) -> nix::Result<usize>;
33
34    /// Forget about an inode
35    async fn forget(&self, req: &Request<'_>, nlookup: u64);
36
37    /// Get file attributes.
38    async fn getattr(&self, req: &Request<'_>, reply: ReplyAttr<'_>) -> nix::Result<usize>;
39
40    /// Set file attributes.
41    async fn setattr(
42        &self,
43        req: &Request<'_>,
44        param: SetAttrParam,
45        reply: ReplyAttr<'_>,
46    ) -> nix::Result<usize>;
47
48    /// Read symbolic link.
49    async fn readlink(&self, req: &Request<'_>, reply: ReplyData<'_>) -> nix::Result<usize>;
50
51    /// Create file node.
52    async fn mknod(
53        &self,
54        req: &Request<'_>,
55        param: CreateParam,
56        reply: ReplyEntry<'_>,
57    ) -> nix::Result<usize>;
58
59    /// Create a directory
60    async fn mkdir(
61        &self,
62        req: &Request<'_>,
63        parent: INum,
64        name: &str,
65        mode: u32,
66        reply: ReplyEntry<'_>,
67    ) -> nix::Result<usize>;
68
69    /// Remove a file
70    async fn unlink(
71        &self,
72        req: &Request<'_>,
73        parent: INum,
74        name: &str,
75        reply: ReplyEmpty<'_>,
76    ) -> nix::Result<usize>;
77
78    /// Remove a directory
79    async fn rmdir(
80        &self,
81        req: &Request<'_>,
82        parent: INum,
83        name: &str,
84        reply: ReplyEmpty<'_>,
85    ) -> nix::Result<usize>;
86
87    /// Create a symbolic link
88    async fn symlink(
89        &self,
90        req: &Request<'_>,
91        parent: INum,
92        name: &str,
93        target_path: &Path,
94        reply: ReplyEntry<'_>,
95    ) -> nix::Result<usize>;
96
97    /// Rename a file
98    async fn rename(
99        &self,
100        req: &Request<'_>,
101        param: RenameParam,
102        reply: ReplyEmpty<'_>,
103    ) -> nix::Result<usize>;
104
105    /// Create a hard link
106    async fn link(
107        &self,
108        _req: &Request<'_>,
109        _newparent: u64,
110        _newname: &str,
111        reply: ReplyEntry<'_>,
112    ) -> nix::Result<usize>;
113
114    /// Open a file
115    async fn open(&self, req: &Request<'_>, flags: u32, reply: ReplyOpen<'_>)
116        -> nix::Result<usize>;
117
118    /// Read data
119    async fn read(
120        &self,
121        req: &Request<'_>,
122        fh: u64,
123        offset: i64,
124        size: u32,
125        reply: ReplyData<'_>,
126    ) -> nix::Result<usize>;
127
128    /// Write data
129    async fn write(
130        &self,
131        req: &Request<'_>,
132        fh: u64,
133        offset: i64,
134        data: Vec<u8>,
135        flags: u32,
136        reply: ReplyWrite<'_>,
137    ) -> nix::Result<usize>;
138
139    /// Flush method
140    async fn flush(
141        &self,
142        req: &Request<'_>,
143        fh: u64,
144        lock_owner: u64,
145        reply: ReplyEmpty<'_>,
146    ) -> nix::Result<usize>;
147
148    /// Release an open file
149    async fn release(
150        &self,
151        req: &Request<'_>,
152        fh: u64,
153        flags: u32, // same as the open flags
154        lock_owner: u64,
155        flush: bool,
156        reply: ReplyEmpty<'_>,
157    ) -> nix::Result<usize>;
158
159    /// Synchronize file contents
160    async fn fsync(
161        &self,
162        req: &Request<'_>,
163        fh: u64,
164        datasync: bool,
165        reply: ReplyEmpty<'_>,
166    ) -> nix::Result<usize>;
167
168    /// Open a directory
169    async fn opendir(
170        &self,
171        req: &Request<'_>,
172        flags: u32,
173        reply: ReplyOpen<'_>,
174    ) -> nix::Result<usize>;
175
176    /// Read directory
177    async fn readdir(
178        &self,
179        req: &Request<'_>,
180        fh: u64,
181        offset: i64,
182        reply: ReplyDirectory<'_>,
183    ) -> nix::Result<usize>;
184
185    /// Release an open directory
186    async fn releasedir(
187        &self,
188        req: &Request<'_>,
189        fh: u64,
190        flags: u32,
191        reply: ReplyEmpty<'_>,
192    ) -> nix::Result<usize>;
193
194    /// Synchronize directory contents
195    async fn fsyncdir(
196        &self,
197        req: &Request<'_>,
198        fh: u64,
199        datasync: bool,
200        reply: ReplyEmpty<'_>,
201    ) -> nix::Result<usize>;
202
203    /// Get file system statistics
204    async fn statfs(&self, req: &Request<'_>, reply: ReplyStatFs<'_>) -> nix::Result<usize>;
205
206    /// Set an extended attribute
207    async fn setxattr(
208        &self,
209        _req: &Request<'_>,
210        _name: &str,
211        _value: &[u8],
212        _flags: u32,
213        _position: u32,
214        reply: ReplyEmpty<'_>,
215    ) -> nix::Result<usize>;
216
217    /// Get an extended attribute
218    async fn getxattr(
219        &self,
220        _req: &Request<'_>,
221        _name: &str,
222        _size: u32,
223        reply: ReplyXAttr<'_>,
224    ) -> nix::Result<usize>;
225
226    /// Get an extended attribute
227    async fn listxattr(
228        &self,
229        _req: &Request<'_>,
230        _size: u32,
231        reply: ReplyXAttr<'_>,
232    ) -> nix::Result<usize>;
233
234    /// Remove an extended attribute
235    async fn removexattr(
236        &self,
237        _req: &Request<'_>,
238        _name: &str,
239        reply: ReplyEmpty<'_>,
240    ) -> nix::Result<usize>;
241
242    /// Check file access permissions
243    async fn access(
244        &self,
245        _req: &Request<'_>,
246        _mask: u32,
247        reply: ReplyEmpty<'_>,
248    ) -> nix::Result<usize>;
249
250    /// Create and open a file
251    async fn create(
252        &self,
253        _req: &Request<'_>,
254        _parent: u64,
255        _name: &str,
256        _mode: u32,
257        _flags: u32,
258        reply: ReplyCreate<'_>,
259    ) -> nix::Result<usize>;
260
261    /// Test for a POSIX file lock
262    async fn getlk(
263        &self,
264        _req: &Request<'_>,
265        _lk_param: FileLockParam,
266        reply: ReplyLock<'_>,
267    ) -> nix::Result<usize>;
268
269    /// Acquire, modify or release a POSIX file lock
270    async fn setlk(
271        &self,
272        _req: &Request<'_>,
273        _lk_param: FileLockParam,
274        _sleep: bool,
275        reply: ReplyEmpty<'_>,
276    ) -> nix::Result<usize>;
277
278    /// Map block index within file to block index within device
279    async fn bmap(
280        &self,
281        _req: &Request<'_>,
282        _blocksize: u32,
283        _idx: u64,
284        reply: ReplyBMap<'_>,
285    ) -> nix::Result<usize>;
286}
287