diff --git a/aux/bro-aux b/aux/bro-aux index 14a7cfe4ea..1a610bced1 160000 --- a/aux/bro-aux +++ b/aux/bro-aux @@ -1 +1 @@ -Subproject commit 14a7cfe4ea2ff6c7f5301dcb81a869adcd6e9834 +Subproject commit 1a610bced1c83644a5bfaeb6e98cf75380fe61a1 diff --git a/aux/btest b/aux/btest index f096c0e408..a9aeb2e1a8 160000 --- a/aux/btest +++ b/aux/btest @@ -1 +1 @@ -Subproject commit f096c0e4088f2d92743e0c28077f086dff216cce +Subproject commit a9aeb2e1a8434c583c75f5941b58dc69a7517444 diff --git a/src/EventHandler.cc b/src/EventHandler.cc index 9cc5306c9c..ef0c9fc63c 100644 --- a/src/EventHandler.cc +++ b/src/EventHandler.cc @@ -69,7 +69,32 @@ void EventHandler::Call(val_list* vl, bool no_remote) } if ( local ) + { + if ( FType() ) + { + const type_list* arg_types = type->ArgTypes()->Types(); + loop_over_list(*vl, i) + { + Val* v = (*vl)[i]; + BroType* va_t = v->Type(); + BroType* ar_t = (*arg_types)[i]; + if ( va_t->Tag() == TYPE_RECORD && ar_t->Tag() == TYPE_RECORD ) + { + if ( ! same_type(va_t, ar_t) ) + { + Val* nv; + nv = v->AsRecordVal()->CoerceTo(ar_t->AsRecordType()); + if ( nv ) + { + vl->replace(i, nv); + Unref(v); + } + } + } + } + } Unref(local->Call(vl)); + } else { loop_over_list(*vl, i) diff --git a/src/main.cc b/src/main.cc index 8641c501ba..9201c991fc 100644 --- a/src/main.cc +++ b/src/main.cc @@ -739,6 +739,20 @@ int main(int argc, char** argv) } #endif + if ( generate_documentation ) + { + std::list::iterator it; + + for ( it = docs_generated.begin(); it != docs_generated.end(); ++it ) + (*it)->WriteDocFile(); + + for ( it = docs_generated.begin(); it != docs_generated.end(); ++it ) + delete *it; + + terminate_bro(); + return 0; + } + if ( nerr > 0 ) { delete dns_mgr; @@ -973,20 +987,6 @@ int main(int argc, char** argv) mgr.Drain(); - if ( generate_documentation ) - { - std::list::iterator it; - - for ( it = docs_generated.begin(); it != docs_generated.end(); ++it ) - (*it)->WriteDocFile(); - - for ( it = docs_generated.begin(); it != docs_generated.end(); ++it ) - delete *it; - - terminate_bro(); - return 0; - } - have_pending_timers = ! reading_traces && timer_mgr->Size() > 0; if ( io_sources.Size() > 0 || have_pending_timers ) diff --git a/testing/btest/Baseline/istate.pybroccoli/bro..stdout b/testing/btest/Baseline/istate.pybroccoli/bro..stdout index 6b74681745..9eec3a4550 100644 --- a/testing/btest/Baseline/istate.pybroccoli/bro..stdout +++ b/testing/btest/Baseline/istate.pybroccoli/bro..stdout @@ -11,4 +11,9 @@ Servus 0.0 192.168.0.0/16 ==== record +[a=42, b=6.6.7.7] 42, 6.6.7.7 +==== coerced record +[a=13, b=, c=helloworld] +13 +helloworld diff --git a/testing/btest/istate/broccoli.bro b/testing/btest/istate/broccoli.bro index ed6a9eee6a..7f97f40585 100644 --- a/testing/btest/istate/broccoli.bro +++ b/testing/btest/istate/broccoli.bro @@ -1,5 +1,5 @@ # @TEST-REQUIRES: grep -vq '#define BROv6' $BUILD/config.h -# @TEST-REQUIRES: test -e $BUILD/aux/broccoli/src/libbroccoli.so +# @TEST-REQUIRES: test -e $BUILD/aux/broccoli/src/libbroccoli.so || test -e $BUILD/aux/broccoli/src/libbroccoli.dylib # # @TEST-EXEC: btest-bg-run bro bro %INPUT $DIST/aux/broccoli/test/broping-record.bro # @TEST-EXEC: btest-bg-run broccoli $BUILD/aux/broccoli/test/broping -r -c 3 127.0.0.1 diff --git a/testing/btest/istate/pybroccoli.py b/testing/btest/istate/pybroccoli.py index 52aba6dfa1..b7fb53a955 100644 --- a/testing/btest/istate/pybroccoli.py +++ b/testing/btest/istate/pybroccoli.py @@ -1,5 +1,5 @@ # @TEST-REQUIRES: grep -vq '#define BROv6' $BUILD/config.h -# @TEST-REQUIRES: test -e $BUILD/aux/broccoli/src/libbroccoli.so +# @TEST-REQUIRES: test -e $BUILD/aux/broccoli/src/libbroccoli.so || test -e $BUILD/aux/broccoli/src/libbroccoli.dylib # @TEST-REQUIRES: test -e $BUILD/aux/broccoli/bindings/broccoli-python/_broccoli_intern.so # # @TEST-EXEC: btest-bg-run bro bro %INPUT $DIST/aux/broccoli/bindings/broccoli-python/tests/test.bro