abi/file_system/
socket.rs

1use super::{XilaFileSystemResult, XilaUniqueFileIdentifier, into_u32};
2use futures::block_on;
3use task::get_instance as get_task_manager_instance;
4use virtual_file_system::{Error, get_instance as get_file_system_instance};
5
6/// This function is used to send data through a socket.
7///
8/// # Safety
9///
10/// This function is unsafe because it dereferences raw pointers.
11#[unsafe(no_mangle)]
12pub unsafe extern "C" fn xila_file_system_send(
13    socket: XilaUniqueFileIdentifier,
14    buffer: *const u8,
15    size: usize,
16) -> XilaFileSystemResult {
17    unsafe {
18        into_u32(|| {
19            let task = block_on(get_task_manager_instance().get_current_task_identifier());
20
21            let socket = file_system::UniqueFileIdentifier::from_raw(socket);
22
23            if buffer.is_null() {
24                Err(Error::InvalidParameter)?;
25            }
26
27            let buffer = core::slice::from_raw_parts(buffer, size);
28
29            block_on(get_file_system_instance().send(task, socket, buffer))?;
30
31            Ok(())
32        })
33    }
34}
35
36/// This function is used to receive data through a socket.
37///
38/// # Safety
39///
40/// This function is unsafe because it dereferences raw pointers.
41///
42/// # Errors
43///
44/// This function may return an error if the file system fails to receive the data.
45#[unsafe(no_mangle)]
46pub unsafe extern "C" fn xila_file_system_receive(
47    socket: XilaUniqueFileIdentifier,
48    buffer: *mut u8,
49    size: usize,
50) -> XilaFileSystemResult {
51    unsafe {
52        into_u32(|| {
53            let task = block_on(get_task_manager_instance().get_current_task_identifier());
54
55            let socket = file_system::UniqueFileIdentifier::from_raw(socket);
56
57            if buffer.is_null() {
58                Err(Error::InvalidParameter)?;
59            }
60
61            let buffer = core::slice::from_raw_parts_mut(buffer, size);
62
63            block_on(get_file_system_instance().receive(task, socket, buffer))?;
64
65            Ok(())
66        })
67    }
68}