diff options
author | gennyble <gen@nyble.dev> | 2025-04-02 06:15:57 -0500 |
---|---|---|
committer | gennyble <gen@nyble.dev> | 2025-04-02 06:15:57 -0500 |
commit | 315f3268525dc05c587ab4b28772b73cb18e66ef (patch) | |
tree | fa17b45a4827fa3544fa134670590c79cdaea12c /smalldog | |
parent | 23f494f065be5eaec37aab6ca6e72348c6a025e0 (diff) | |
download | corgi-315f3268525dc05c587ab4b28772b73cb18e66ef.tar.gz corgi-315f3268525dc05c587ab4b28772b73cb18e66ef.zip |
improve ffi
Diffstat (limited to 'smalldog')
-rw-r--r-- | smalldog/src/lib.rs | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/smalldog/src/lib.rs b/smalldog/src/lib.rs index e139d30..27b0140 100644 --- a/smalldog/src/lib.rs +++ b/smalldog/src/lib.rs @@ -1,12 +1,28 @@ -use core::ffi; use std::{borrow::Cow, ffi::CStr, ptr, sync::Mutex}; -#[repr(C)] -pub struct ModuleRequest<'req> { - pub headers_len: ffi::c_ulong, - pub headers: &'req [[*const ffi::c_char; 2]], - pub body_len: ffi::c_ulong, - pub body: *const u8, +use ffi::{ModuleRequest, ModuleResponse}; + +pub mod ffi { + use core::ffi; + use std::marker::PhantomData; + + #[repr(C)] + pub struct ModuleRequest<'req> { + pub headers_len: ffi::c_ulong, + pub headers: *const [*const ffi::c_char; 2], + pub body_len: ffi::c_ulong, + pub body: *const u8, + pub _phantom: PhantomData<&'req u8>, + } + + #[repr(C)] + pub struct ModuleResponse { + pub status: ffi::c_ushort, + pub headers_len: ffi::c_ulong, + pub headers: *const [*const ffi::c_char; 2], + pub body_len: ffi::c_ulong, + pub body: *const u8, + } } pub struct Request<'req> { @@ -19,11 +35,13 @@ impl<'req> Request<'req> { // SAFTEY: corgi will never give us a null pointer let reqref = unsafe { request.as_ref() }.unwrap(); + let headers_ffi = + unsafe { std::slice::from_raw_parts(reqref.headers, reqref.headers_len as usize) }; + let mut headers = vec![]; - for idx in 0..reqref.headers_len as usize { - let kvarr = reqref.headers[idx as usize]; - let k = unsafe { CStr::from_ptr(kvarr[0]) }.to_string_lossy(); - let v = unsafe { CStr::from_ptr(kvarr[1]) }.to_string_lossy(); + for pair in headers_ffi { + let k = unsafe { CStr::from_ptr(pair[0]) }.to_string_lossy(); + let v = unsafe { CStr::from_ptr(pair[1]) }.to_string_lossy(); headers.push((k, v)); } @@ -55,17 +73,8 @@ impl<'req> Request<'req> { } } -#[repr(C)] -pub struct ModuleResponse { - pub status: ffi::c_ushort, - pub headers_len: ffi::c_ulong, - pub headers: &'static [[*const ffi::c_char; 2]], - pub body_len: ffi::c_ulong, - pub body: *const u8, -} - const HEADERS_LEN: usize = 64; -static mut HEADERS: [[*const ffi::c_char; 2]; HEADERS_LEN] = [[ptr::null(), ptr::null()]; 64]; +static mut HEADERS: [[*const core::ffi::c_char; 2]; HEADERS_LEN] = [[ptr::null(), ptr::null()]; 64]; static RESPONSE: Mutex<Option<Response>> = Mutex::new(None); pub struct Response { @@ -98,7 +107,7 @@ impl Response { let boxed = Box::new(ModuleResponse { status, headers_len, - headers: unsafe { &HEADERS[..headers_len as usize] }, + headers: unsafe { HEADERS[..headers_len as usize].as_ptr() }, body_len: this.body.len() as u64, body: this.body.as_ptr(), }); |