1818use std:: ffi:: CString ;
1919use std:: os:: raw:: c_void;
2020
21- pub use suricata_sys:: sys:: { Flow , Packet , SCEveUserCallbackFn , SCJsonBuilder , ThreadVars } ;
21+ pub use suricata_sys:: sys:: {
22+ Flow , Packet as RawPacket , SCEveUserCallbackFn , SCJsonBuilder , ThreadVars ,
23+ } ;
2224use suricata_sys:: sys:: {
2325 SCEveFileType , SCEveFileTypeDeinitFunc , SCEveFileTypeInitFunc , SCEveFileTypeThreadDeinitFunc ,
2426 SCEveFileTypeThreadInitFunc , SCEveFileTypeWriteFunc , SCEveRegisterCallback ,
@@ -79,7 +81,7 @@ impl EveFileType {
7981///
8082/// The callback receives:
8183/// - `tv`: the `ThreadVars` for the thread performing the logging
82- /// - `p`: the `Packet`, if available
84+ /// - `p`: the `Packet`, or `None` if not available
8385/// - `f`: the `Flow`, if available
8486/// - `jb`: the JSON builder for the current EVE record
8587///
@@ -110,9 +112,9 @@ impl EveFileType {
110112/// The callback must not panic.
111113pub fn register_callback < F > ( callback : F ) -> Result < ( ) , & ' static str >
112114where
113- F : Fn (
115+ F : for < ' a > Fn (
114116 * mut ThreadVars ,
115- * const Packet ,
117+ Option < crate :: packet :: Packet < ' a > > ,
116118 * mut Flow ,
117119 & mut crate :: jsonbuilder:: JsonBuilder ,
118120 ) -> Result < ( ) , crate :: jsonbuilder:: Error >
@@ -134,11 +136,12 @@ where
134136/// Internal wrapper used to adapt the C EVE callback to a Rust
135137/// closure callback.
136138unsafe extern "C" fn callback_wrapper < F > (
137- tv : * mut ThreadVars , p : * const Packet , f : * mut Flow , jb : * mut SCJsonBuilder , user : * mut c_void ,
139+ tv : * mut ThreadVars , p : * const RawPacket , f : * mut Flow , jb : * mut SCJsonBuilder ,
140+ user : * mut c_void ,
138141) where
139- F : Fn (
142+ F : for < ' a > Fn (
140143 * mut ThreadVars ,
141- * const Packet ,
144+ Option < crate :: packet :: Packet < ' a > > ,
142145 * mut Flow ,
143146 & mut crate :: jsonbuilder:: JsonBuilder ,
144147 ) -> Result < ( ) , crate :: jsonbuilder:: Error >
@@ -149,7 +152,12 @@ unsafe extern "C" fn callback_wrapper<F>(
149152 let callback = & * ( user as * const F ) ;
150153 let mut jb = crate :: jsonbuilder:: JsonBuilder :: from_raw ( jb) ;
151154 let mark = jb. get_mark ( ) ;
152- if callback ( tv, p, f, & mut jb) . is_err ( ) {
155+ let packet = if p. is_null ( ) {
156+ None
157+ } else {
158+ Some ( crate :: packet:: Packet :: from_ptr ( p) )
159+ } ;
160+ if callback ( tv, packet, f, & mut jb) . is_err ( ) {
153161 let _ = jb. restore_mark ( & mark) ;
154162 }
155163}
0 commit comments