abi_definitions/file_system/
types.rs

1use 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    /// # Safety
128    ///
129    /// This function is unsafe because it dereferences a raw pointer.
130    /// The caller must ensure that the pointer is valid and properly aligned.
131    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;