diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e847255258..1b26d56575 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -103,7 +103,6 @@ target_link_libraries(bifcl) include(BifCl) set(BIF_SRCS - analyzer.bif bro.bif logging.bif input.bif @@ -158,6 +157,17 @@ binpac_target(syslog.pac binpac_target(modbus.pac modbus-protocol.pac modbus-analyzer.pac) +######################################################################## +## Including subdirectories. +######################################################################## + +add_subdirectory(analyzer) + +set(bro_SUBDIRS + $ +) + + ######################################################################## ## Including plug-ins that are compiled in statically. ######################################################################## @@ -389,11 +399,6 @@ set(bro_SRCS plugin/Manager.cc plugin/Plugin.cc - analyzer/Analyzer.cc - analyzer/Manager.cc - analyzer/Component.cc - analyzer/Tag.cc - protocols/BuiltInAnalyzers.cc nb_dns.c @@ -402,7 +407,7 @@ set(bro_SRCS collect_headers(bro_HEADERS ${bro_SRCS}) -add_executable(bro ${bro_SRCS} ${bro_HEADERS} ${bro_PLUGIN_OBJECT_LIBS}) +add_executable(bro ${bro_SRCS} ${bro_HEADERS} ${bro_PLUGIN_OBJECT_LIBS} ${bro_SUBDIRS}) target_link_libraries(bro ${brodeps} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/src/Func.cc b/src/Func.cc index cedf729301..02f8dd4f29 100644 --- a/src/Func.cc +++ b/src/Func.cc @@ -548,14 +548,12 @@ void builtin_error(const char* msg, BroObj* arg) reporter->Error(msg, arg); } -#include "analyzer.bif.func_h" #include "bro.bif.func_h" #include "logging.bif.func_h" #include "input.bif.func_h" #include "reporter.bif.func_h" #include "strings.bif.func_h" -#include "analyzer.bif.func_def" #include "bro.bif.func_def" #include "logging.bif.func_def" #include "input.bif.func_def" @@ -571,7 +569,6 @@ void init_builtin_funcs() var_sizes = internal_type("var_sizes")->AsTableType(); gap_info = internal_type("gap_info")->AsRecordType(); -#include "analyzer.bif.func_init" #include "bro.bif.func_init" #include "logging.bif.func_init" #include "input.bif.func_init" diff --git a/src/NetVar.cc b/src/NetVar.cc index 97bf9fd559..7483728e44 100644 --- a/src/NetVar.cc +++ b/src/NetVar.cc @@ -238,7 +238,6 @@ TableType* record_field_table; StringVal* cmd_line_bpf_filter; -#include "analyzer.bif.netvar_def" #include "const.bif.netvar_def" #include "types.bif.netvar_def" #include "event.bif.netvar_def" diff --git a/src/NetVar.h b/src/NetVar.h index 6a1103ebb9..88b5478149 100644 --- a/src/NetVar.h +++ b/src/NetVar.h @@ -248,7 +248,6 @@ extern void init_general_global_var(); extern void init_event_handlers(); extern void init_net_var(); -#include "analyzer.bif.netvar_h" #include "const.bif.netvar_h" #include "types.bif.netvar_h" #include "event.bif.netvar_h" diff --git a/src/analyzer/CMakeLists.txt b/src/analyzer/CMakeLists.txt new file mode 100644 index 0000000000..68742116ef --- /dev/null +++ b/src/analyzer/CMakeLists.txt @@ -0,0 +1,16 @@ + +include_directories(BEFORE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) + +set(analyzer_SRCS + Analyzer.cc + Manager.cc + Component.cc + Tag.cc +) + +bif_target_for_subdir(analyzer.bif) + +add_library(bro_analyzer OBJECT ${analyzer_SRCS} ${BIF_OUTPUT_CC} ${BIF_OUTPUT_H}) diff --git a/src/analyzer/Manager.cc b/src/analyzer/Manager.cc index 70b22bfc26..dca4084c2c 100644 --- a/src/analyzer/Manager.cc +++ b/src/analyzer/Manager.cc @@ -89,12 +89,18 @@ void Manager::Init() for ( std::list::const_iterator i = analyzers.begin(); i != analyzers.end(); i++ ) RegisterAnalyzerComponent(*i); - // Caache these tags. + // Cache these tags. analyzer_backdoor = GetAnalyzerTag("BACKDOOR"); analyzer_connsize = GetAnalyzerTag("CONNSIZE"); analyzer_interconn = GetAnalyzerTag("INTERCONN"); analyzer_stepping = GetAnalyzerTag("STEPPINGSTONE"); analyzer_tcpstats = GetAnalyzerTag("TCPSTATS"); + + } + +void Manager::InitBifs() + { + #include "analyzer.bif.init.cc" } void Manager::DumpDebug() diff --git a/src/analyzer/Manager.h b/src/analyzer/Manager.h index cb749bab7f..750ac986fb 100644 --- a/src/analyzer/Manager.h +++ b/src/analyzer/Manager.h @@ -29,6 +29,8 @@ #include "../net_util.h" #include "../IP.h" +#include "analyzer/analyzer.bif.h" + namespace analyzer { /** @@ -59,6 +61,12 @@ public: */ void Init(); + /** + * Initializes the analyze-related BiFs. Must be called after scripts + * are parsed. + */ + void InitBifs(); + /** * Finished the manager's operations. */ diff --git a/src/analyzer.bif b/src/analyzer/analyzer.bif similarity index 100% rename from src/analyzer.bif rename to src/analyzer/analyzer.bif diff --git a/src/builtin-func.l b/src/builtin-func.l index ec60f1c7ec..2128c21f6b 100644 --- a/src/builtin-func.l +++ b/src/builtin-func.l @@ -139,6 +139,7 @@ extern int yyparse(); char* input_filename = 0; char* input_filename_with_path = 0; char* plugin = 0; +int alternative_mode = 0; FILE* fp_bro_init = 0; FILE* fp_func_def = 0; @@ -176,7 +177,7 @@ void usage() exit(1); } -void init_plugin_mode() +void init_alternative_mode() { fp_bro_init = open_output_file("bro"); fp_func_h = open_output_file("h"); @@ -191,8 +192,8 @@ void init_plugin_mode() char auto_gen_comment[n]; snprintf(auto_gen_comment, n, - "This file was automatically generated by bifcl from %s (plugin mode).", - input_filename_with_path); + "This file was automatically generated by bifcl from %s (%s mode).", + input_filename_with_path, plugin ? "plugin" : "subdir"); fprintf(fp_bro_init, "# %s\n\n", auto_gen_comment); fprintf(fp_func_def, "// %s\n\n", auto_gen_comment); @@ -225,42 +226,53 @@ void init_plugin_mode() if ( dot ) *dot = '\0'; - fprintf(fp_func_init, "\n"); - fprintf(fp_func_init, "#include \n"); - fprintf(fp_func_init, "#include \n"); - fprintf(fp_func_init, "#include \"%s.h\"\n", input_filename); - fprintf(fp_func_init, "\n"); - fprintf(fp_func_init, "namespace plugin { namespace %s {\n", plugin); - fprintf(fp_func_init, "\n"); - fprintf(fp_func_init, "std::list > __bif_%s_init()\n", name); - fprintf(fp_func_init, "\t{\n"); - fprintf(fp_func_init, "\tstd::list > bifs;\n"); - fprintf(fp_func_init, "\n"); + if ( plugin ) + { + fprintf(fp_func_init, "\n"); + fprintf(fp_func_init, "#include \n"); + fprintf(fp_func_init, "#include \n"); + fprintf(fp_func_init, "#include \"%s.h\"\n", input_filename); + fprintf(fp_func_init, "\n"); + fprintf(fp_func_init, "namespace plugin { namespace %s {\n", plugin); + fprintf(fp_func_init, "\n"); + fprintf(fp_func_init, "std::list > __bif_%s_init()\n", name); + fprintf(fp_func_init, "\t{\n"); + fprintf(fp_func_init, "\tstd::list > bifs;\n"); + fprintf(fp_func_init, "\n"); + } } -void finish_plugin_mode() +void finish_alternative_mode() { fprintf(fp_func_h, "\n"); fprintf(fp_func_h, "#endif\n"); - fprintf(fp_func_init, "\n"); - fprintf(fp_func_init, "\treturn bifs;\n"); - fprintf(fp_func_init, "\t}\n"); - fprintf(fp_func_init, "} }\n"); - fprintf(fp_func_init, "\n"); - } + if ( plugin ) + { + fprintf(fp_func_init, "\n"); + fprintf(fp_func_init, "\treturn bifs;\n"); + fprintf(fp_func_init, "\t}\n"); + fprintf(fp_func_init, "} }\n"); + fprintf(fp_func_init, "\n"); + } + } int main(int argc, char* argv[]) { char opt; - while ( (opt = getopt(argc, argv, "p:")) != -1 ) + while ( (opt = getopt(argc, argv, "p:s")) != -1 ) { switch ( opt ) { case 'p': + alternative_mode = 1; plugin = optarg; break; + case 's': + alternative_mode = 1; + break; + default: usage(); } @@ -284,7 +296,7 @@ int main(int argc, char* argv[]) if ( slash ) input_filename = slash + 1; - if ( ! plugin ) + if ( ! alternative_mode ) { fp_bro_init = open_output_file("bro"); fp_func_h = open_output_file("func_h"); @@ -311,13 +323,13 @@ int main(int argc, char* argv[]) } else - init_plugin_mode(); + init_alternative_mode(); yy_switch_to_buffer(yy_create_buffer(fp_input, YY_BUF_SIZE)); yyparse(); - if ( plugin ) - finish_plugin_mode(); + if ( alternative_mode ) + finish_alternative_mode(); fclose(fp_input); close_all_output_files(); @@ -339,7 +351,7 @@ void close_all_output_files(void) close_if_open(&fp_func_def); close_if_open(&fp_func_init); - if ( ! plugin ) + if ( ! alternative_mode ) { close_if_open(&fp_netvar_h); close_if_open(&fp_netvar_def); diff --git a/src/main.cc b/src/main.cc index cb3fbd7f6e..59a383543c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -836,6 +836,7 @@ int main(int argc, char** argv) yyparse(); + analyzer_mgr->InitBifs(); plugin_mgr->InitPluginsBif(); if ( print_plugins )