abi/file_system/
types.rs

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;