From 8c83881017e3815534f9d880c58b78a56ca4f971 Mon Sep 17 00:00:00 2001 From: Dmitri Pal Date: Wed, 25 Feb 2009 08:38:29 -0500 Subject: Making the sink to be able to inicate that it is loadable once per process. --- dispatcher/elapi_dispatcher.c | 25 +++++++++++++++++++++++++ dispatcher/elapi_dispatcher_ut.c | 26 +++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) (limited to 'dispatcher') diff --git a/dispatcher/elapi_dispatcher.c b/dispatcher/elapi_dispatcher.c index cecf5bf..ff1a275 100644 --- a/dispatcher/elapi_dispatcher.c +++ b/dispatcher/elapi_dispatcher.c @@ -119,12 +119,26 @@ static int load_sink(struct sink_descriptor *sink_data,char *sink_name) get_lib_info = (capability_fn)(dlsym(sink_data->lib_handle, SINK_ENTRY_POINT)); if ((lib_error = dlerror()) != NULL) { DEBUG_STRING("Dlsym returned error",lib_error); + dlclose(sink_data->lib_handle); return ELIBACC; } /* Init data */ get_lib_info(&(sink_data->sink_cpb_block)); + DEBUG_NUMBER("Instance:",sink_data->sink_cpb_block.instance); + DEBUG_NUMBER("Flags:",sink_data->sink_cpb_block.flags); + + /* Check if it is a single mode sink */ + if((sink_data->sink_cpb_block.instance > 0) && + ((sink_data->sink_cpb_block.flags & SINK_FLAG_LOAD_SINGLE) > 0)) { + /* This is the sink that should be loaded only once */ + /* We should fail and not even create the sink */ + DEBUG_STRING("Attempt to load the sink twice",""); + dlclose(sink_data->lib_handle); + return ELIBEXEC; + } + /* Call library initialization function */ init_sink(sink_data,ELAPI_SINK_OK); @@ -655,6 +669,17 @@ int alter_audit_dispatcher(struct dispatcher_handle *dispatcher, return error; case ELAPI_SINK_ACTION_DELETE: /* Try to delete the sink */ + error = get_item_and_do(dispatcher->sink_list, + sink, + ELAPI_TYPE_ANY, + ELAPI_TRAVERSE_DEFAULT, + close_sink_handler, + NULL); + if(error) { + DEBUG_NUMBER("alter_audit_dispatcher close sink returning",error); + return error; + } + error = delete_property(dispatcher->sink_list, sink, ELAPI_TYPE_ANY, diff --git a/dispatcher/elapi_dispatcher_ut.c b/dispatcher/elapi_dispatcher_ut.c index eec045b..bb848fa 100644 --- a/dispatcher/elapi_dispatcher_ut.c +++ b/dispatcher/elapi_dispatcher_ut.c @@ -111,6 +111,7 @@ int main() { int error = EOK; struct dispatcher_handle *dispatcher; + struct dispatcher_handle *dispatcher2; char *sinks[]= { "foo", "stderr", "bar", NULL }; printf("Test start\n"); @@ -164,6 +165,7 @@ int main() else printf("Expected failure. Error : %d\n",error); /* Adding new */ + printf("%s","=================\nAdding syslog - first time - expect success\n"); error = alter_audit_dispatcher(dispatcher,"syslog",ELAPI_SINK_ACTION_ADD); if(error != 0) printf("Expected success got failure %d\n",error); else printf("Success : %d\n",error); @@ -192,23 +194,41 @@ int main() print_collection(event); log_audit_event(dispatcher, event); - /* Pulse */ error = alter_audit_dispatcher(dispatcher,"syslog",ELAPI_SINK_ACTION_PULSE); if(error != 0) printf("Expected success got failure %d\n",error); else printf("Success : %d\n",error); - /* Disable */ - error = alter_audit_dispatcher(dispatcher,"syslog",ELAPI_SINK_ACTION_DISABLE); + + printf("%s","=================\nCreating another dispatcher - expect success\n"); + error = create_audit_dispatcher(&dispatcher2,"my_app",sinks,NULL,NULL); if(error != 0) printf("Expected success got failure %d\n",error); else printf("Success : %d\n",error); + printf("%s","=================\nAdding syslog sink to it - expect failure\n"); + error = alter_audit_dispatcher(dispatcher2,"syslog",ELAPI_SINK_ACTION_ADD); + if(error == 0) printf("%s","Expected failure got success\n"); + else printf("Expected failure. Error : %d\n",error); + + /* Delete */ error = alter_audit_dispatcher(dispatcher,"syslog",ELAPI_SINK_ACTION_DELETE); if(error != 0) printf("Expected success got failure %d\n",error); else printf("Success : %d\n",error); + + printf("%s","=================\nAdding syslog sink to it - now expect success\n"); + error = alter_audit_dispatcher(dispatcher2,"syslog",ELAPI_SINK_ACTION_ADD); + if(error != 0) printf("Expected success got failure %d\n",error); + else printf("Success : %d\n",error); + + /* Disable */ + error = alter_audit_dispatcher(dispatcher2,"syslog",ELAPI_SINK_ACTION_DISABLE); + if(error != 0) printf("Expected success got failure %d\n",error); + else printf("Success : %d\n",error); + destroy_audit_dispatcher(dispatcher); + destroy_audit_dispatcher(dispatcher2); destroy_collection(peer); destroy_collection(host); destroy_collection(socket); -- cgit