about summary refs log tree commit diff
path: root/smalldog
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2025-04-02 06:15:57 -0500
committergennyble <gen@nyble.dev>2025-04-02 06:15:57 -0500
commit315f3268525dc05c587ab4b28772b73cb18e66ef (patch)
treefa17b45a4827fa3544fa134670590c79cdaea12c /smalldog
parent23f494f065be5eaec37aab6ca6e72348c6a025e0 (diff)
downloadcorgi-315f3268525dc05c587ab4b28772b73cb18e66ef.tar.gz
corgi-315f3268525dc05c587ab4b28772b73cb18e66ef.zip
improve ffi
Diffstat (limited to 'smalldog')
-rw-r--r--smalldog/src/lib.rs53
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(),
 		});