diff options
| author | Dmitri Pal <dpal@dpal.csb> | 2009-02-23 10:38:06 -0500 |
|---|---|---|
| committer | Dmitri Pal <dpal@dpal.csb> | 2009-02-23 10:38:06 -0500 |
| commit | d986aeb99fa33967374290bf7ce75eab76c6d446 (patch) | |
| tree | e85af838cd95b43c4f1be5bc2203a1a3474ba589 /sinks/stderr | |
| download | elapi_draft-d986aeb99fa33967374290bf7ce75eab76c6d446.tar.gz elapi_draft-d986aeb99fa33967374290bf7ce75eab76c6d446.tar.xz elapi_draft-d986aeb99fa33967374290bf7ce75eab76c6d446.zip | |
Initial commit.
Diffstat (limited to 'sinks/stderr')
| -rw-r--r-- | sinks/stderr/elapi_sink_stderr.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/sinks/stderr/elapi_sink_stderr.c b/sinks/stderr/elapi_sink_stderr.c new file mode 100644 index 0000000..17144ac --- /dev/null +++ b/sinks/stderr/elapi_sink_stderr.c @@ -0,0 +1,135 @@ +/* Copyright */ + +#include <stdio.h> +#include <errno.h> +#include <malloc.h> +#include "elapi_sink.h" +#include "elapi_collection.h" +#include "elapi_debug.h" +#include "elapi_util.h" + + +/***** Standard functions each facility has to provide *****/ +/* Initialize facility - open files, establish connnectons, etc... */ +static int stderr_sink_init(struct data_descriptor *dblock) +{ + struct serial_data *serialized_data; + + DEBUG_STRING("stderr_sink_init","Entry"); + + /* Prepare the block where the format function will store its data */ + errno = 0; + dblock->internal_data = NULL; + serialized_data = malloc(sizeof(struct serial_data)); + if(serialized_data == NULL) return errno; + + serialized_data->buffer = NULL; + serialized_data->size = 0; + serialized_data->length = 0; + serialized_data->nest_level = 0; + + dblock->internal_data = (void *)(serialized_data); + + + DEBUG_NUMBER("DBLOCK in init",dblock); + DEBUG_NUMBER("internal data in init",dblock->internal_data); + DEBUG_STRING("Application name in init:",dblock->appname); + + DEBUG_STRING("stderr_sink_init","Exit"); + return EOK; +} + + +/* Formatting calback */ +static int stderr_sink_format(struct data_descriptor *dblock,struct collection_item *event) +{ + struct serial_data *serialized_data; + int error = EOK; + + DEBUG_STRING("stderr_sink_format","Entry"); + DEBUG_NUMBER("DBLOCK in format",dblock); + DEBUG_NUMBER("internal data in format",dblock->internal_data); + + serialized_data = (struct serial_data *)(dblock->internal_data); + + /* Traverse collection */ + error = traverse_collection(event,ELAPI_TRAVERSE_DEFAULT | ELAPI_TRAVERSE_END ,serialize,(void *)(serialized_data)); + if(error) { + DEBUG_NUMBER("traverse_collection returned error",error); + return error; + } + + DEBUG_STRING("stderr_sink_format","Exit"); + return EOK; +} + + +/* Cleanup per event internal data after a failure */ +static void stderr_sink_cleanup(struct data_descriptor *dblock) +{ + struct serial_data *serialized_data; + DEBUG_STRING("stderr_sink_cleanup","Entry"); + + serialized_data = (struct serial_data *)(dblock->internal_data); + + if(serialized_data->buffer != NULL) { + free(serialized_data->buffer); + serialized_data->buffer = NULL; + serialized_data->size = 0; + serialized_data->length = 0; + serialized_data->nest_level = 0; + } + + DEBUG_STRING("stderr_sink_cleanup","Exit"); +} + +/* Close facility */ +static void stderr_sink_close(struct data_descriptor *dblock) +{ + DEBUG_STRING("stderr_sink_close","Entry"); + + if(dblock->internal_data != NULL) { + stderr_sink_cleanup(dblock); + free(dblock->internal_data); + dblock->internal_data=NULL; + } + + DEBUG_STRING("stderr_sink_close","Exit"); +} + + +/* Logging calback */ +static int stderr_sink_submit(struct data_descriptor *dblock) +{ + struct serial_data *serialized_data; + DEBUG_STRING("stderr_sink_submit","Entry"); + DEBUG_NUMBER("DBLOCK in submit",dblock); + DEBUG_NUMBER("internal data in submit",dblock->internal_data); + + serialized_data = (struct serial_data *)(dblock->internal_data); + + DEBUG_STRING("OUTPUT:",serialized_data->buffer); + + fprintf(stderr,"%s\n",serialized_data->buffer); + + stderr_sink_cleanup(dblock); + + DEBUG_STRING("stderr_sink_submit","Exit"); + return EOK; +} + +/* Return a filled in structure */ +void get_sink_info(struct sink_capability *sink_cpb_block) +{ + DEBUG_STRING("get_sink_info","Entry"); + + sink_cpb_block->retry_interval = SINK_NEVER_RETRY; + sink_cpb_block->init_cb = stderr_sink_init; + sink_cpb_block->cleanup_cb = stderr_sink_cleanup; + sink_cpb_block->format_cb = stderr_sink_format; + sink_cpb_block->submit_cb = stderr_sink_submit; + sink_cpb_block->close_cb = stderr_sink_close; + + DEBUG_STRING("get_sink_info","Exit"); +} + |
