#![allow(clippy::missing_safety_doc)]
use crate::c;
use corevm_types::{flags::RecvMessage, RecvHostMessageOutcome};
#[cfg(feature = "alloc")]
pub fn try_recv_host_message() -> Option<alloc::vec::Vec<u8>> {
let outcome = unsafe { c::recv_host_message(0, 0, RecvMessage::NON_BLOCKING.bits()) };
let len = RecvHostMessageOutcome::from_reg(outcome).into_inner()?;
let mut buf = alloc::vec::Vec::with_capacity(len as usize);
unsafe {
c::recv_host_message(
buf.as_mut_ptr() as u64,
u64::from(len),
RecvMessage::NON_BLOCKING.bits(),
)
};
unsafe { buf.set_len(len as usize) };
Some(buf)
}
#[inline]
pub fn try_recv_host_message_into(buf: &mut [u8]) -> Option<Result<usize, usize>> {
let outcome = unsafe {
c::recv_host_message(
buf.as_mut_ptr() as u64,
buf.len() as u64,
RecvMessage::NON_BLOCKING.bits(),
)
};
let len = RecvHostMessageOutcome::from_reg(outcome).into_inner()?;
if u64::from(len) > buf.len() as u64 {
return Some(Err(len as usize));
}
Some(Ok(len as usize))
}
#[inline]
pub fn try_recv_bounded_host_message_into(buf: &mut [u8]) -> Option<usize> {
let outcome = unsafe {
c::recv_host_message(
buf.as_mut_ptr() as u64,
buf.len() as u64,
RecvMessage::DISCARD.bits() | RecvMessage::NON_BLOCKING.bits(),
)
};
let len = RecvHostMessageOutcome::from_reg(outcome).into_inner()?;
Some(len as usize)
}
#[cfg(feature = "alloc")]
pub fn recv_host_message() -> alloc::vec::Vec<u8> {
let outcome = unsafe { c::recv_host_message(0, 0, 0) };
let len = RecvHostMessageOutcome::from_reg(outcome)
.into_inner()
.expect("The call is blocking");
let mut buf = alloc::vec::Vec::with_capacity(len as usize);
unsafe { c::recv_host_message(buf.as_mut_ptr() as u64, u64::from(len), 0) };
unsafe { buf.set_len(len as usize) };
buf
}
#[inline]
pub fn recv_host_message_into(buf: &mut [u8]) -> Result<usize, usize> {
let outcome = unsafe { c::recv_host_message(buf.as_mut_ptr() as u64, buf.len() as u64, 0) };
let len = RecvHostMessageOutcome::from_reg(outcome)
.into_inner()
.expect("The call is blocking");
if u64::from(len) > buf.len() as u64 {
return Err(len as usize);
}
Ok(len as usize)
}
#[inline]
pub fn recv_bounded_host_message_into(buf: &mut [u8]) -> Option<usize> {
let outcome = unsafe {
c::recv_host_message(buf.as_mut_ptr() as u64, buf.len() as u64, RecvMessage::DISCARD.bits())
};
let len = RecvHostMessageOutcome::from_reg(outcome)
.into_inner()
.expect("The call is blocking");
Some(len as usize)
}