1use file_system::{Kind, Position};
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 = file_system::Mode::READ_BIT;
64#[unsafe(no_mangle)]
65pub static XILA_FILE_SYSTEM_MODE_WRITE_MASK: u8 = file_system::Mode::WRITE_BIT;
66
67pub type XilaFileSystemOpen = u8;
68
69#[unsafe(no_mangle)]
70pub static XILA_FILE_SYSTEM_OPEN_CREATE_MASK: u8 = file_system::Open::CREATE_MASK;
71#[unsafe(no_mangle)]
72pub static XILA_FILE_SYSTEM_OPEN_CREATE_ONLY_MASK: u8 = file_system::Open::EXCLUSIVE_MASK;
73#[unsafe(no_mangle)]
74pub static XILA_FILE_SYSTEM_OPEN_TRUNCATE_MASK: u8 = file_system::Open::TRUNCATE_MASK;
75
76pub type XilaFileSystemStatus = u8;
77
78#[unsafe(no_mangle)]
79pub static XILA_FILE_SYSTEM_STATUS_APPEND_MASK: u8 = file_system::Status::APPEND_BIT;
80#[unsafe(no_mangle)]
81pub static XILA_FILE_SYSTEM_STATUS_NON_BLOCKING_MASK: u8 = file_system::Status::NON_BLOCKING_BIT;
82#[unsafe(no_mangle)]
83pub static XILA_FILE_SYSTEM_STATUS_SYNCHRONOUS_MASK: u8 = file_system::Status::SYNCHRONOUS_BIT;
84#[unsafe(no_mangle)]
85pub static XILA_FILE_SYSTEM_STATUS_SYNCHRONOUS_DATA_ONLY_MASK: u8 =
86 file_system::Status::SYNCHRONOUS_DATA_ONLY_BIT;
87
88pub type XilaFileSystemInode = u64;
89
90type XilaFileSystemIdentifier = u32;
91
92type Permissions = u16;
93
94#[repr(C)]
95pub struct XilaFileSystemStatistics {
96 file_system: XilaFileSystemIdentifier,
97 inode: XilaFileSystemInode,
98 links: u64,
99 size: XilaFileSystemSize,
100 last_access: XilaTime,
101 last_modification: XilaTime,
102 last_status_change: XilaTime,
103 r#type: XilaFileKind,
104 permissions: Permissions,
105 user: XilaUserIdentifier,
106 group: XilaGroupIdentifier,
107}
108
109impl XilaFileSystemStatistics {
110 pub fn from_statistics(statistics: file_system::Statistics_type) -> Self {
111 Self {
112 file_system: statistics.get_file_system().as_inner(),
113 inode: statistics.get_inode().as_u64(),
114 links: statistics.get_links(),
115 size: statistics.get_size().as_u64(),
116 last_access: statistics.get_last_access().as_u64(),
117 last_modification: statistics.get_last_modification().as_u64(),
118 last_status_change: statistics.get_last_status_change().as_u64(),
119 r#type: statistics.get_type().into(),
120 permissions: statistics.get_permissions().as_u16(),
121 user: statistics.get_user().as_u16(),
122 group: statistics.get_group().as_u16(),
123 }
124 }
125
126 pub fn from_mutable_pointer(
127 pointer: *mut XilaFileSystemStatistics,
128 ) -> Option<*mut XilaFileSystemStatistics> {
129 if pointer.is_null() {
130 return None;
131 }
132
133 if !(pointer as usize).is_multiple_of(align_of::<XilaFileSystemStatistics>()) {
134 return None;
135 }
136
137 Some(pointer)
138 }
139}
140
141pub type XilaUniqueFileIdentifier = usize;
142pub type XilaFileSystemSize = u64;
143
144pub type XilaFileSystemResult = u32;