use moa_uapi::{
connect::ConnHandle,
error::{
ERR_CHANNEL_CLOSED, ERR_CONNECTION_CLOSED, ERR_CONNECTION_REFUSED, ERR_FAULT, ERR_INVAL,
ERR_NO_RESOURCE, ERR_NOT_FOUND, ERR_QUEUE_FULL, ERR_TIMEOUT,
},
space::SpaceId,
sysnr::{SYSNR_CONNECT, SYSNR_DISCONNECT, SYSNR_SEND_PULSE, SYSNR_SENDV},
types::{IoVec, Timeout},
};
pub type Result<T> = core::result::Result<T, ConnectError>;
define_syscall_error! {
pub enum ConnectError {
NotFound = ERR_NOT_FOUND,
Inval = ERR_INVAL,
NoResource = ERR_NO_RESOURCE,
Fault = ERR_FAULT,
Timeout = ERR_TIMEOUT,
ChannelClosed = ERR_CHANNEL_CLOSED,
ConnectionClosed = ERR_CONNECTION_CLOSED,
ConnectionRefused = ERR_CONNECTION_REFUSED,
QueueFull = ERR_QUEUE_FULL,
}
}
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
pub fn connect(spaceid: SpaceId, channel_index: u32) -> Result<ConnHandle> {
let ret =
unsafe { super::arch::syscall2(SYSNR_CONNECT, spaceid.raw(), channel_index as usize) };
if ret < 0 { Err(ConnectError::from_raw(ret)) } else { Ok(ConnHandle::from_raw(ret as u32)) }
}
pub fn disconnect(conn: ConnHandle) -> Result<()> {
let ret = unsafe { super::arch::syscall1(SYSNR_DISCONNECT, conn.raw() as usize) };
if ret < 0 { Err(ConnectError::from_raw(ret)) } else { Ok(()) }
}
#[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)]
pub fn sendv(
conn: ConnHandle,
send_iov: &[IoVec],
recv_iov: &mut [IoVec],
timeout: Timeout,
) -> Result<u32> {
let ret = unsafe {
super::arch::syscall6(
SYSNR_SENDV,
conn.raw() as usize,
send_iov.as_ptr() as usize,
send_iov.len(),
recv_iov.as_mut_ptr() as usize,
recv_iov.len(),
timeout.raw() as usize,
)
};
if ret < 0 { Err(ConnectError::from_raw(ret)) } else { Ok(ret as u32) }
}
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
pub fn send_pulse(conn: ConnHandle, code: isize, value: usize) -> Result<()> {
let ret = unsafe {
super::arch::syscall3(SYSNR_SEND_PULSE, conn.raw() as usize, code as usize, value)
};
if ret < 0 { Err(ConnectError::from_raw(ret)) } else { Ok(()) }
}