#![no_std]
extern crate libc;
pub mod tcplistener;
pub mod tcpstream;
use libc::c_void;
extern "Rust" {
fn sys_secure_rand64() -> Option<u64>;
fn sys_secure_rand32() -> Option<u32>;
}
extern "C" {
fn sys_rand() -> u32;
fn sys_srand(seed: u32);
fn sys_get_processor_count() -> usize;
fn sys_malloc(size: usize, align: usize) -> *mut u8;
fn sys_realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8;
fn sys_free(ptr: *mut u8, size: usize, align: usize);
fn sys_init_queue(ptr: usize) -> i32;
fn sys_notify(id: usize, count: i32) -> i32;
fn sys_add_queue(id: usize, timeout_ns: i64) -> i32;
fn sys_wait(id: usize) -> i32;
fn sys_destroy_queue(id: usize) -> i32;
fn sys_read(fd: i32, buf: *mut u8, len: usize) -> isize;
fn sys_write(fd: i32, buf: *const u8, len: usize) -> isize;
fn sys_close(fd: i32) -> i32;
fn sys_sem_init(sem: *mut *const c_void, value: u32) -> i32;
fn sys_sem_destroy(sem: *const c_void) -> i32;
fn sys_sem_post(sem: *const c_void) -> i32;
fn sys_sem_trywait(sem: *const c_void) -> i32;
fn sys_sem_timedwait(sem: *const c_void, ms: u32) -> i32;
fn sys_recmutex_init(recmutex: *mut *const c_void) -> i32;
fn sys_recmutex_destroy(recmutex: *const c_void) -> i32;
fn sys_recmutex_lock(recmutex: *const c_void) -> i32;
fn sys_recmutex_unlock(recmutex: *const c_void) -> i32;
fn sys_getpid() -> u32;
fn sys_exit(arg: i32) -> !;
fn sys_abort() -> !;
fn sys_usleep(usecs: u64);
fn sys_spawn(
id: *mut Tid,
func: extern "C" fn(usize),
arg: usize,
prio: u8,
core_id: isize,
) -> i32;
fn sys_spawn2(
func: extern "C" fn(usize),
arg: usize,
prio: u8,
stack_size: usize,
core_id: isize,
) -> Tid;
fn sys_join(id: Tid) -> i32;
fn sys_yield();
fn sys_clock_gettime(clock_id: u64, tp: *mut timespec) -> i32;
fn sys_open(name: *const i8, flags: i32, mode: i32) -> i32;
fn sys_unlink(name: *const i8) -> i32;
fn sys_network_init() -> i32;
fn sys_block_current_task();
fn sys_wakeup_task(tid: Tid);
fn sys_get_priority() -> u8;
}
pub type Tid = u32;
pub const NO_PRIORITIES: usize = 31;
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]
pub struct Priority(u8);
impl Priority {
pub const fn into(self) -> u8 {
self.0
}
pub const fn from(x: u8) -> Self {
Priority(x)
}
}
pub const HIGH_PRIO: Priority = Priority::from(3);
pub const NORMAL_PRIO: Priority = Priority::from(2);
pub const LOW_PRIO: Priority = Priority::from(1);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
pub struct Handle(usize);
pub const NSEC_PER_SEC: u64 = 1_000_000_000;
pub const CLOCK_REALTIME: u64 = 1;
pub const CLOCK_MONOTONIC: u64 = 4;
pub const STDIN_FILENO: libc::c_int = 0;
pub const STDOUT_FILENO: libc::c_int = 1;
pub const STDERR_FILENO: libc::c_int = 2;
pub const O_RDONLY: i32 = 0o0;
pub const O_WRONLY: i32 = 0o1;
pub const O_RDWR: i32 = 0o2;
pub const O_CREAT: i32 = 0o100;
pub const O_EXCL: i32 = 0o200;
pub const O_TRUNC: i32 = 0o1000;
pub const O_APPEND: i32 = 0o2000;
pub fn isatty(_fd: libc::c_int) -> bool {
false
}
pub fn network_init() -> i32 {
unsafe { sys_network_init() }
}
#[derive(Copy, Clone, Debug)]
#[repr(C)]
pub struct timespec {
pub tv_sec: i64,
pub tv_nsec: i64,
}
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub enum Version {
Unspecified,
Ipv4,
Ipv6,
}
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)]
pub struct Ipv4Address(pub [u8; 4]);
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)]
pub struct Ipv6Address(pub [u8; 16]);
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub enum IpAddress {
Unspecified,
Ipv4(Ipv4Address),
Ipv6(Ipv6Address),
}
#[inline(always)]
pub unsafe fn get_processor_count() -> usize {
sys_get_processor_count()
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn malloc(size: usize, align: usize) -> *mut u8 {
sys_malloc(size, align)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8 {
sys_realloc(ptr, size, align, new_size)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn free(ptr: *mut u8, size: usize, align: usize) {
sys_free(ptr, size, align)
}
#[inline(always)]
pub unsafe fn notify(id: usize, count: i32) -> i32 {
sys_notify(id, count)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn add_queue(id: usize, timeout_ns: i64) -> i32 {
sys_add_queue(id, timeout_ns)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn wait(id: usize) -> i32 {
sys_wait(id)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn init_queue(id: usize) -> i32 {
sys_init_queue(id)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn destroy_queue(id: usize) -> i32 {
sys_destroy_queue(id)
}
#[inline(always)]
pub unsafe fn read(fd: i32, buf: *mut u8, len: usize) -> isize {
sys_read(fd, buf, len)
}
#[inline(always)]
pub unsafe fn write(fd: i32, buf: *const u8, len: usize) -> isize {
sys_write(fd, buf, len)
}
#[inline(always)]
pub unsafe fn close(fd: i32) -> i32 {
sys_close(fd)
}
#[inline(always)]
pub unsafe fn sem_init(sem: *mut *const c_void, value: u32) -> i32 {
sys_sem_init(sem, value)
}
#[inline(always)]
pub unsafe fn sem_destroy(sem: *const c_void) -> i32 {
sys_sem_destroy(sem)
}
#[inline(always)]
pub unsafe fn sem_post(sem: *const c_void) -> i32 {
sys_sem_post(sem)
}
#[inline(always)]
pub unsafe fn sem_trywait(sem: *const c_void) -> i32 {
sys_sem_trywait(sem)
}
#[inline(always)]
pub unsafe fn sem_timedwait(sem: *const c_void, ms: u32) -> i32 {
sys_sem_timedwait(sem, ms)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn recmutex_init(recmutex: *mut *const c_void) -> i32 {
sys_recmutex_init(recmutex)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn recmutex_destroy(recmutex: *const c_void) -> i32 {
sys_recmutex_destroy(recmutex)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn recmutex_lock(recmutex: *const c_void) -> i32 {
sys_recmutex_lock(recmutex)
}
#[doc(hidden)]
#[inline(always)]
pub unsafe fn recmutex_unlock(recmutex: *const c_void) -> i32 {
sys_recmutex_unlock(recmutex)
}
#[inline(always)]
pub unsafe fn getpid() -> u32 {
sys_getpid()
}
#[inline(always)]
pub unsafe fn exit(arg: i32) -> ! {
sys_exit(arg)
}
#[inline(always)]
pub unsafe fn abort() -> ! {
sys_abort()
}
#[inline(always)]
pub unsafe fn usleep(usecs: u64) {
sys_usleep(usecs)
}
#[inline(always)]
pub unsafe fn spawn(
id: *mut Tid,
func: extern "C" fn(usize),
arg: usize,
prio: u8,
core_id: isize,
) -> i32 {
sys_spawn(id, func, arg, prio, core_id)
}
#[inline(always)]
pub unsafe fn spawn2(
func: extern "C" fn(usize),
arg: usize,
prio: u8,
stack_size: usize,
core_id: isize,
) -> Tid {
sys_spawn2(func, arg, prio, stack_size, core_id)
}
#[inline(always)]
pub unsafe fn join(id: Tid) -> i32 {
sys_join(id)
}
#[inline(always)]
pub unsafe fn yield_now() {
sys_yield()
}
#[inline(always)]
pub unsafe fn clock_gettime(clock_id: u64, tp: *mut timespec) -> i32 {
sys_clock_gettime(clock_id, tp)
}
#[inline(always)]
pub unsafe fn open(name: *const i8, flags: i32, mode: i32) -> i32 {
sys_open(name, flags, mode)
}
#[inline(always)]
pub unsafe fn unlink(name: *const i8) -> i32 {
sys_unlink(name)
}
pub const RAND_MAX: u64 = 2_147_483_647;
#[inline(always)]
pub unsafe fn rand() -> u32 {
sys_rand()
}
#[inline(always)]
pub unsafe fn srand(seed: u32) {
sys_srand(seed);
}
#[inline(always)]
pub unsafe fn secure_rand32() -> Option<u32> {
sys_secure_rand32()
}
#[inline(always)]
pub unsafe fn secure_rand64() -> Option<u64> {
sys_secure_rand64()
}
#[inline(always)]
pub unsafe fn block_current_task() {
sys_block_current_task();
}
#[inline(always)]
pub unsafe fn wakeup_task(tid: Tid) {
sys_wakeup_task(tid);
}
#[inline(always)]
pub unsafe fn get_priority() -> Priority {
Priority::from(sys_get_priority())
}