abi_definitions/file_system/
types.rs1use file_system::{AccessFlags, CreateFlags, Kind, Position, StateFlags};
2
3use crate::{XilaGroupIdentifier, XilaTime, XilaUserIdentifier};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6#[repr(u8)]
7pub enum XilaFileSystemWhence {
8 Start,
9 Current,
10 End,
11}
12
13pub const fn into_position(whence: XilaFileSystemWhence, offset: i64) -> Position {
14 match whence {
15 XilaFileSystemWhence::Start => Position::Start(offset as u64),
16 XilaFileSystemWhence::Current => Position::Current(offset),
17 XilaFileSystemWhence::End => Position::End(offset),
18 }
19}
20
21#[repr(u8)]
22pub enum XilaFileKind {
23 File,
24 Directory,
25 BlockDevice,
26 CharacterDevice,
27 Pipe,
28 Socket,
29 SymbolicLink,
30}
31
32impl From<XilaFileKind> for file_system::Kind {
33 fn from(type_value: XilaFileKind) -> Self {
34 match type_value {
35 XilaFileKind::File => Kind::File,
36 XilaFileKind::Directory => file_system::Kind::Directory,
37 XilaFileKind::BlockDevice => file_system::Kind::BlockDevice,
38 XilaFileKind::CharacterDevice => file_system::Kind::CharacterDevice,
39 XilaFileKind::Pipe => file_system::Kind::Pipe,
40 XilaFileKind::Socket => file_system::Kind::Socket,
41 XilaFileKind::SymbolicLink => file_system::Kind::SymbolicLink,
42 }
43 }
44}
45
46impl From<file_system::Kind> for XilaFileKind {
47 fn from(type_value: file_system::Kind) -> Self {
48 match type_value {
49 file_system::Kind::File => XilaFileKind::File,
50 file_system::Kind::Directory => XilaFileKind::Directory,
51 file_system::Kind::BlockDevice => XilaFileKind::BlockDevice,
52 file_system::Kind::CharacterDevice => XilaFileKind::CharacterDevice,
53 file_system::Kind::Pipe => XilaFileKind::Pipe,
54 file_system::Kind::Socket => XilaFileKind::Socket,
55 file_system::Kind::SymbolicLink => XilaFileKind::SymbolicLink,
56 }
57 }
58}
59
60pub type XilaFileSystemMode = u8;
61
62#[unsafe(no_mangle)]
63pub static XILA_FILE_SYSTEM_MODE_READ_MASK: u8 = AccessFlags::Read.bits();
64#[unsafe(no_mangle)]
65pub static XILA_FILE_SYSTEM_MODE_WRITE_MASK: u8 = AccessFlags::Write.bits();
66
67pub type XilaFileSystemOpen = u8;
68
69#[unsafe(no_mangle)]
70pub static XILA_FILE_SYSTEM_OPEN_CREATE_MASK: u8 = CreateFlags::Create.bits();
71#[unsafe(no_mangle)]
72pub static XILA_FILE_SYSTEM_OPEN_CREATE_ONLY_MASK: u8 = CreateFlags::Exclusive.bits();
73#[unsafe(no_mangle)]
74pub static XILA_FILE_SYSTEM_OPEN_TRUNCATE_MASK: u8 = CreateFlags::Truncate.bits();
75pub type XilaFileSystemStatus = u8;
76
77#[unsafe(no_mangle)]
78pub static XILA_FILE_SYSTEM_STATUS_APPEND_MASK: u8 = StateFlags::Append.bits();
79#[unsafe(no_mangle)]
80pub static XILA_FILE_SYSTEM_STATUS_NON_BLOCKING_MASK: u8 = StateFlags::NonBlocking.bits();
81#[unsafe(no_mangle)]
82pub static XILA_FILE_SYSTEM_STATUS_SYNCHRONOUS_MASK: u8 = StateFlags::Synchronous.bits();
83#[unsafe(no_mangle)]
84pub static XILA_FILE_SYSTEM_STATUS_SYNCHRONOUS_DATA_ONLY_MASK: u8 =
85 StateFlags::SynchronousDataOnly.bits();
86
87pub type XilaFileSystemInode = u64;
88
89type XilaFileSystemIdentifier = u32;
90
91type Permissions = u16;
92
93#[repr(C)]
94pub struct XilaFileSystemStatistics {
95 file_system: XilaFileSystemIdentifier,
96 inode: XilaFileSystemInode,
97 links: u64,
98 size: XilaFileSystemSize,
99 creation: XilaTime,
100 access: XilaTime,
101 modification: XilaTime,
102 status: XilaTime,
103 kind: XilaFileKind,
104 permissions: Permissions,
105 user: XilaUserIdentifier,
106 group: XilaGroupIdentifier,
107}
108
109impl XilaFileSystemStatistics {
110 pub fn from_statistics(statistics: file_system::Statistics) -> Self {
111 Self {
112 file_system: 0,
113 inode: statistics.inode,
114 links: statistics.links,
115 size: statistics.size,
116 creation: statistics.creation.as_u64(),
117 access: statistics.access.as_u64(),
118 modification: statistics.modification.as_u64(),
119 status: statistics.status.as_u64(),
120 kind: statistics.kind.into(),
121 permissions: statistics.permissions.as_u16(),
122 user: statistics.user.as_u16(),
123 group: statistics.user.as_u16(),
124 }
125 }
126
127 pub unsafe fn from_mutable_pointer<'a>(
132 pointer: *mut XilaFileSystemStatistics,
133 ) -> Option<&'a mut XilaFileSystemStatistics> {
134 if pointer.is_null() {
135 return None;
136 }
137
138 if !(pointer as usize).is_multiple_of(align_of::<XilaFileSystemStatistics>()) {
139 return None;
140 }
141
142 Some(unsafe { &mut *pointer })
143 }
144}
145
146pub type XilaFileIdentifier = u16;
147
148pub type XilaFileSystemSize = u64;
149
150pub type XilaFileSystemResult = u32;