use std::mem;
use bitflags::bitflags;
use enumn::N;
use zerocopy::FromBytes;
use zerocopy::Immutable;
use zerocopy::IntoBytes;
use zerocopy::KnownLayout;
use zerocopy::TryFromBytes;
pub const KERNEL_VERSION: u32 = 7;
pub const OLDEST_SUPPORTED_KERNEL_MINOR_VERSION: u32 = 27;
pub const KERNEL_MINOR_VERSION: u32 = 31;
pub const ROOT_ID: u64 = 1;
const FATTR_MODE: u32 = 1;
const FATTR_UID: u32 = 2;
const FATTR_GID: u32 = 4;
const FATTR_SIZE: u32 = 8;
const FATTR_ATIME: u32 = 16;
const FATTR_MTIME: u32 = 32;
pub const FATTR_FH: u32 = 64;
const FATTR_ATIME_NOW: u32 = 128;
const FATTR_MTIME_NOW: u32 = 256;
pub const FATTR_LOCKOWNER: u32 = 512;
const FATTR_CTIME: u32 = 1024;
bitflags! {
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct SetattrValid: u32 {
const MODE = FATTR_MODE;
const UID = FATTR_UID;
const GID = FATTR_GID;
const SIZE = FATTR_SIZE;
const ATIME = FATTR_ATIME;
const MTIME = FATTR_MTIME;
const ATIME_NOW = FATTR_ATIME_NOW;
const MTIME_NOW = FATTR_MTIME_NOW;
const CTIME = FATTR_CTIME;
}
}
const FOPEN_DIRECT_IO: u32 = 1 << 0;
const FOPEN_KEEP_CACHE: u32 = 1 << 1;
const FOPEN_NONSEEKABLE: u32 = 1 << 2;
const FOPEN_CACHE_DIR: u32 = 1 << 3;
const FOPEN_STREAM: u32 = 1 << 4;
const FOPEN_FILE_CREATED: u32 = 1 << 7;
bitflags! {
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct OpenOptions: u32 {
const DIRECT_IO = FOPEN_DIRECT_IO;
const KEEP_CACHE = FOPEN_KEEP_CACHE;
const NONSEEKABLE = FOPEN_NONSEEKABLE;
const CACHE_DIR = FOPEN_CACHE_DIR;
const STREAM = FOPEN_STREAM;
const FILE_CREATED = FOPEN_FILE_CREATED;
}
}
const ASYNC_READ: u64 = 1;
const POSIX_LOCKS: u64 = 2;
const FILE_OPS: u64 = 4;
const ATOMIC_O_TRUNC: u64 = 8;
const EXPORT_SUPPORT: u64 = 16;
const BIG_WRITES: u64 = 32;
const DONT_MASK: u64 = 64;
const SPLICE_WRITE: u64 = 128;
const SPLICE_MOVE: u64 = 256;
const SPLICE_READ: u64 = 512;
const FLOCK_LOCKS: u64 = 1024;
const HAS_IOCTL_DIR: u64 = 2048;
const AUTO_INVAL_DATA: u64 = 4096;
const DO_READDIRPLUS: u64 = 8192;
const READDIRPLUS_AUTO: u64 = 16384;
const ASYNC_DIO: u64 = 32768;
const WRITEBACK_CACHE: u64 = 65536;
const NO_OPEN_SUPPORT: u64 = 131072;
const PARALLEL_DIROPS: u64 = 262144;
const HANDLE_KILLPRIV: u64 = 524288;
const POSIX_ACL: u64 = 1048576;
const ABORT_ERROR: u64 = 2097152;
const MAX_PAGES: u64 = 4194304;
const CACHE_SYMLINKS: u64 = 8388608;
const NO_OPENDIR_SUPPORT: u64 = 16777216;
const EXPLICIT_INVAL_DATA: u64 = 33554432;
const MAP_ALIGNMENT: u64 = 67108864;
const INIT_EXT: u64 = 1073741824;
const SECURITY_CONTEXT: u64 = 4294967296;
bitflags! {
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct FsOptions: u64 {
const ASYNC_READ = ASYNC_READ;
const POSIX_LOCKS = POSIX_LOCKS;
const FILE_OPS = FILE_OPS;
const ATOMIC_O_TRUNC = ATOMIC_O_TRUNC;
const EXPORT_SUPPORT = EXPORT_SUPPORT;
const BIG_WRITES = BIG_WRITES;
const DONT_MASK = DONT_MASK;
const SPLICE_WRITE = SPLICE_WRITE;
const SPLICE_MOVE = SPLICE_MOVE;
const SPLICE_READ = SPLICE_READ;
const FLOCK_LOCKS = FLOCK_LOCKS;
const HAS_IOCTL_DIR = HAS_IOCTL_DIR;
const AUTO_INVAL_DATA = AUTO_INVAL_DATA;
const DO_READDIRPLUS = DO_READDIRPLUS;
const READDIRPLUS_AUTO = READDIRPLUS_AUTO;
const ASYNC_DIO = ASYNC_DIO;
const WRITEBACK_CACHE = WRITEBACK_CACHE;
const ZERO_MESSAGE_OPEN = NO_OPEN_SUPPORT;
const PARALLEL_DIROPS = PARALLEL_DIROPS;
const HANDLE_KILLPRIV = HANDLE_KILLPRIV;
const POSIX_ACL = POSIX_ACL;
const CACHE_SYMLINKS = CACHE_SYMLINKS;
const ZERO_MESSAGE_OPENDIR = NO_OPENDIR_SUPPORT;
const EXPLICIT_INVAL_DATA = EXPLICIT_INVAL_DATA;
const MAP_ALIGNMENT = MAP_ALIGNMENT;
const MAX_PAGES = MAX_PAGES;
const INIT_EXT = INIT_EXT;
const SECURITY_CONTEXT = SECURITY_CONTEXT;
}
}
pub const RELEASE_FLUSH: u32 = 1;
pub const RELEASE_FLOCK_UNLOCK: u32 = 2;
pub const GETATTR_FH: u32 = 1;
pub const LK_FLOCK: u32 = 1;
pub const WRITE_CACHE: u32 = 1;
pub const WRITE_LOCKOWNER: u32 = 2;
pub const WRITE_KILL_PRIV: u32 = 3;
pub const READ_LOCKOWNER: u32 = 2;
const IOCTL_COMPAT: u32 = 1;
const IOCTL_UNRESTRICTED: u32 = 2;
const IOCTL_RETRY: u32 = 4;
const IOCTL_32BIT: u32 = 8;
const IOCTL_DIR: u32 = 16;
const IOCTL_COMPAT_X32: u32 = 32;
pub const IOCTL_MAX_IOV: usize = 256;
bitflags! {
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct IoctlFlags: u32 {
const COMPAT = IOCTL_COMPAT;
const UNRESTRICTED = IOCTL_UNRESTRICTED;
const RETRY = IOCTL_RETRY;
const IOCTL_32BIT = IOCTL_32BIT;
const DIR = IOCTL_DIR;
const COMPAT_X32 = IOCTL_COMPAT_X32;
}
}
pub const POLL_SCHEDULE_NOTIFY: u32 = 1;
pub const FUSE_MIN_READ_BUFFER: u32 = 8192;
pub const FUSE_COMPAT_ENTRY_OUT_SIZE: u32 = 120;
pub const FUSE_COMPAT_ATTR_OUT_SIZE: u32 = 96;
pub const FUSE_COMPAT_MKNOD_IN_SIZE: u32 = 8;
pub const FUSE_COMPAT_WRITE_IN_SIZE: u32 = 24;
pub const FUSE_COMPAT_STATFS_SIZE: u32 = 48;
pub const FUSE_COMPAT_INIT_OUT_SIZE: u32 = 8;
pub const FUSE_COMPAT_22_INIT_OUT_SIZE: u32 = 24;
const SETUPMAPPING_FLAG_WRITE: u64 = 1;
const SETUPMAPPING_FLAG_READ: u64 = 2;
bitflags! {
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct SetUpMappingFlags: u64 {
const WRITE = SETUPMAPPING_FLAG_WRITE;
const READ = SETUPMAPPING_FLAG_READ;
}
}
pub const MAX_NR_SECCTX: u32 = 31;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Attr {
pub ino: u64,
pub size: u64,
pub blocks: u64,
pub atime: u64,
pub mtime: u64,
pub ctime: u64,
pub atimensec: u32,
pub mtimensec: u32,
pub ctimensec: u32,
pub mode: u32,
pub nlink: u32,
pub uid: u32,
pub gid: u32,
pub rdev: u32,
pub blksize: u32,
pub padding: u32,
}
impl From<libc::stat64> for Attr {
fn from(st: libc::stat64) -> Attr {
Attr {
ino: st.st_ino,
size: st.st_size as u64,
blocks: st.st_blocks as u64,
atime: st.st_atime as u64,
mtime: st.st_mtime as u64,
ctime: st.st_ctime as u64,
atimensec: st.st_atime_nsec as u32,
mtimensec: st.st_mtime_nsec as u32,
ctimensec: st.st_ctime_nsec as u32,
mode: st.st_mode,
#[allow(clippy::unnecessary_cast)]
nlink: st.st_nlink as u32,
uid: st.st_uid,
gid: st.st_gid,
rdev: st.st_rdev as u32,
blksize: st.st_blksize as u32,
..Default::default()
}
}
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Kstatfs {
pub blocks: u64,
pub bfree: u64,
pub bavail: u64,
pub files: u64,
pub ffree: u64,
pub bsize: u32,
pub namelen: u32,
pub frsize: u32,
pub padding: u32,
pub spare: [u32; 6],
}
impl From<libc::statvfs64> for Kstatfs {
#[allow(clippy::unnecessary_cast)]
fn from(st: libc::statvfs64) -> Self {
Kstatfs {
blocks: st.f_blocks,
bfree: st.f_bfree,
bavail: st.f_bavail,
files: st.f_files,
ffree: st.f_ffree,
bsize: st.f_bsize as u32,
namelen: st.f_namemax as u32,
frsize: st.f_frsize as u32,
..Default::default()
}
}
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct FileLock {
pub start: u64,
pub end: u64,
pub type_: u32,
pub pid: u32,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, N, IntoBytes, Immutable, KnownLayout, TryFromBytes)]
pub enum Opcode {
Lookup = 1,
Forget = 2,
Getattr = 3,
Setattr = 4,
Readlink = 5,
Symlink = 6,
Mknod = 8,
Mkdir = 9,
Unlink = 10,
Rmdir = 11,
Rename = 12,
Link = 13,
Open = 14,
Read = 15,
Write = 16,
Statfs = 17,
Release = 18,
Fsync = 20,
Setxattr = 21,
Getxattr = 22,
Listxattr = 23,
Removexattr = 24,
Flush = 25,
Init = 26,
Opendir = 27,
Readdir = 28,
Releasedir = 29,
Fsyncdir = 30,
Getlk = 31,
Setlk = 32,
Setlkw = 33,
Access = 34,
Create = 35,
Interrupt = 36,
Bmap = 37,
Destroy = 38,
Ioctl = 39,
Poll = 40,
NotifyReply = 41,
BatchForget = 42,
Fallocate = 43,
Readdirplus = 44,
Rename2 = 45,
Lseek = 46,
CopyFileRange = 47,
SetUpMapping = 48,
RemoveMapping = 49,
OpenAtomic = u32::MAX - 1,
ChromeOsTmpfile = u32::MAX,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, N)]
pub enum NotifyOpcode {
Poll = 1,
InvalInode = 2,
InvalEntry = 3,
Store = 4,
Retrieve = 5,
Delete = 6,
CodeMax = 7,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct EntryOut {
pub nodeid: u64,
pub generation: u64,
pub entry_valid: u64,
pub attr_valid: u64,
pub entry_valid_nsec: u32,
pub attr_valid_nsec: u32,
pub attr: Attr,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct ForgetIn {
pub nlookup: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct ForgetOne {
pub nodeid: u64,
pub nlookup: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct BatchForgetIn {
pub count: u32,
pub dummy: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct GetattrIn {
pub flags: u32,
pub dummy: u32,
pub fh: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct AttrOut {
pub attr_valid: u64,
pub attr_valid_nsec: u32,
pub dummy: u32,
pub attr: Attr,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct MknodIn {
pub mode: u32,
pub rdev: u32,
pub umask: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct MkdirIn {
pub mode: u32,
pub umask: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct ChromeOsTmpfileIn {
pub mode: u32,
pub umask: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct RenameIn {
pub newdir: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Rename2In {
pub newdir: u64,
pub flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct LinkIn {
pub oldnodeid: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct SetattrIn {
pub valid: u32,
pub padding: u32,
pub fh: u64,
pub size: u64,
pub lock_owner: u64,
pub atime: u64,
pub mtime: u64,
pub ctime: u64,
pub atimensec: u32,
pub mtimensec: u32,
pub ctimensec: u32,
pub mode: u32,
pub unused4: u32,
pub uid: u32,
pub gid: u32,
pub unused5: u32,
}
impl From<SetattrIn> for libc::stat64 {
fn from(s: SetattrIn) -> libc::stat64 {
let mut out: libc::stat64 = unsafe { mem::zeroed() };
out.st_mode = s.mode;
out.st_uid = s.uid;
out.st_gid = s.gid;
out.st_size = s.size as i64;
out.st_atime = s.atime as libc::time_t;
out.st_mtime = s.mtime as libc::time_t;
out.st_ctime = s.ctime as libc::time_t;
out.st_atime_nsec = s.atimensec as libc::c_long;
out.st_mtime_nsec = s.mtimensec as libc::c_long;
out.st_ctime_nsec = s.ctimensec as libc::c_long;
out
}
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct OpenIn {
pub flags: u32,
pub unused: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct CreateIn {
pub flags: u32,
pub mode: u32,
pub umask: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct OpenOut {
pub fh: u64,
pub open_flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct ReleaseIn {
pub fh: u64,
pub flags: u32,
pub release_flags: u32,
pub lock_owner: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct FlushIn {
pub fh: u64,
pub unused: u32,
pub padding: u32,
pub lock_owner: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct ReadIn {
pub fh: u64,
pub offset: u64,
pub size: u32,
pub read_flags: u32,
pub lock_owner: u64,
pub flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct WriteIn {
pub fh: u64,
pub offset: u64,
pub size: u32,
pub write_flags: u32,
pub lock_owner: u64,
pub flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct WriteOut {
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct StatfsOut {
pub st: Kstatfs,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct FsyncIn {
pub fh: u64,
pub fsync_flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct SetxattrIn {
pub size: u32,
pub flags: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct GetxattrIn {
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct GetxattrOut {
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct LkIn {
pub fh: u64,
pub owner: u64,
pub lk: FileLock,
pub lk_flags: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct LkOut {
pub lk: FileLock,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct AccessIn {
pub mask: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct InitIn {
pub major: u32,
pub minor: u32,
pub max_readahead: u32,
pub flags: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct InitInExt {
pub flags2: u32,
pub unused: [u32; 11],
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct InitOut {
pub major: u32,
pub minor: u32,
pub max_readahead: u32,
pub flags: u32,
pub max_background: u16,
pub congestion_threshold: u16,
pub max_write: u32,
pub time_gran: u32,
pub max_pages: u16,
pub map_alignment: u16,
pub flags2: u32,
pub unused: [u32; 7],
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct InterruptIn {
pub unique: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct BmapIn {
pub block: u64,
pub blocksize: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct BmapOut {
pub block: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct IoctlIn {
pub fh: u64,
pub flags: u32,
pub cmd: u32,
pub arg: u64,
pub in_size: u32,
pub out_size: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct IoctlIovec {
pub base: u64,
pub len: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct IoctlOut {
pub result: i32,
pub flags: u32,
pub in_iovs: u32,
pub out_iovs: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct PollIn {
pub fh: u64,
pub kh: u64,
pub flags: u32,
pub events: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct PollOut {
pub revents: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyPollWakeupOut {
pub kh: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct FallocateIn {
pub fh: u64,
pub offset: u64,
pub length: u64,
pub mode: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct InHeader {
pub len: u32,
pub opcode: u32,
pub unique: u64,
pub nodeid: u64,
pub uid: u32,
pub gid: u32,
pub pid: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct OutHeader {
pub len: u32,
pub error: i32,
pub unique: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Dirent {
pub ino: u64,
pub off: u64,
pub namelen: u32,
pub type_: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Direntplus {
pub entry_out: EntryOut,
pub dirent: Dirent,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyInvalInodeOut {
pub ino: u64,
pub off: i64,
pub len: i64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyInvalEntryOut {
pub parent: u64,
pub namelen: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyDeleteOut {
pub parent: u64,
pub child: u64,
pub namelen: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyStoreOut {
pub nodeid: u64,
pub offset: u64,
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Notify_Retrieve_Out {
pub notify_unique: u64,
pub nodeid: u64,
pub offset: u64,
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct NotifyRetrieveIn {
pub dummy1: u64,
pub offset: u64,
pub size: u32,
pub dummy2: u32,
pub dummy3: u64,
pub dummy4: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct LseekIn {
pub fh: u64,
pub offset: u64,
pub whence: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct LseekOut {
pub offset: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct CopyFileRangeIn {
pub fh_src: u64,
pub off_src: u64,
pub nodeid_dst: u64,
pub fh_dst: u64,
pub off_dst: u64,
pub len: u64,
pub flags: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct SetUpMappingIn {
pub fh: u64,
pub foffset: u64,
pub len: u64,
pub flags: u64,
pub moffset: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct RemoveMappingIn {
pub count: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct RemoveMappingOne {
pub moffset: u64,
pub len: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct Secctx {
pub size: u32,
pub padding: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, FromBytes, Immutable, IntoBytes, KnownLayout)]
pub struct SecctxHeader {
pub size: u32,
pub nr_secctx: u32,
}