applayerevent: derive get_event_info and get_event_info_by_id

Add generation of wrapper functions for get_event_info
and get_event_info_by_id to the derive macro. Eliminates
the need for the wrapper method to be created by the parser
author.
pull/6324/head
Jason Ish 4 years ago committed by Victor Julien
parent 0fa7b5c2a2
commit 9221f1d9d5

@ -70,6 +70,23 @@ pub fn derive_app_layer_event(input: TokenStream) -> TokenStream {
_ => None
}
}
unsafe extern "C" fn get_event_info(
event_name: *const std::os::raw::c_char,
event_id: *mut std::os::raw::c_int,
event_type: *mut crate::core::AppLayerEventType,
) -> std::os::raw::c_int {
crate::applayer::get_event_info::<#name>(event_name, event_id, event_type)
}
unsafe extern "C" fn get_event_info_by_id(
event_id: std::os::raw::c_int,
event_name: *mut *const std::os::raw::c_char,
event_type: *mut crate::core::AppLayerEventType,
) -> i8 {
crate::applayer::get_event_info_by_id::<#name>(event_id, event_name, event_type)
}
}
};

@ -431,6 +431,18 @@ pub trait AppLayerEvent {
/// Return the ID value of the enum variant.
fn as_i32(&self) -> i32;
unsafe extern "C" fn get_event_info(
event_name: *const std::os::raw::c_char,
event_id: *mut std::os::raw::c_int,
event_type: *mut core::AppLayerEventType,
) -> std::os::raw::c_int;
unsafe extern "C" fn get_event_info_by_id(
event_id: std::os::raw::c_int,
event_name: *mut *const std::os::raw::c_char,
event_type: *mut core::AppLayerEventType,
) -> i8;
}
/// Generic `get_info_info` implementation for enums implementing
@ -447,7 +459,7 @@ pub trait AppLayerEvent {
///
/// get_event_info::<AppEvent>(...)
#[inline(always)]
pub fn get_event_info<T: AppLayerEvent>(
pub unsafe fn get_event_info<T: AppLayerEvent>(
event_name: *const std::os::raw::c_char,
event_id: *mut std::os::raw::c_int,
event_type: *mut core::AppLayerEventType,
@ -456,7 +468,6 @@ pub fn get_event_info<T: AppLayerEvent>(
return -1;
}
unsafe {
let event = match CStr::from_ptr(event_name).to_str().map(T::from_string) {
Ok(Some(event)) => event.as_i32(),
_ => -1,
@ -464,22 +475,19 @@ pub fn get_event_info<T: AppLayerEvent>(
*event_type = core::APP_LAYER_EVENT_TYPE_TRANSACTION;
*event_id = event as std::os::raw::c_int;
return 0;
}
}
/// Generic `get_info_info_by_id` implementation for enums implementing
/// AppLayerEvent.
#[inline(always)]
pub fn get_event_info_by_id<T: AppLayerEvent>(
pub unsafe fn get_event_info_by_id<T: AppLayerEvent>(
event_id: std::os::raw::c_int,
event_name: *mut *const std::os::raw::c_char,
event_type: *mut core::AppLayerEventType,
) -> i8 {
if let Some(e) = T::from_id(event_id as i32) {
unsafe {
*event_name = e.to_cstring().as_ptr() as *const std::os::raw::c_char;
*event_type = core::APP_LAYER_EVENT_TYPE_TRANSACTION;
}
return 0;
}
return -1;

Loading…
Cancel
Save