polyfuse_kernel/
lib.rs

1//! FUSE application binary interface for `polyfuse`.
2//!
3//! The binding is compatible with ABI 7.31 (in libfuse 3.10.1).
4
5#![allow(nonstandard_style, clippy::identity_op)]
6
7use std::convert::TryFrom;
8use std::error;
9use std::fmt;
10use zerocopy::FromBytes;
11use zerocopy::Immutable;
12use zerocopy::IntoBytes;
13use zerocopy::KnownLayout;
14
15/// The major version number of FUSE protocol.
16pub const FUSE_KERNEL_VERSION: u32 = 7;
17
18/// The minor version number of FUSE protocol.
19pub const FUSE_KERNEL_MINOR_VERSION: u32 = 31;
20
21/// The minimum length of read buffer.
22pub const FUSE_MIN_READ_BUFFER: u32 = 8192;
23
24/// Maximum of in_iovecs + out_iovecs
25pub const FUSE_IOCTL_MAX_IOV: u32 = 256;
26
27// Bitmasks for fuse_setattr_in.valid
28pub const FATTR_MODE: u32 = 1 << 0;
29pub const FATTR_UID: u32 = 1 << 1;
30pub const FATTR_GID: u32 = 1 << 2;
31pub const FATTR_SIZE: u32 = 1 << 3;
32pub const FATTR_ATIME: u32 = 1 << 4;
33pub const FATTR_MTIME: u32 = 1 << 5;
34pub const FATTR_FH: u32 = 1 << 6;
35pub const FATTR_ATIME_NOW: u32 = 1 << 7;
36pub const FATTR_MTIME_NOW: u32 = 1 << 8;
37pub const FATTR_LOCKOWNER: u32 = 1 << 9;
38pub const FATTR_CTIME: u32 = 1 << 10;
39
40// Flags returned by the OPEN request.
41pub const FOPEN_DIRECT_IO: u32 = 1 << 0;
42pub const FOPEN_KEEP_CACHE: u32 = 1 << 1;
43pub const FOPEN_NONSEEKABLE: u32 = 1 << 2;
44pub const FOPEN_CACHE_DIR: u32 = 1 << 3;
45pub const FOPEN_STREAM: u32 = 1 << 4;
46
47// INIT request/reply flags.
48pub const FUSE_ASYNC_READ: u32 = 1;
49pub const FUSE_POSIX_LOCKS: u32 = 1 << 1;
50pub const FUSE_FILE_OPS: u32 = 1 << 2;
51pub const FUSE_ATOMIC_O_TRUNC: u32 = 1 << 3;
52pub const FUSE_EXPORT_SUPPORT: u32 = 1 << 4;
53pub const FUSE_BIG_WRITES: u32 = 1 << 5;
54pub const FUSE_DONT_MASK: u32 = 1 << 6;
55pub const FUSE_SPLICE_WRITE: u32 = 1 << 7;
56pub const FUSE_SPLICE_MOVE: u32 = 1 << 8;
57pub const FUSE_SPLICE_READ: u32 = 1 << 9;
58pub const FUSE_FLOCK_LOCKS: u32 = 1 << 10;
59pub const FUSE_HAS_IOCTL_DIR: u32 = 1 << 11;
60pub const FUSE_AUTO_INVAL_DATA: u32 = 1 << 12;
61pub const FUSE_DO_READDIRPLUS: u32 = 1 << 13;
62pub const FUSE_READDIRPLUS_AUTO: u32 = 1 << 14;
63pub const FUSE_ASYNC_DIO: u32 = 1 << 15;
64pub const FUSE_WRITEBACK_CACHE: u32 = 1 << 16;
65pub const FUSE_NO_OPEN_SUPPORT: u32 = 1 << 17;
66pub const FUSE_PARALLEL_DIROPS: u32 = 1 << 18;
67pub const FUSE_HANDLE_KILLPRIV: u32 = 1 << 19;
68pub const FUSE_POSIX_ACL: u32 = 1 << 20;
69pub const FUSE_ABORT_ERROR: u32 = 1 << 21;
70pub const FUSE_MAX_PAGES: u32 = 1 << 22;
71pub const FUSE_CACHE_SYMLINKS: u32 = 1 << 23;
72pub const FUSE_NO_OPENDIR_SUPPORT: u32 = 1 << 24;
73pub const FUSE_EXPLICIT_INVAL_DATA: u32 = 1 << 25;
74
75// CUSE INIT request/reply flags.
76pub const CUSE_UNRESTRICTED_IOCTL: u32 = 1 << 0;
77
78// Release flags.
79pub const FUSE_RELEASE_FLUSH: u32 = 1 << 0;
80pub const FUSE_RELEASE_FLOCK_UNLOCK: u32 = 1 << 1;
81
82// Getattr flags.
83pub const FUSE_GETATTR_FH: u32 = 1;
84
85// Lock flags.
86pub const FUSE_LK_FLOCK: u32 = 1 << 0;
87
88// WRITE flags.
89pub const FUSE_WRITE_CACHE: u32 = 1 << 0;
90pub const FUSE_WRITE_LOCKOWNER: u32 = 1 << 1;
91pub const FUSE_WRITE_KILL_PRIV: u32 = 1 << 2;
92
93// Read flags.
94pub const FUSE_READ_LOCKOWNER: u32 = 1 << 1;
95
96// Ioctl flags.
97pub const FUSE_IOCTL_COMPAT: u32 = 1 << 0;
98pub const FUSE_IOCTL_UNRESTRICTED: u32 = 1 << 1;
99pub const FUSE_IOCTL_RETRY: u32 = 1 << 2;
100pub const FUSE_IOCTL_32BIT: u32 = 1 << 3;
101pub const FUSE_IOCTL_DIR: u32 = 1 << 4;
102pub const FUSE_IOCTL_COMPAT_X32: u32 = 1 << 5;
103
104// Poll flags.
105pub const FUSE_POLL_SCHEDULE_NOTIFY: u32 = 1 << 0;
106
107// Fsync flags.
108pub const FUSE_FSYNC_FDATASYNC: u32 = 1 << 0;
109
110// misc
111pub const FUSE_COMPAT_ENTRY_OUT_SIZE: usize = 120;
112pub const FUSE_COMPAT_ATTR_OUT_SIZE: usize = 96;
113pub const FUSE_COMPAT_MKNOD_IN_SIZE: usize = 8;
114pub const FUSE_COMPAT_WRITE_IN_SIZE: usize = 24;
115pub const FUSE_COMPAT_STATFS_SIZE: usize = 48;
116pub const FUSE_COMPAT_INIT_OUT_SIZE: usize = 8;
117pub const FUSE_COMPAT_22_INIT_OUT_SIZE: usize = 24;
118pub const CUSE_INIT_INFO_MAX: u32 = 4096;
119
120#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
121#[repr(C)]
122pub struct fuse_attr {
123    pub ino: u64,
124    pub size: u64,
125    pub blocks: u64,
126    pub atime: u64,
127    pub mtime: u64,
128    pub ctime: u64,
129    pub atimensec: u32,
130    pub mtimensec: u32,
131    pub ctimensec: u32,
132    pub mode: u32,
133    pub nlink: u32,
134    pub uid: u32,
135    pub gid: u32,
136    pub rdev: u32,
137    pub blksize: u32,
138    pub padding: u32,
139}
140
141#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
142#[repr(C)]
143pub struct fuse_dirent {
144    pub ino: u64,
145    pub off: u64,
146    pub namelen: u32,
147    pub typ: u32,
148    pub name: [u8; 0],
149}
150
151#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
152#[repr(C)]
153pub struct fuse_direntplus {
154    pub entry_out: fuse_entry_out,
155    pub dirent: fuse_dirent,
156}
157
158#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
159#[repr(C)]
160pub struct fuse_kstatfs {
161    pub blocks: u64,
162    pub bfree: u64,
163    pub bavail: u64,
164    pub files: u64,
165    pub ffree: u64,
166    pub bsize: u32,
167    pub namelen: u32,
168    pub frsize: u32,
169    pub padding: u32,
170    pub spare: [u32; 6usize],
171}
172
173#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
174#[repr(C)]
175pub struct fuse_file_lock {
176    pub start: u64,
177    pub end: u64,
178    pub typ: u32,
179    pub pid: u32,
180}
181
182macro_rules! define_opcode {
183    ($(
184        $(#[$m:meta])*
185        $VARIANT:ident = $val:expr,
186    )*) => {
187        $(
188            #[doc(hidden)]
189            pub const $VARIANT: u32 = $val;
190        )*
191
192        #[derive(Clone, Copy, Hash, PartialEq)]
193        #[repr(u32)]
194        pub enum fuse_opcode {
195            $(
196                $(#[$m])*
197                $VARIANT = self::$VARIANT,
198            )*
199        }
200
201        impl TryFrom<u32> for fuse_opcode {
202            type Error = UnknownOpcode;
203
204            fn try_from(opcode: u32) -> Result<Self, Self::Error> {
205                match opcode {
206                    $(
207                        $val => Ok(Self::$VARIANT),
208                    )*
209                    opcode => Err(UnknownOpcode(opcode)),
210                }
211            }
212        }
213    };
214}
215
216define_opcode! {
217    FUSE_LOOKUP = 1,
218    FUSE_FORGET = 2,
219    FUSE_GETATTR = 3,
220    FUSE_SETATTR = 4,
221    FUSE_READLINK = 5,
222    FUSE_SYMLINK = 6,
223    // _ = 7,
224    FUSE_MKNOD = 8,
225    FUSE_MKDIR = 9,
226    FUSE_UNLINK = 10,
227    FUSE_RMDIR = 11,
228    FUSE_RENAME = 12,
229    FUSE_LINK = 13,
230    FUSE_OPEN = 14,
231    FUSE_READ = 15,
232    FUSE_WRITE = 16,
233    FUSE_STATFS = 17,
234    FUSE_RELEASE = 18,
235    // _ = 19,
236    FUSE_FSYNC = 20,
237    FUSE_SETXATTR = 21,
238    FUSE_GETXATTR = 22,
239    FUSE_LISTXATTR = 23,
240    FUSE_REMOVEXATTR = 24,
241    FUSE_FLUSH = 25,
242    FUSE_INIT = 26,
243    FUSE_OPENDIR = 27,
244    FUSE_READDIR = 28,
245    FUSE_RELEASEDIR = 29,
246    FUSE_FSYNCDIR = 30,
247    FUSE_GETLK = 31,
248    FUSE_SETLK = 32,
249    FUSE_SETLKW = 33,
250    FUSE_ACCESS = 34,
251    FUSE_CREATE = 35,
252    FUSE_INTERRUPT = 36,
253    FUSE_BMAP = 37,
254    FUSE_DESTROY = 38,
255    FUSE_IOCTL = 39,
256    FUSE_POLL = 40,
257    FUSE_NOTIFY_REPLY = 41,
258    FUSE_BATCH_FORGET = 42,
259    FUSE_FALLOCATE = 43,
260    FUSE_READDIRPLUS = 44,
261    FUSE_RENAME2 = 45,
262    FUSE_LSEEK = 46,
263    FUSE_COPY_FILE_RANGE = 47,
264
265    CUSE_INIT = 4096,
266}
267
268#[doc(hidden)]
269#[derive(Debug)]
270pub struct UnknownOpcode(u32);
271
272impl fmt::Display for UnknownOpcode {
273    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
274        write!(f, "unknown opcode: {}", self.0)
275    }
276}
277
278impl error::Error for UnknownOpcode {}
279
280#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
281#[repr(C)]
282pub struct fuse_in_header {
283    pub len: u32,
284    pub opcode: u32,
285    pub unique: u64,
286    pub nodeid: u64,
287    pub uid: u32,
288    pub gid: u32,
289    pub pid: u32,
290    pub padding: u32,
291}
292
293#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
294#[repr(C)]
295pub struct fuse_init_in {
296    pub major: u32,
297    pub minor: u32,
298    pub max_readahead: u32,
299    pub flags: u32,
300}
301
302#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
303#[repr(C)]
304pub struct fuse_forget_in {
305    pub nlookup: u64,
306}
307
308#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
309#[repr(C)]
310pub struct fuse_getattr_in {
311    pub getattr_flags: u32,
312    pub dummy: u32,
313    pub fh: u64,
314}
315
316#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
317#[repr(C)]
318pub struct fuse_setattr_in {
319    pub valid: u32,
320    pub padding: u32,
321    pub fh: u64,
322    pub size: u64,
323    pub lock_owner: u64,
324    pub atime: u64,
325    pub mtime: u64,
326    pub ctime: u64,
327    pub atimensec: u32,
328    pub mtimensec: u32,
329    pub ctimensec: u32,
330    pub mode: u32,
331    pub unused4: u32,
332    pub uid: u32,
333    pub gid: u32,
334    pub unused5: u32,
335}
336
337#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
338#[repr(C)]
339pub struct fuse_mknod_in {
340    pub mode: u32,
341    pub rdev: u32,
342    pub umask: u32,
343    pub padding: u32,
344}
345
346#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
347#[repr(C)]
348pub struct fuse_mkdir_in {
349    pub mode: u32,
350    pub umask: u32,
351}
352
353#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
354#[repr(C)]
355pub struct fuse_rename_in {
356    pub newdir: u64,
357}
358
359#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
360#[repr(C)]
361pub struct fuse_link_in {
362    pub oldnodeid: u64,
363}
364
365#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
366#[repr(C)]
367pub struct fuse_open_in {
368    pub flags: u32,
369    pub unused: u32,
370}
371
372#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
373#[repr(C)]
374pub struct fuse_read_in {
375    pub fh: u64,
376    pub offset: u64,
377    pub size: u32,
378    pub read_flags: u32,
379    pub lock_owner: u64,
380    pub flags: u32,
381    pub padding: u32,
382}
383
384#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
385#[repr(C)]
386pub struct fuse_write_in {
387    pub fh: u64,
388    pub offset: u64,
389    pub size: u32,
390    pub write_flags: u32,
391    pub lock_owner: u64,
392    pub flags: u32,
393    pub padding: u32,
394}
395
396#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
397#[repr(C)]
398pub struct fuse_flush_in {
399    pub fh: u64,
400    pub unused: u32,
401    pub padding: u32,
402    pub lock_owner: u64,
403}
404
405#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
406#[repr(C)]
407pub struct fuse_release_in {
408    pub fh: u64,
409    pub flags: u32,
410    pub release_flags: u32,
411    pub lock_owner: u64,
412}
413
414#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
415#[repr(C)]
416pub struct fuse_fsync_in {
417    pub fh: u64,
418    pub fsync_flags: u32,
419    pub padding: u32,
420}
421
422#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
423#[repr(C)]
424pub struct fuse_getxattr_in {
425    pub size: u32,
426    pub padding: u32,
427}
428
429#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
430#[repr(C)]
431pub struct fuse_setxattr_in {
432    pub size: u32,
433    pub flags: u32,
434}
435
436#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
437#[repr(C)]
438pub struct fuse_lk_in {
439    pub fh: u64,
440    pub owner: u64,
441    pub lk: fuse_file_lock,
442    pub lk_flags: u32,
443    pub padding: u32,
444}
445
446#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
447#[repr(C)]
448pub struct fuse_access_in {
449    pub mask: u32,
450    pub padding: u32,
451}
452
453#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
454#[repr(C)]
455pub struct fuse_create_in {
456    pub flags: u32,
457    pub mode: u32,
458    pub umask: u32,
459    pub padding: u32,
460}
461
462#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
463#[repr(C)]
464pub struct fuse_bmap_in {
465    pub block: u64,
466    pub blocksize: u32,
467    pub padding: u32,
468}
469
470#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
471#[repr(C)]
472pub struct fuse_out_header {
473    pub len: u32,
474    pub error: i32,
475    pub unique: u64,
476}
477
478#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
479#[repr(C)]
480pub struct fuse_attr_out {
481    pub attr_valid: u64,
482    pub attr_valid_nsec: u32,
483    pub dummy: u32,
484    pub attr: fuse_attr,
485}
486
487#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
488#[repr(C)]
489pub struct fuse_entry_out {
490    pub nodeid: u64,
491    pub generation: u64,
492    pub entry_valid: u64,
493    pub attr_valid: u64,
494    pub entry_valid_nsec: u32,
495    pub attr_valid_nsec: u32,
496    pub attr: fuse_attr,
497}
498
499#[derive(Clone, Copy, FromBytes, IntoBytes, KnownLayout, Immutable)]
500#[repr(C)]
501pub struct fuse_init_out {
502    pub major: u32,
503    pub minor: u32,
504    pub max_readahead: u32,
505    pub flags: u32,
506    pub max_background: u16,
507    pub congestion_threshold: u16,
508    pub max_write: u32,
509    pub time_gran: u32,
510    pub max_pages: u16,
511    pub padding: u16,
512    pub unused: [u32; 8],
513}
514
515impl Default for fuse_init_out {
516    fn default() -> Self {
517        Self {
518            major: FUSE_KERNEL_VERSION,
519            minor: FUSE_KERNEL_MINOR_VERSION,
520            max_readahead: 0,
521            flags: 0,
522            max_background: 0,
523            congestion_threshold: 0,
524            max_write: 0,
525            time_gran: 0,
526            max_pages: 0,
527            padding: 0,
528            unused: [0; 8],
529        }
530    }
531}
532
533#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
534#[repr(C)]
535pub struct fuse_getxattr_out {
536    pub size: u32,
537    pub padding: u32,
538}
539
540#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
541#[repr(C)]
542pub struct fuse_open_out {
543    pub fh: u64,
544    pub open_flags: u32,
545    pub padding: u32,
546}
547
548#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
549#[repr(C)]
550pub struct fuse_write_out {
551    pub size: u32,
552    pub padding: u32,
553}
554
555#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
556#[repr(C)]
557pub struct fuse_statfs_out {
558    pub st: fuse_kstatfs,
559}
560
561#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
562#[repr(C)]
563pub struct fuse_lk_out {
564    pub lk: fuse_file_lock,
565}
566
567#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
568#[repr(C)]
569pub struct fuse_bmap_out {
570    pub block: u64,
571}
572
573#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
574#[repr(C)]
575pub struct fuse_ioctl_in {
576    pub fh: u64,
577    pub flags: u32,
578    pub cmd: u32,
579    pub arg: u64,
580    pub in_size: u32,
581    pub out_size: u32,
582}
583
584#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
585#[repr(C)]
586pub struct fuse_ioctl_out {
587    pub result: i32,
588    pub flags: u32,
589    pub in_iovs: u32,
590    pub out_iovs: u32,
591}
592
593#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
594#[repr(C)]
595pub struct fuse_ioctl_iovec {
596    pub base: u64,
597    pub len: u64,
598}
599
600#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
601#[repr(C)]
602pub struct fuse_poll_in {
603    pub fh: u64,
604    pub kh: u64,
605    pub flags: u32,
606    pub events: u32,
607}
608
609#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
610#[repr(C)]
611pub struct fuse_poll_out {
612    pub revents: u32,
613    pub padding: u32,
614}
615
616#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
617#[repr(C)]
618pub struct fuse_interrupt_in {
619    pub unique: u64,
620}
621
622#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
623#[repr(C)]
624pub struct fuse_fallocate_in {
625    pub fh: u64,
626    pub offset: u64,
627    pub length: u64,
628    pub mode: u32,
629    pub padding: u32,
630}
631
632#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
633#[repr(C)]
634pub struct fuse_batch_forget_in {
635    pub count: u32,
636    pub dummy: u32,
637}
638
639#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
640#[repr(C)]
641pub struct fuse_forget_one {
642    pub nodeid: u64,
643    pub nlookup: u64,
644}
645
646#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
647#[repr(C)]
648pub struct fuse_rename2_in {
649    pub newdir: u64,
650    pub flags: u32,
651    pub padding: u32,
652}
653
654#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
655#[repr(C)]
656pub struct fuse_lseek_in {
657    pub fh: u64,
658    pub offset: u64,
659    pub whence: u32,
660    pub padding: u32,
661}
662
663#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
664#[repr(C)]
665pub struct fuse_lseek_out {
666    pub offset: u64,
667}
668
669#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
670#[repr(C)]
671pub struct fuse_copy_file_range_in {
672    pub fh_in: u64,
673    pub off_in: u64,
674    pub nodeid_out: u64,
675    pub fh_out: u64,
676    pub off_out: u64,
677    pub len: u64,
678    pub flags: u64,
679}
680
681macro_rules! define_notify_code {
682    ($(
683        $(#[$m:meta])*
684        $VARIANT:ident = $val:expr,
685    )*) => {
686        $(
687            #[doc(hidden)]
688            pub const $VARIANT: u32 = $val;
689        )*
690
691        #[derive(Clone, Copy, PartialEq, Hash)]
692        #[repr(u32)]
693        pub enum fuse_notify_code {
694            $(
695                $(#[$m])*
696                $VARIANT = self::$VARIANT,
697            )*
698        }
699    };
700}
701
702define_notify_code! {
703    FUSE_NOTIFY_POLL = 1,
704    FUSE_NOTIFY_INVAL_INODE = 2,
705    FUSE_NOTIFY_INVAL_ENTRY = 3,
706    FUSE_NOTIFY_STORE = 4,
707    FUSE_NOTIFY_RETRIEVE = 5,
708    FUSE_NOTIFY_DELETE = 6,
709}
710
711#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
712#[repr(C)]
713pub struct fuse_notify_poll_wakeup_out {
714    pub kh: u64,
715}
716
717#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
718#[repr(C)]
719pub struct fuse_notify_inval_inode_out {
720    pub ino: u64,
721    pub off: i64,
722    pub len: i64,
723}
724
725#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
726#[repr(C)]
727pub struct fuse_notify_inval_entry_out {
728    pub parent: u64,
729    pub namelen: u32,
730    pub padding: u32,
731}
732
733#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
734#[repr(C)]
735pub struct fuse_notify_delete_out {
736    pub parent: u64,
737    pub child: u64,
738    pub namelen: u32,
739    pub padding: u32,
740}
741
742#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
743#[repr(C)]
744pub struct fuse_notify_store_out {
745    pub nodeid: u64,
746    pub offset: u64,
747    pub size: u32,
748    pub padding: u32,
749}
750
751#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
752#[repr(C)]
753pub struct fuse_notify_retrieve_out {
754    pub notify_unique: u64,
755    pub nodeid: u64,
756    pub offset: u64,
757    pub size: u32,
758    pub padding: u32,
759}
760
761#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
762#[repr(C)]
763pub struct fuse_notify_retrieve_in {
764    pub dummy1: u64,
765    pub offset: u64,
766    pub size: u32,
767    pub dummy2: u32,
768    pub dummy3: u64,
769    pub dummy4: u64,
770}
771
772#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
773#[repr(C)]
774pub struct cuse_init_in {
775    pub major: u32,
776    pub minor: u32,
777    pub unused: u32,
778    pub flags: u32,
779}
780
781#[derive(Clone, Copy, Default, FromBytes, IntoBytes, KnownLayout, Immutable)]
782#[repr(C)]
783pub struct cuse_init_out {
784    pub major: u32,
785    pub minor: u32,
786    pub unused: u32,
787    pub flags: u32,
788    pub max_read: u32,
789    pub max_write: u32,
790    pub dev_major: u32,
791    pub dev_minor: u32,
792    pub spare: [u32; 10],
793}