mirror of
https://github.com/Astatin3/syscall-stream-rs.git
synced 2026-06-09 00:18:01 -06:00
Work on adding a puppet for the server side aswell
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ const CONFIG: bincode::config::Configuration = bincode::config::standard();
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
fmt::Debug,
|
||||
marker::PhantomData,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user