blob: 32f95df6ad08216786451552632420bb74ab89f6 [file] [log] [blame] [edit]
#![allow(unsafe_op_in_unsafe_fn)]
pub mod os;
pub mod pipe;
pub mod time;
pub use moto_rt::futex;
use crate::io as std_io;
use crate::sys::RawOsError;
pub(crate) fn map_motor_error(err: moto_rt::ErrorCode) -> crate::io::Error {
crate::io::Error::from_raw_os_error(err.into())
}
#[cfg(not(test))]
#[unsafe(no_mangle)]
pub extern "C" fn motor_start() -> ! {
// Initialize the runtime.
moto_rt::start();
// Call main.
unsafe extern "C" {
fn main(_: isize, _: *const *const u8, _: u8) -> i32;
}
let result = unsafe { main(0, core::ptr::null(), 0) };
// Terminate the process.
moto_rt::process::exit(result)
}
// SAFETY: must be called only once during runtime initialization.
// NOTE: Motor OS uses moto_rt::start() to initialize runtime (see above).
pub unsafe fn init(_argc: isize, _argv: *const *const u8, _sigpipe: u8) {}
// SAFETY: must be called only once during runtime cleanup.
// NOTE: this is not guaranteed to run, for example when the program aborts.
pub unsafe fn cleanup() {}
pub fn unsupported<T>() -> std_io::Result<T> {
Err(unsupported_err())
}
pub fn unsupported_err() -> std_io::Error {
std_io::Error::UNSUPPORTED_PLATFORM
}
pub fn is_interrupted(_code: RawOsError) -> bool {
false // Motor OS doesn't have signals.
}
pub fn decode_error_kind(code: RawOsError) -> crate::io::ErrorKind {
use moto_rt::error::*;
use std_io::ErrorKind;
if code < 0 || code > u16::MAX.into() {
return std_io::ErrorKind::Uncategorized;
}
match code as moto_rt::ErrorCode /* u16 */ {
E_UNSPECIFIED => ErrorKind::Uncategorized,
E_UNKNOWN => ErrorKind::Uncategorized,
E_NOT_READY => ErrorKind::WouldBlock,
E_NOT_IMPLEMENTED => ErrorKind::Unsupported,
E_VERSION_TOO_HIGH => ErrorKind::Unsupported,
E_VERSION_TOO_LOW => ErrorKind::Unsupported,
E_INVALID_ARGUMENT => ErrorKind::InvalidInput,
E_OUT_OF_MEMORY => ErrorKind::OutOfMemory,
E_NOT_ALLOWED => ErrorKind::PermissionDenied,
E_NOT_FOUND => ErrorKind::NotFound,
E_INTERNAL_ERROR => ErrorKind::Other,
E_TIMED_OUT => ErrorKind::TimedOut,
E_ALREADY_IN_USE => ErrorKind::AlreadyExists,
E_UNEXPECTED_EOF => ErrorKind::UnexpectedEof,
E_INVALID_FILENAME => ErrorKind::InvalidFilename,
E_NOT_A_DIRECTORY => ErrorKind::NotADirectory,
E_BAD_HANDLE => ErrorKind::InvalidInput,
E_FILE_TOO_LARGE => ErrorKind::FileTooLarge,
E_NOT_CONNECTED => ErrorKind::NotConnected,
E_STORAGE_FULL => ErrorKind::StorageFull,
E_INVALID_DATA => ErrorKind::InvalidData,
_ => crate::io::ErrorKind::Uncategorized,
}
}
pub fn abort_internal() -> ! {
core::intrinsics::abort();
}