diff options
Diffstat (limited to 'src/rust/unit-wasm-sys/rusty.rs')
-rw-r--r-- | src/rust/unit-wasm-sys/rusty.rs | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/src/rust/unit-wasm-sys/rusty.rs b/src/rust/unit-wasm-sys/rusty.rs new file mode 100644 index 0000000..79c38f3 --- /dev/null +++ b/src/rust/unit-wasm-sys/rusty.rs @@ -0,0 +1,214 @@ +/* SPDX-License-Identifier: Apache-2.0 */ + +/* + * Copyright (C) Andrew Clayton + * Copyright (C) F5, Inc. + */ + +use std::ffi::c_char; +use std::ffi::c_void; +use std::ffi::CStr; +use std::ptr::null_mut; + +#[macro_export] +macro_rules! C2S { + ($a:expr) => {{ + unsafe { CStr::from_ptr($a).to_str().unwrap() } + }}; +} + +#[macro_export] +macro_rules! S2C { + ($a:expr) => {{ + format!("{}\0", $a) + }}; +} + +#[macro_export] +macro_rules! uwr_write_str{ + ($a:expr, $($arg:tt)*) => { + { + uwr_mem_write_str($a, &format!($($arg)*)) + } +}} + +pub const fn UWR_CTX_INITIALIZER() -> luw_ctx_t { + luw_ctx_t { + addr: null_mut(), + mem: null_mut(), + req: null_mut(), + resp: null_mut(), + resp_hdr: null_mut(), + resp_offset: 0, + req_buf: null_mut(), + hdrp: null_mut(), + reqp: null_mut(), + } +} + +pub fn uwr_init_ctx(ctx: *mut luw_ctx_t, addr: *mut u8, offset: usize) { + unsafe { + luw_init_ctx(ctx, addr, offset); + } +} + +pub fn uwr_set_req_buf( + ctx: *mut luw_ctx_t, + buf: *mut *mut u8, + flags: u32, +) -> i32 { + unsafe { luw_set_req_buf(ctx, buf, flags) } +} + +pub fn uwr_get_http_path(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_path(ctx)) +} + +pub fn uwr_get_http_method(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_method(ctx)) +} + +pub fn uwr_get_http_version(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_version(ctx)) +} + +pub fn uwr_get_http_query(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_query(ctx)) +} + +pub fn uwr_get_http_remote(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_remote(ctx)) +} + +pub fn uwr_get_http_local_addr(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_local_addr(ctx)) +} + +pub fn uwr_get_http_local_port(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_local_port(ctx)) +} + +pub fn uwr_get_http_server_name(ctx: *mut luw_ctx_t) -> &'static str { + C2S!(luw_get_http_server_name(ctx)) +} + +pub fn uwr_get_http_content(ctx: *const luw_ctx_t) -> *const u8 { + unsafe { luw_get_http_content(ctx) } +} + +pub fn uwr_get_http_content_len(ctx: *const luw_ctx_t) -> usize { + unsafe { luw_get_http_content_len(ctx) } +} + +pub fn uwr_get_http_content_sent(ctx: *const luw_ctx_t) -> usize { + unsafe { luw_get_http_content_sent(ctx) } +} + +pub fn uwr_http_is_tls(ctx: *const luw_ctx_t) -> bool { + unsafe { luw_http_is_tls(ctx) } +} + +pub fn uwr_http_hdr_iter( + ctx: *mut luw_ctx_t, + luw_http_hdr_iter_func: ::std::option::Option< + unsafe extern "C" fn( + ctx: *mut luw_ctx_t, + name: *const c_char, + value: *const c_char, + data: *mut c_void, + ) -> bool, + >, + user_data: *mut c_void, +) { + unsafe { luw_http_hdr_iter(ctx, luw_http_hdr_iter_func, user_data) } +} + +pub fn uwr_http_hdr_get_value(ctx: *mut luw_ctx_t, hdr: &str) -> &'static str { + C2S!(luw_http_hdr_get_value(ctx, S2C!(hdr).as_ptr() as *const i8)) +} + +pub fn uwr_get_response_data_size(ctx: *const luw_ctx_t) -> usize { + unsafe { luw_get_response_data_size(ctx) } +} + +pub fn uwr_mem_write_str(ctx: *mut luw_ctx_t, src: &str) -> usize { + unsafe { luw_mem_writep_data(ctx, src.as_ptr(), src.len()) } +} + +pub fn uwr_mem_write_buf( + ctx: *mut luw_ctx_t, + src: *const u8, + size: usize, +) -> usize { + unsafe { luw_mem_writep_data(ctx, src, size) } +} + +pub fn uwr_req_buf_append(ctx: *mut luw_ctx_t, src: *const u8) { + unsafe { + luw_req_buf_append(ctx, src); + } +} + +pub fn uwr_mem_fill_buf_from_req(ctx: *mut luw_ctx_t, from: usize) -> usize { + unsafe { luw_mem_fill_buf_from_req(ctx, from) } +} + +pub fn uwr_luw_mem_reset(ctx: *mut luw_ctx_t) { + unsafe { + luw_mem_reset(ctx); + } +} + +pub fn uwr_http_send_response(ctx: *const luw_ctx_t) { + unsafe { + luw_http_send_response(ctx); + } +} + +pub fn uwr_http_init_headers(ctx: *mut luw_ctx_t, nr: usize, offset: usize) { + unsafe { + luw_http_init_headers(ctx, nr, offset); + } +} + +pub fn uwr_http_add_header( + ctx: *mut luw_ctx_t, + idx: u16, + name: &str, + value: &str, +) { + unsafe { + luw_http_add_header( + ctx, + idx, + S2C!(name).as_ptr() as *const i8, + S2C!(value).as_ptr() as *const i8, + ); + } +} + +pub fn uwr_http_send_headers(ctx: *const luw_ctx_t) { + unsafe { + luw_http_send_headers(ctx); + } +} + +pub fn uwr_http_response_end() { + unsafe { + luw_http_response_end(); + } +} + +pub fn uwr_mem_get_init_size() -> u32 { + unsafe { luw_mem_get_init_size() } +} + +pub fn uwr_malloc(size: u32) -> *mut u8 { + unsafe { luw_malloc(size as usize) as *mut u8 } +} + +pub fn uwr_free(ptr: *mut u8) { + unsafe { + luw_free(ptr as *mut c_void); + } +} |