mirror of
https://github.com/zeek/zeek.git
synced 2025-10-05 16:18:19 +00:00
Merge branch 'topic/robin/event-dumper'
Changes: - Changing semantics of the new_event() meta event: it's raised only for events that have a handler defined. There are too many checks in Bro that prevent events wo/ handler from being even prepared to raise to do that differently. - Adding test case. * topic/robin/event-dumper: New script misc/dump-events.bro, along with core support, that dumps events Bro is raising in an easily readable form. Prettyfing Describe() for record types.
This commit is contained in:
commit
dadfcde70e
14 changed files with 420 additions and 8 deletions
|
@ -3,6 +3,7 @@
|
|||
#include "Func.h"
|
||||
#include "Scope.h"
|
||||
#include "RemoteSerializer.h"
|
||||
#include "NetVar.h"
|
||||
|
||||
EventHandler::EventHandler(const char* arg_name)
|
||||
{
|
||||
|
@ -56,6 +57,9 @@ void EventHandler::Call(val_list* vl, bool no_remote)
|
|||
DEBUG_MSG("Event: %s\n", Name());
|
||||
#endif
|
||||
|
||||
if ( new_event )
|
||||
NewEvent(vl);
|
||||
|
||||
if ( ! no_remote )
|
||||
{
|
||||
loop_over_list(receivers, i)
|
||||
|
@ -75,6 +79,56 @@ void EventHandler::Call(val_list* vl, bool no_remote)
|
|||
}
|
||||
}
|
||||
|
||||
void EventHandler::NewEvent(val_list* vl)
|
||||
{
|
||||
if ( ! new_event )
|
||||
return;
|
||||
|
||||
if ( this == new_event.Ptr() )
|
||||
// new_event() is the one event we don't want to report.
|
||||
return;
|
||||
|
||||
RecordType* args = FType()->Args();
|
||||
VectorVal* vargs = new VectorVal(call_argument_vector);
|
||||
|
||||
for ( int i = 0; i < args->NumFields(); i++ )
|
||||
{
|
||||
const char* fname = args->FieldName(i);
|
||||
BroType* ftype = args->FieldType(i);
|
||||
Val* fdefault = args->FieldDefault(i);
|
||||
|
||||
RecordVal* rec = new RecordVal(call_argument);
|
||||
rec->Assign(0, new StringVal(fname));
|
||||
|
||||
ODesc d;
|
||||
d.SetShort();
|
||||
ftype->Describe(&d);
|
||||
rec->Assign(1, new StringVal(d.Description()));
|
||||
|
||||
if ( fdefault )
|
||||
{
|
||||
Ref(fdefault);
|
||||
rec->Assign(2, fdefault);
|
||||
}
|
||||
|
||||
if ( i < vl->length() && (*vl)[i] )
|
||||
{
|
||||
Val* val = (*vl)[i];
|
||||
Ref(val);
|
||||
rec->Assign(3, val);
|
||||
}
|
||||
|
||||
vargs->Assign(i, rec);
|
||||
}
|
||||
|
||||
val_list* mvl = new val_list(2);
|
||||
mvl->append(new StringVal(name));
|
||||
mvl->append(vargs);
|
||||
|
||||
Event* ev = new Event(new_event, mvl);
|
||||
mgr.Dispatch(ev);
|
||||
}
|
||||
|
||||
void EventHandler::AddRemoteHandler(SourceID peer)
|
||||
{
|
||||
receivers.append(peer);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue