1mod argument;
4pub(crate) mod flags;
5pub(crate) mod fuse_abi;
6pub(crate) mod ioctl;
7pub(crate) mod ioslice_concat;
8pub(crate) mod notify;
9pub(crate) mod reply;
10#[cfg(feature = "async")]
11pub mod reply_async;
12pub(crate) mod request;
13#[cfg(feature = "async")]
14pub(crate) mod request_async;
15
16use std::num::NonZeroI32;
17use std::time::SystemTime;
18
19pub(crate) use reply::ResponseData;
20pub(crate) use reply::ResponseEmpty;
21pub(crate) use reply::ResponseErrno;
22pub(crate) use reply::ResponseIoctl;
23pub(crate) use reply::ResponseSlice;
24pub(crate) use reply::ResponseStruct;
25pub(crate) use request::AnyRequest;
26pub(crate) use request::FileHandle;
27pub(crate) use request::INodeNo;
28pub(crate) use request::Lock;
29pub(crate) use request::Operation;
30pub use request::RequestId;
31pub(crate) use request::Version;
32
33#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
34pub enum TimeOrNow {
37 SpecificTime(SystemTime),
39 Now,
41}
42
43macro_rules! errno {
44 ($x:expr) => {
45 Errno(match NonZeroI32::new($x) {
46 Some(x) => x,
47 None => panic!(),
48 })
49 };
50}
51
52macro_rules! no_xattr_doc {
53 () => {"Use this as an error return from getxattr/removexattr to indicate that the xattr doesn't exist. This resolves to the appropriate platform-specific error code."}
54}
55
56#[derive(Debug, Copy, Clone)]
58pub struct Errno(
59 NonZeroI32,
61);
62impl Errno {
63 pub const EPERM: Errno = errno!(libc::EPERM);
65 pub const ENOENT: Errno = errno!(libc::ENOENT);
67 pub const ESRCH: Errno = errno!(libc::ESRCH);
69 pub const EINTR: Errno = errno!(libc::EINTR);
71 pub const EIO: Errno = errno!(libc::EIO);
73 pub const ENXIO: Errno = errno!(libc::ENXIO);
75 pub const E2BIG: Errno = errno!(libc::E2BIG);
77 pub const ENOEXEC: Errno = errno!(libc::ENOEXEC);
79 pub const EBADF: Errno = errno!(libc::EBADF);
81 pub const ECHILD: Errno = errno!(libc::ECHILD);
83 pub const EAGAIN: Errno = errno!(libc::EAGAIN);
85 pub const ENOMEM: Errno = errno!(libc::ENOMEM);
87 pub const EACCES: Errno = errno!(libc::EACCES);
89 pub const EFAULT: Errno = errno!(libc::EFAULT);
91 pub const ENOTBLK: Errno = errno!(libc::ENOTBLK);
93 pub const EBUSY: Errno = errno!(libc::EBUSY);
95 pub const EEXIST: Errno = errno!(libc::EEXIST);
97 pub const EXDEV: Errno = errno!(libc::EXDEV);
99 pub const ENODEV: Errno = errno!(libc::ENODEV);
101 pub const ENOTDIR: Errno = errno!(libc::ENOTDIR);
103 pub const EISDIR: Errno = errno!(libc::EISDIR);
105 pub const EINVAL: Errno = errno!(libc::EINVAL);
107 pub const ENFILE: Errno = errno!(libc::ENFILE);
109 pub const EMFILE: Errno = errno!(libc::EMFILE);
111 pub const ENOTTY: Errno = errno!(libc::ENOTTY);
113 pub const ETXTBSY: Errno = errno!(libc::ETXTBSY);
115 pub const EFBIG: Errno = errno!(libc::EFBIG);
117 pub const ENOSPC: Errno = errno!(libc::ENOSPC);
119 pub const ESPIPE: Errno = errno!(libc::ESPIPE);
121 pub const EROFS: Errno = errno!(libc::EROFS);
123 pub const EMLINK: Errno = errno!(libc::EMLINK);
125 pub const EPIPE: Errno = errno!(libc::EPIPE);
127 pub const EDOM: Errno = errno!(libc::EDOM);
129 pub const ERANGE: Errno = errno!(libc::ERANGE);
131 pub const EDEADLK: Errno = errno!(libc::EDEADLK);
133 pub const ENAMETOOLONG: Errno = errno!(libc::ENAMETOOLONG);
135 pub const ENOLCK: Errno = errno!(libc::ENOLCK);
137 pub const ENOSYS: Errno = errno!(libc::ENOSYS);
139 pub const ENOTEMPTY: Errno = errno!(libc::ENOTEMPTY);
141 pub const ELOOP: Errno = errno!(libc::ELOOP);
143 pub const EWOULDBLOCK: Errno = errno!(libc::EWOULDBLOCK);
145 pub const ENOMSG: Errno = errno!(libc::ENOMSG);
147 pub const EIDRM: Errno = errno!(libc::EIDRM);
149 pub const EREMOTE: Errno = errno!(libc::EREMOTE);
151 pub const ENOLINK: Errno = errno!(libc::ENOLINK);
153 pub const EPROTO: Errno = errno!(libc::EPROTO);
155 pub const EMULTIHOP: Errno = errno!(libc::EMULTIHOP);
157 pub const EBADMSG: Errno = errno!(libc::EBADMSG);
159 pub const EOVERFLOW: Errno = errno!(libc::EOVERFLOW);
161 pub const EILSEQ: Errno = errno!(libc::EILSEQ);
163 pub const EUSERS: Errno = errno!(libc::EUSERS);
165 pub const ENOTSOCK: Errno = errno!(libc::ENOTSOCK);
167 pub const EDESTADDRREQ: Errno = errno!(libc::EDESTADDRREQ);
169 pub const EMSGSIZE: Errno = errno!(libc::EMSGSIZE);
171 pub const EPROTOTYPE: Errno = errno!(libc::EPROTOTYPE);
173 pub const ENOPROTOOPT: Errno = errno!(libc::ENOPROTOOPT);
175 pub const EPROTONOSUPPORT: Errno = errno!(libc::EPROTONOSUPPORT);
177 pub const ESOCKTNOSUPPORT: Errno = errno!(libc::ESOCKTNOSUPPORT);
179 pub const EOPNOTSUPP: Errno = errno!(libc::EOPNOTSUPP);
181 pub const EPFNOSUPPORT: Errno = errno!(libc::EPFNOSUPPORT);
183 pub const EAFNOSUPPORT: Errno = errno!(libc::EAFNOSUPPORT);
185 pub const EADDRINUSE: Errno = errno!(libc::EADDRINUSE);
187 pub const EADDRNOTAVAIL: Errno = errno!(libc::EADDRNOTAVAIL);
189 pub const ENETDOWN: Errno = errno!(libc::ENETDOWN);
191 pub const ENETUNREACH: Errno = errno!(libc::ENETUNREACH);
193 pub const ENETRESET: Errno = errno!(libc::ENETRESET);
195 pub const ECONNABORTED: Errno = errno!(libc::ECONNABORTED);
197 pub const ECONNRESET: Errno = errno!(libc::ECONNRESET);
199 pub const ENOBUFS: Errno = errno!(libc::ENOBUFS);
201 pub const EISCONN: Errno = errno!(libc::EISCONN);
203 pub const ENOTCONN: Errno = errno!(libc::ENOTCONN);
205 pub const ESHUTDOWN: Errno = errno!(libc::ESHUTDOWN);
207 pub const ETOOMANYREFS: Errno = errno!(libc::ETOOMANYREFS);
209 pub const ETIMEDOUT: Errno = errno!(libc::ETIMEDOUT);
211 pub const ECONNREFUSED: Errno = errno!(libc::ECONNREFUSED);
213 pub const EHOSTDOWN: Errno = errno!(libc::EHOSTDOWN);
215 pub const EHOSTUNREACH: Errno = errno!(libc::EHOSTUNREACH);
217 pub const EALREADY: Errno = errno!(libc::EALREADY);
219 pub const EINPROGRESS: Errno = errno!(libc::EINPROGRESS);
221 pub const ESTALE: Errno = errno!(libc::ESTALE);
223 pub const EDQUOT: Errno = errno!(libc::EDQUOT);
225 pub const ECANCELED: Errno = errno!(libc::ECANCELED);
227 pub const EOWNERDEAD: Errno = errno!(libc::EOWNERDEAD);
229 pub const ENOTRECOVERABLE: Errno = errno!(libc::ENOTRECOVERABLE);
231 pub const ENOTSUP: Errno = errno!(libc::ENOTSUP);
233 #[cfg(any(target_os = "freebsd", target_os = "macos"))]
235 pub const EFTYPE: Errno = errno!(libc::EFTYPE);
236
237 #[cfg(target_os = "linux")]
239 pub const ENODATA: Errno = errno!(libc::ENODATA);
240 #[doc = no_xattr_doc!()]
241 #[cfg(target_os = "linux")]
242 pub const NO_XATTR: Errno = Self::ENODATA;
243
244 #[cfg(not(target_os = "linux"))]
246 pub const ENOATTR: Errno = errno!(libc::ENOATTR);
247 #[doc = no_xattr_doc!()]
248 #[cfg(not(target_os = "linux"))]
249 pub const NO_XATTR: Errno = Self::ENOATTR;
250
251 pub fn from_i32(err: i32) -> Errno {
253 NonZeroI32::new(err)
254 .filter(|err| err.get() > 0)
255 .map(Errno)
256 .unwrap_or(Errno::EIO)
257 }
258
259 pub fn code(self) -> i32 {
261 self.0.get()
262 }
263}
264impl From<std::io::Error> for Errno {
265 fn from(err: std::io::Error) -> Self {
266 let errno = err.raw_os_error().unwrap_or(0);
267 Errno::from_i32(errno)
268 }
269}
270impl From<nix::errno::Errno> for Errno {
271 fn from(err: nix::errno::Errno) -> Self {
272 Errno::from_i32(err as i32)
273 }
274}
275impl From<std::io::ErrorKind> for Errno {
276 fn from(x: std::io::ErrorKind) -> Self {
277 let err: std::io::Error = x.into();
278 err.into()
279 }
280}
281impl From<Errno> for i32 {
282 fn from(x: Errno) -> Self {
283 x.0.get()
284 }
285}
286
287#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
295pub struct Generation(pub u64);
296impl From<Generation> for u64 {
297 fn from(fh: Generation) -> Self {
298 fh.0
299 }
300}
301
302#[cfg(test)]
303mod test {
304 use std::io::IoSlice;
305 use std::ops::Deref;
306 use std::ops::DerefMut;
307 #[cfg(test)]
310 #[repr(align(8))]
311 pub(crate) struct AlignedData<T>(pub T);
312 impl<T> Deref for AlignedData<T> {
313 type Target = T;
314
315 fn deref(&self) -> &Self::Target {
316 &self.0
317 }
318 }
319 impl<T> DerefMut for AlignedData<T> {
320 fn deref_mut(&mut self) -> &mut Self::Target {
321 &mut self.0
322 }
323 }
324
325 pub(crate) fn ioslice_to_vec(s: &[IoSlice<'_>]) -> Vec<u8> {
326 let mut v = Vec::with_capacity(s.iter().map(|x| x.len()).sum());
327 for x in s {
328 v.extend_from_slice(x);
329 }
330 v
331 }
332}