1use 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#[async_trait]
15pub trait FileSystem {
16 async fn init(&self, req: &Request<'_>) -> nix::Result<()>;
18
19 async fn destroy(&self, req: &Request<'_>);
21
22 async fn interrupt(&self, req: &Request<'_>, unique: u64);
24
25 async fn lookup(
27 &self,
28 req: &Request<'_>,
29 parent: INum,
30 name: &str,
31 reply: ReplyEntry<'_>,
32 ) -> nix::Result<usize>;
33
34 async fn forget(&self, req: &Request<'_>, nlookup: u64);
36
37 async fn getattr(&self, req: &Request<'_>, reply: ReplyAttr<'_>) -> nix::Result<usize>;
39
40 async fn setattr(
42 &self,
43 req: &Request<'_>,
44 param: SetAttrParam,
45 reply: ReplyAttr<'_>,
46 ) -> nix::Result<usize>;
47
48 async fn readlink(&self, req: &Request<'_>, reply: ReplyData<'_>) -> nix::Result<usize>;
50
51 async fn mknod(
53 &self,
54 req: &Request<'_>,
55 param: CreateParam,
56 reply: ReplyEntry<'_>,
57 ) -> nix::Result<usize>;
58
59 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 async fn unlink(
71 &self,
72 req: &Request<'_>,
73 parent: INum,
74 name: &str,
75 reply: ReplyEmpty<'_>,
76 ) -> nix::Result<usize>;
77
78 async fn rmdir(
80 &self,
81 req: &Request<'_>,
82 parent: INum,
83 name: &str,
84 reply: ReplyEmpty<'_>,
85 ) -> nix::Result<usize>;
86
87 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 async fn rename(
99 &self,
100 req: &Request<'_>,
101 param: RenameParam,
102 reply: ReplyEmpty<'_>,
103 ) -> nix::Result<usize>;
104
105 async fn link(
107 &self,
108 _req: &Request<'_>,
109 _newparent: u64,
110 _newname: &str,
111 reply: ReplyEntry<'_>,
112 ) -> nix::Result<usize>;
113
114 async fn open(&self, req: &Request<'_>, flags: u32, reply: ReplyOpen<'_>)
116 -> nix::Result<usize>;
117
118 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 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 async fn flush(
141 &self,
142 req: &Request<'_>,
143 fh: u64,
144 lock_owner: u64,
145 reply: ReplyEmpty<'_>,
146 ) -> nix::Result<usize>;
147
148 async fn release(
150 &self,
151 req: &Request<'_>,
152 fh: u64,
153 flags: u32, lock_owner: u64,
155 flush: bool,
156 reply: ReplyEmpty<'_>,
157 ) -> nix::Result<usize>;
158
159 async fn fsync(
161 &self,
162 req: &Request<'_>,
163 fh: u64,
164 datasync: bool,
165 reply: ReplyEmpty<'_>,
166 ) -> nix::Result<usize>;
167
168 async fn opendir(
170 &self,
171 req: &Request<'_>,
172 flags: u32,
173 reply: ReplyOpen<'_>,
174 ) -> nix::Result<usize>;
175
176 async fn readdir(
178 &self,
179 req: &Request<'_>,
180 fh: u64,
181 offset: i64,
182 reply: ReplyDirectory<'_>,
183 ) -> nix::Result<usize>;
184
185 async fn releasedir(
187 &self,
188 req: &Request<'_>,
189 fh: u64,
190 flags: u32,
191 reply: ReplyEmpty<'_>,
192 ) -> nix::Result<usize>;
193
194 async fn fsyncdir(
196 &self,
197 req: &Request<'_>,
198 fh: u64,
199 datasync: bool,
200 reply: ReplyEmpty<'_>,
201 ) -> nix::Result<usize>;
202
203 async fn statfs(&self, req: &Request<'_>, reply: ReplyStatFs<'_>) -> nix::Result<usize>;
205
206 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 async fn getxattr(
219 &self,
220 _req: &Request<'_>,
221 _name: &str,
222 _size: u32,
223 reply: ReplyXAttr<'_>,
224 ) -> nix::Result<usize>;
225
226 async fn listxattr(
228 &self,
229 _req: &Request<'_>,
230 _size: u32,
231 reply: ReplyXAttr<'_>,
232 ) -> nix::Result<usize>;
233
234 async fn removexattr(
236 &self,
237 _req: &Request<'_>,
238 _name: &str,
239 reply: ReplyEmpty<'_>,
240 ) -> nix::Result<usize>;
241
242 async fn access(
244 &self,
245 _req: &Request<'_>,
246 _mask: u32,
247 reply: ReplyEmpty<'_>,
248 ) -> nix::Result<usize>;
249
250 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 async fn getlk(
263 &self,
264 _req: &Request<'_>,
265 _lk_param: FileLockParam,
266 reply: ReplyLock<'_>,
267 ) -> nix::Result<usize>;
268
269 async fn setlk(
271 &self,
272 _req: &Request<'_>,
273 _lk_param: FileLockParam,
274 _sleep: bool,
275 reply: ReplyEmpty<'_>,
276 ) -> nix::Result<usize>;
277
278 async fn bmap(
280 &self,
281 _req: &Request<'_>,
282 _blocksize: u32,
283 _idx: u64,
284 reply: ReplyBMap<'_>,
285 ) -> nix::Result<usize>;
286}
287