From e5c62c01a42f627bfdb86e63896ede18325b0b68 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 1 Apr 2020 16:04:44 -0700 Subject: [PATCH] bifcl: Support multiple/alternate event prototype definitions --- tools/bifcl/builtin-func.y | 45 ++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/tools/bifcl/builtin-func.y b/tools/bifcl/builtin-func.y index a02a95d717..c1121a8ef5 100644 --- a/tools/bifcl/builtin-func.y +++ b/tools/bifcl/builtin-func.y @@ -32,6 +32,11 @@ string current_module = GLOBAL_MODULE_NAME; int definition_type; string type_name; +// Alternate event prototypes are only written to the .zeek file, but +// don't need any further changes to C++ source/header files, so this +// set keeps track of whether the first event prototype information has +// already been defined/written to the C++ files. +static std::set events; enum { C_SEGMENT_DEF, @@ -379,9 +384,13 @@ opt_func_attrs: attr_list opt_ws event_def: event_prefix opt_ws plain_head opt_func_attrs { fprintf(fp_bro_init, "%s", $4); } end_of_head ';' { - print_event_c_prototype(fp_func_h, true); - print_event_c_prototype(fp_func_def, false); - print_event_c_body(fp_func_def); + if ( events.find(decl.bro_fullname) == events.end() ) + { + print_event_c_prototype(fp_func_h, true); + print_event_c_prototype(fp_func_def, false); + print_event_c_body(fp_func_def); + events.insert(decl.bro_fullname); + } } func_def: func_prefix opt_ws typed_head opt_func_attrs @@ -556,23 +565,25 @@ head_1: TOK_ID opt_ws arg_begin } else if ( definition_type == EVENT_DEF ) { - // TODO: add namespace for events here - fprintf(fp_netvar_h, - "%sextern EventHandlerPtr %s; %s\n", - decl.c_namespace_start.c_str(), decl.bare_name.c_str(), decl.c_namespace_end.c_str()); + if ( events.find(decl.bro_fullname) == events.end() ) + { + // TODO: add namespace for events here + fprintf(fp_netvar_h, + "%sextern EventHandlerPtr %s; %s\n", + decl.c_namespace_start.c_str(), decl.bare_name.c_str(), decl.c_namespace_end.c_str()); - fprintf(fp_netvar_def, - "%sEventHandlerPtr %s; %s\n", - decl.c_namespace_start.c_str(), decl.bare_name.c_str(), decl.c_namespace_end.c_str()); + fprintf(fp_netvar_def, + "%sEventHandlerPtr %s; %s\n", + decl.c_namespace_start.c_str(), decl.bare_name.c_str(), decl.c_namespace_end.c_str()); - fprintf(fp_netvar_init, - "\t%s = internal_handler(\"%s\");\n", - decl.c_fullname.c_str(), decl.bro_fullname.c_str()); + fprintf(fp_netvar_init, + "\t%s = internal_handler(\"%s\");\n", + decl.c_fullname.c_str(), decl.bro_fullname.c_str()); - record_bif_item(decl.bro_fullname.c_str(), "EVENT"); - - // C++ prototypes of bro_event_* functions will - // be generated later. + record_bif_item(decl.bro_fullname.c_str(), "EVENT"); + // C++ prototypes of bro_event_* functions will + // be generated later. + } } } ;