summaryrefslogtreecommitdiffstats
path: root/dispatcher
diff options
context:
space:
mode:
authorDmitri Pal <dpal@redhat.com>2009-02-25 08:38:29 -0500
committerDmitri Pal <dpal@redhat.com>2009-02-25 08:38:29 -0500
commit8c83881017e3815534f9d880c58b78a56ca4f971 (patch)
treeb5603cf3a695c1e79d6b4dd59062842706303718 /dispatcher
parent0df05e7a4b2533c73544d5405c183d0bda2c153f (diff)
downloadelapi_draft-8c83881017e3815534f9d880c58b78a56ca4f971.tar.gz
elapi_draft-8c83881017e3815534f9d880c58b78a56ca4f971.tar.xz
elapi_draft-8c83881017e3815534f9d880c58b78a56ca4f971.zip
Making the sink to be able to inicate that it is loadable once per process.
Diffstat (limited to 'dispatcher')
-rw-r--r--dispatcher/elapi_dispatcher.c25
-rw-r--r--dispatcher/elapi_dispatcher_ut.c26
2 files changed, 48 insertions, 3 deletions
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);