1mod argument;
4pub mod fuse_abi;
5pub(crate) mod notify;
6pub(crate) mod reply;
7mod request;
8
9use std::{convert::TryInto, num::NonZeroI32, time::SystemTime};
10
11pub use reply::Response;
12pub use request::{AnyRequest, FileHandle, INodeNo, Lock, Operation, Request, RequestId, Version};
13
14#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
15pub enum TimeOrNow {
18 SpecificTime(SystemTime),
20 Now,
22}
23
24macro_rules! errno {
25 ($x: expr_2021) => {
26 Errno(unsafe {
27 const _X: [(); 0 - !{
29 const ASSERT: bool = ($x > 0);
30 ASSERT
31 } as usize] = [];
32 NonZeroI32::new_unchecked($x)
34 })
35 };
36}
37
38#[derive(Debug)]
40pub struct Errno(pub NonZeroI32);
41impl Errno {
42 pub const EPERM: Errno = errno!(libc::EPERM);
44 pub const ENOENT: Errno = errno!(libc::ENOENT);
46 pub const ESRCH: Errno = errno!(libc::ESRCH);
48 pub const EINTR: Errno = errno!(libc::EINTR);
50 pub const EIO: Errno = errno!(libc::EIO);
52 pub const ENXIO: Errno = errno!(libc::ENXIO);
54 pub const E2BIG: Errno = errno!(libc::E2BIG);
56 pub const ENOEXEC: Errno = errno!(libc::ENOEXEC);
58 pub const EBADF: Errno = errno!(libc::EBADF);
60 pub const ECHILD: Errno = errno!(libc::ECHILD);
62 pub const EAGAIN: Errno = errno!(libc::EAGAIN);
64 pub const ENOMEM: Errno = errno!(libc::ENOMEM);
66 pub const EACCES: Errno = errno!(libc::EACCES);
68 pub const EFAULT: Errno = errno!(libc::EFAULT);
70 pub const ENOTBLK: Errno = errno!(libc::ENOTBLK);
72 pub const EBUSY: Errno = errno!(libc::EBUSY);
74 pub const EEXIST: Errno = errno!(libc::EEXIST);
76 pub const EXDEV: Errno = errno!(libc::EXDEV);
78 pub const ENODEV: Errno = errno!(libc::ENODEV);
80 pub const ENOTDIR: Errno = errno!(libc::ENOTDIR);
82 pub const EISDIR: Errno = errno!(libc::EISDIR);
84 pub const EINVAL: Errno = errno!(libc::EINVAL);
86 pub const ENFILE: Errno = errno!(libc::ENFILE);
88 pub const EMFILE: Errno = errno!(libc::EMFILE);
90 pub const ENOTTY: Errno = errno!(libc::ENOTTY);
92 pub const ETXTBSY: Errno = errno!(libc::ETXTBSY);
94 pub const EFBIG: Errno = errno!(libc::EFBIG);
96 pub const ENOSPC: Errno = errno!(libc::ENOSPC);
98 pub const ESPIPE: Errno = errno!(libc::ESPIPE);
100 pub const EROFS: Errno = errno!(libc::EROFS);
102 pub const EMLINK: Errno = errno!(libc::EMLINK);
104 pub const EPIPE: Errno = errno!(libc::EPIPE);
106 pub const EDOM: Errno = errno!(libc::EDOM);
108 pub const ERANGE: Errno = errno!(libc::ERANGE);
110 pub const EDEADLK: Errno = errno!(libc::EDEADLK);
112 pub const ENAMETOOLONG: Errno = errno!(libc::ENAMETOOLONG);
114 pub const ENOLCK: Errno = errno!(libc::ENOLCK);
116 pub const ENOSYS: Errno = errno!(libc::ENOSYS);
118 pub const ENOTEMPTY: Errno = errno!(libc::ENOTEMPTY);
120 pub const ELOOP: Errno = errno!(libc::ELOOP);
122 pub const EWOULDBLOCK: Errno = errno!(libc::EWOULDBLOCK);
124 pub const ENOMSG: Errno = errno!(libc::ENOMSG);
126 pub const EIDRM: Errno = errno!(libc::EIDRM);
128 pub const EREMOTE: Errno = errno!(libc::EREMOTE);
130 pub const ENOLINK: Errno = errno!(libc::ENOLINK);
132 pub const EPROTO: Errno = errno!(libc::EPROTO);
134 pub const EMULTIHOP: Errno = errno!(libc::EMULTIHOP);
136 pub const EBADMSG: Errno = errno!(libc::EBADMSG);
138 pub const EOVERFLOW: Errno = errno!(libc::EOVERFLOW);
140 pub const EILSEQ: Errno = errno!(libc::EILSEQ);
142 pub const EUSERS: Errno = errno!(libc::EUSERS);
144 pub const ENOTSOCK: Errno = errno!(libc::ENOTSOCK);
146 pub const EDESTADDRREQ: Errno = errno!(libc::EDESTADDRREQ);
148 pub const EMSGSIZE: Errno = errno!(libc::EMSGSIZE);
150 pub const EPROTOTYPE: Errno = errno!(libc::EPROTOTYPE);
152 pub const ENOPROTOOPT: Errno = errno!(libc::ENOPROTOOPT);
154 pub const EPROTONOSUPPORT: Errno = errno!(libc::EPROTONOSUPPORT);
156 pub const ESOCKTNOSUPPORT: Errno = errno!(libc::ESOCKTNOSUPPORT);
158 pub const EOPNOTSUPP: Errno = errno!(libc::EOPNOTSUPP);
160 pub const EPFNOSUPPORT: Errno = errno!(libc::EPFNOSUPPORT);
162 pub const EAFNOSUPPORT: Errno = errno!(libc::EAFNOSUPPORT);
164 pub const EADDRINUSE: Errno = errno!(libc::EADDRINUSE);
166 pub const EADDRNOTAVAIL: Errno = errno!(libc::EADDRNOTAVAIL);
168 pub const ENETDOWN: Errno = errno!(libc::ENETDOWN);
170 pub const ENETUNREACH: Errno = errno!(libc::ENETUNREACH);
172 pub const ENETRESET: Errno = errno!(libc::ENETRESET);
174 pub const ECONNABORTED: Errno = errno!(libc::ECONNABORTED);
176 pub const ECONNRESET: Errno = errno!(libc::ECONNRESET);
178 pub const ENOBUFS: Errno = errno!(libc::ENOBUFS);
180 pub const EISCONN: Errno = errno!(libc::EISCONN);
182 pub const ENOTCONN: Errno = errno!(libc::ENOTCONN);
184 pub const ESHUTDOWN: Errno = errno!(libc::ESHUTDOWN);
186 pub const ETOOMANYREFS: Errno = errno!(libc::ETOOMANYREFS);
188 pub const ETIMEDOUT: Errno = errno!(libc::ETIMEDOUT);
190 pub const ECONNREFUSED: Errno = errno!(libc::ECONNREFUSED);
192 pub const EHOSTDOWN: Errno = errno!(libc::EHOSTDOWN);
194 pub const EHOSTUNREACH: Errno = errno!(libc::EHOSTUNREACH);
196 pub const EALREADY: Errno = errno!(libc::EALREADY);
198 pub const EINPROGRESS: Errno = errno!(libc::EINPROGRESS);
200 pub const ESTALE: Errno = errno!(libc::ESTALE);
202 pub const EDQUOT: Errno = errno!(libc::EDQUOT);
204 pub const ECANCELED: Errno = errno!(libc::ECANCELED);
206 pub const EOWNERDEAD: Errno = errno!(libc::EOWNERDEAD);
208 pub const ENOTRECOVERABLE: Errno = errno!(libc::ENOTRECOVERABLE);
210 pub const ENOTSUP: Errno = errno!(libc::ENOTSUP);
212
213 #[cfg(target_os = "linux")]
215 pub const ENODATA: Errno = errno!(libc::ENODATA);
216 #[cfg(not(target_os = "linux"))]
218 pub const ENOATTR: Errno = errno!(libc::ENOATTR);
219
220 #[cfg(target_os = "linux")]
223 pub const NO_XATTR: Errno = Self::ENODATA;
224 #[cfg(not(target_os = "linux"))]
225 pub const NO_XATTR: Errno = Self::ENOATTR;
226
227 pub fn from_i32(err: i32) -> Errno {
228 err.try_into().ok().map(Errno).unwrap_or(Errno::EIO)
229 }
230}
231impl From<std::io::Error> for Errno {
232 fn from(err: std::io::Error) -> Self {
233 let errno = err.raw_os_error().unwrap_or(0);
234 match errno.try_into() {
235 Ok(i) => Errno(i),
236 Err(_) => Errno::EIO,
237 }
238 }
239}
240impl From<nix::errno::Errno> for Errno {
241 fn from(x: nix::errno::Errno) -> Self {
242 let err: std::io::Error = x.into();
243 err.into()
244 }
245}
246impl From<std::io::ErrorKind> for Errno {
247 fn from(x: std::io::ErrorKind) -> Self {
248 let err: std::io::Error = x.into();
249 err.into()
250 }
251}
252impl From<Errno> for i32 {
253 fn from(x: Errno) -> Self {
254 x.0.into()
255 }
256}
257
258#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
266pub struct Generation(pub u64);
267impl From<Generation> for u64 {
268 fn from(fh: Generation) -> Self {
269 fh.0
270 }
271}
272
273#[cfg(test)]
274mod test {
275 use std::io::IoSlice;
276 use std::ops::{Deref, DerefMut};
277 #[cfg(test)]
280 #[repr(align(8))]
281 pub(crate) struct AlignedData<T>(pub T);
282 impl<T> Deref for AlignedData<T> {
283 type Target = T;
284
285 fn deref(&self) -> &Self::Target {
286 &self.0
287 }
288 }
289 impl<T> DerefMut for AlignedData<T> {
290 fn deref_mut(&mut self) -> &mut Self::Target {
291 &mut self.0
292 }
293 }
294
295 pub fn ioslice_to_vec(s: &[IoSlice<'_>]) -> Vec<u8> {
296 let mut v = Vec::with_capacity(s.iter().map(|x| x.len()).sum());
297 for x in s {
298 v.extend_from_slice(x);
299 }
300 v
301 }
302}