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