Work on adding a puppet for the server side aswell

This commit is contained in:
Michael Mikovsky
2025-08-24 10:59:46 -06:00
parent 5f38d85e6c
commit 319c0fc222
13 changed files with 255 additions and 19 deletions
+1
View File
@@ -9,6 +9,7 @@ bincode = "2.0.1"
# kernel = "6.17"
# kernel = "1.0.0"
libc = "0.2.175"
log = "0.4.27"
nix = "0.30.1"
syscaller = "0.2.2"
-1
View File
@@ -6,7 +6,6 @@ const CONFIG: bincode::config::Configuration = bincode::config::standard();
use std::{
collections::HashMap,
fmt::Debug,
marker::PhantomData,
sync::{Arc, Mutex},
};
+13 -4
View File
@@ -1,4 +1,5 @@
use bincode::{Decode, Encode};
use log::error;
use crate::{types, types::*};
@@ -12,11 +13,19 @@ impl Syscall {
}
pub fn decode(bytes: &[u8]) -> Option<Self> {
if let Ok((decoded, _)) = bincode::decode_from_slice(&bytes[..], crate::CONFIG) {
Some(decoded)
} else {
None
match bincode::decode_from_slice(&bytes[..], crate::CONFIG) {
Ok((decoded, _)) => Some(decoded),
Err(e) => {
error!("Decoding error: {}", e);
None
}
}
// if let Ok((decoded, _)) = bincode::decode_from_slice(&bytes[..], crate::CONFIG) {
// Some(decoded)
// } else {
// None
// }
}
}
+62 -5
View File
@@ -1,7 +1,12 @@
use std::ffi::CStr;
use std::fmt::Debug;
use std::ptr;
use std::{ffi::CStr, mem::transmute};
use bincode::{Decode, Encode};
use bincode::de::read::Reader;
use bincode::enc::write::Writer;
use bincode::error::DecodeError;
use bincode::{BorrowDecode, Decode, Encode};
use log::trace;
use crate::{AsPtr, types::MAX_STR_LEN};
@@ -15,12 +20,11 @@ fn trunc(str: &str) -> String {
out_str
}
#[derive(Encode, Decode)]
pub struct StrRef(pub libc::c_ulong);
pub struct StrRef(pub *const libc::c_char);
impl StrRef {
pub fn new(ptr: libc::c_ulong) -> Self {
Self(ptr)
Self(ptr as *const libc::c_char)
}
pub fn read(&self) -> String {
let ptr = self.0 as *const libc::c_char;
@@ -43,3 +47,56 @@ impl AsPtr for StrRef {
self.0 as libc::c_ulong
}
}
impl<'de> Encode for StrRef {
fn encode<E: bincode::enc::Encoder>(
&self,
encoder: &mut E,
) -> Result<(), bincode::error::EncodeError> {
let data = unsafe { CStr::from_ptr(self.0 as *const libc::c_char) };
let data = data.to_bytes_with_nul();
// println!("len: {}, data: {:?}", data.len(), data);
encoder.writer().write(&data.len().to_be_bytes())?;
data.encode(encoder)?;
Ok(())
}
}
impl<'de, Context> Decode<Context> for StrRef {
fn decode<D: bincode::de::Decoder<Context = Context>>(
decoder: &mut D,
) -> Result<Self, bincode::error::DecodeError> {
let mut len = [0u8; 8];
decoder.reader().read(&mut len)?;
let len = usize::from_be_bytes(len) + 1;
let data = &decoder.reader().peek_read(len).unwrap()[1..];
// [0u8; 32];
// decoder.reader().read(&mut data)?;
// trace!("len: {}, data: {:?}", len, data);
let data = CStr::from_bytes_with_nul(&data).unwrap();
let ptr = data.as_ptr();
Ok(StrRef(ptr))
}
}
impl<'de, Context> BorrowDecode<'de, Context> for StrRef {
fn borrow_decode<D: bincode::de::BorrowDecoder<'de, Context = Context>>(
decoder: &mut D,
) -> Result<Self, bincode::error::DecodeError> {
let mut len = [0u8; 8];
decoder.reader().read(&mut len)?;
let len = usize::from_be_bytes(len) + 1;
let data = &decoder.reader().peek_read(len).unwrap()[1..];
let data = CStr::from_bytes_with_nul(&data).unwrap();
let ptr = data.as_ptr();
Ok(StrRef(ptr))
}
}