mod rkyv_enum;
pub use rkyv_enum::*;
#[allow(dead_code)]
pub const AUTHENTICATE_TIMEOUT: u32 = 10_000;
#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive)]
#[repr(C)]
pub enum Opcode {
Register = 0,
Lookup = 1,
AuthenticatedLookup = 2,
Unregister = 3,
Disconnect = 4,
TrustedInitDone = 5,
BlockingConnect = 6,
TryConnect = 7,
}
#[derive(Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
pub struct Registration {
pub name: String,
pub conn_limit: Option<u32>,
}
#[derive(Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
pub struct Disconnect {
pub name: String,
pub token: [u32; 4],
}
#[derive(Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
pub struct AuthenticatedLookup {
pub name: String,
pub pubkey_id: [u8; 20], pub response: [u32; 8],
}
#[derive(Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[repr(C)]
pub struct AuthenticateRequest {
pub name: String, pub pubkey_id: [u8; 20], pub challenge: [u32; 4],
}
#[derive(Debug, Copy, Clone)]
pub struct XousServerName {
value: [u8; 64],
length: usize,
}
impl Default for XousServerName {
fn default() -> Self { XousServerName { value: [0u8; 64], length: 0 } }
}
#[allow(dead_code)]
impl XousServerName {
pub fn to_str(&self) -> &str {
core::str::from_utf8(unsafe {
core::slice::from_raw_parts(self.value.as_ptr(), self.length as usize)
})
.unwrap()
}
pub fn new() -> XousServerName { XousServerName { value: [0; 64], length: 0 } }
pub fn from_str(src: &str) -> XousServerName {
let mut s = Self::new();
for (&src_byte, dest_byte) in src.as_bytes().iter().zip(&mut s.value) {
*dest_byte = src_byte;
}
s.length = s.value.len().min(src.as_bytes().len());
if s.as_str().is_err() {
s.length = 0;
}
assert!(s.length < s.value.len(), "incorrect length derivation!");
s
}
pub fn as_bytes(&self) -> [u8; 64] { self.value }
pub fn as_str(&self) -> core::result::Result<&str, core::str::Utf8Error> {
core::str::from_utf8(&self.value[0..self.length as usize])
}
pub fn len(&self) -> usize { self.length as usize }
pub fn is_empty(&self) -> bool { self.length == 0 }
pub fn clear(&mut self) {
self.length = 0;
self.value = [0; 64];
}
}
impl core::fmt::Write for XousServerName {
fn write_str(&mut self, s: &str) -> core::result::Result<(), core::fmt::Error> {
self.length = 0;
let b = s.bytes();
if b.len() > self.value.len() {
Err(core::fmt::Error)?;
}
self.length = b.len();
assert!(self.length < self.value.len(), "incorrect length derivation!");
for (dest, src) in self.value.iter_mut().zip(s.bytes()) {
*dest = src;
}
core::str::from_utf8(unsafe {
core::slice::from_raw_parts(self.value.as_ptr(), self.length as usize)
})
.map_err(|_| core::fmt::Error)?;
Ok(())
}
}
impl std::hash::Hash for XousServerName {
fn hash<H>(&self, state: &mut H)
where
H: std::hash::Hasher,
{
assert!(self.length < self.value.len(), "incorret length on hash!");
std::hash::Hash::hash(&self.value[..self.length as usize], state);
std::hash::Hash::hash(&self.length, state)
}
}
impl PartialEq for XousServerName {
fn eq(&self, other: &Self) -> bool {
assert!(self.length < self.value.len(), "incorret length on Eq!");
assert!(other.length < other.value.len(), "incorrect length on Eq (other)!");
self.value[..self.length as usize] == other.value[..other.length as usize]
&& self.length == other.length
}
}
impl Eq for XousServerName {}
impl core::fmt::Display for XousServerName {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{}", self.to_str()) }
}