diff --git a/rust/src/applayertemplate/template.rs b/rust/src/applayertemplate/template.rs index 865034b8b2..3eb746587e 100644 --- a/rust/src/applayertemplate/template.rs +++ b/rust/src/applayertemplate/template.rs @@ -459,6 +459,51 @@ pub extern "C" fn rs_template_state_get_tx_iterator( } } +/// Get the request buffer for a transaction from C. +/// +/// No required for parsing, but an example function for retrieving a +/// pointer to the request buffer from C for detection. +#[no_mangle] +pub extern "C" fn rs_template_get_request_buffer( + tx: *mut libc::c_void, + buf: *mut *const libc::uint8_t, + len: *mut libc::uint32_t, +) -> libc::uint8_t +{ + let tx = cast_pointer!(tx, TemplateTransaction); + if let Some(ref request) = tx.request { + if request.len() > 0 { + unsafe { + *len = request.len() as libc::uint32_t; + *buf = request.as_ptr(); + } + return 1; + } + } + return 0; +} + +/// Get the response buffer for a transaction from C. +#[no_mangle] +pub extern "C" fn rs_template_get_response_buffer( + tx: *mut libc::c_void, + buf: *mut *const libc::uint8_t, + len: *mut libc::uint32_t, +) -> libc::uint8_t +{ + let tx = cast_pointer!(tx, TemplateTransaction); + if let Some(ref response) = tx.response { + if response.len() > 0 { + unsafe { + *len = response.len() as libc::uint32_t; + *buf = response.as_ptr(); + } + return 1; + } + } + return 0; +} + // Parser name as a C style string. const PARSER_NAME: &'static [u8] = b"template-rust\0";