summaryrefslogtreecommitdiff
path: root/common/elapi/providers/file/file_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/elapi/providers/file/file_util.c')
-rw-r--r--common/elapi/providers/file/file_util.c508
1 files changed, 0 insertions, 508 deletions
diff --git a/common/elapi/providers/file/file_util.c b/common/elapi/providers/file/file_util.c
deleted file mode 100644
index 2e89460b..00000000
--- a/common/elapi/providers/file/file_util.c
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- ELAPI
-
- Module contains internal utility functions for the file provider.
-
- Copyright (C) Dmitri Pal <dpal@redhat.com> 2009
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#define _GNU_SOURCE
-#include <errno.h> /* for errors */
-#include <stdlib.h> /* for free() */
-#include <string.h> /* for strlen() */
-
-/* To be able to serialize on needs to know the guts
- * of the collection structure so have to include
- * private header here.
- */
-#include "file_provider.h"
-#include "file_util.h"
-#include "ini_config.h"
-#include "trace.h"
-#include "config.h"
-
-#ifdef ELAPI_VERBOSE
-/* FIXME: remove when api is stable */
-#include "collection_tools.h"
-#endif
-
-char empty[] = "";
-
-/* Callback to prepare set for splitting */
-static int file_set_clean_cb(const char *property,
- int property_len,
- int type,
- void *data,
- int length,
- void *custom_data,
- int *stop)
-{
- int error = EOK;
- TRACE_FLOW_STRING("file_set_clean_cb", "Entry");
-
- /* Skip header */
- if (type == COL_TYPE_COLLECTION) return EOK;
-
- /* Clean data */
- *((struct collection_item **)(data)) = NULL;
-
- TRACE_FLOW_STRING("file_set_clean_cb", "Exit");
- return error;
-}
-
-/* Function to split event into two parts by given set */
-static int file_split_by_set(struct collection_item **leftovers,
- struct file_prvdr_cfg *cfg,
- struct collection_item *event)
-{
- int error = EOK;
- struct collection_item *item_event;
- struct collection_item *item_set;
- struct collection_iterator *it_event;
- struct collection_iterator *it_set;
- struct collection_item *lo = NULL;
- int found = 0;
- int len1, len2;
-
- TRACE_FLOW_STRING("file_split_by_set", "Entry");
-
- /* First prepare set for use */
- error = col_traverse_collection(cfg->set,
- COL_TRAVERSE_ONELEVEL,
- file_set_clean_cb,
- NULL);
- if (error) {
- TRACE_ERROR_NUMBER("Traverse set failed.", error);
- return error;
- }
-
- /* If we are going to use leftovers create a collection */
- if (cfg->use_leftovers) {
- error = col_create_collection(&lo,
- FILE_LO_NAME,
- FILE_LO_CLASS);
- if (error) {
- TRACE_ERROR_NUMBER("Faild to create collection.", error);
- return error;
- }
- }
-
- /* Now all items from the set are NULLs */
- /* Split the event in two parts */
- /* We need to iterate through the event rather than use a callback. */
- /* Bind iterator */
- error = col_bind_iterator(&it_event, event, COL_TRAVERSE_FLAT);
- if (error) {
- TRACE_ERROR_NUMBER("Error bind iterator for event failed:", error);
- /* Here and below it is safe to destroy it event if is NULL. */
- col_destroy_collection(lo);
- return error;
- }
-
- while(1) {
- /* Loop through the event */
- error = col_iterate_collection(it_event, &item_event);
- if (error) {
- TRACE_ERROR_NUMBER("Error iterating event:", error);
- col_unbind_iterator(it_event);
- col_destroy_collection(lo);
- return error;
- }
-
- /* Are we done ? */
- if (item_event == NULL) break;
-
- /* Skip headers */
- if (col_get_item_type(item_event) == COL_TYPE_COLLECTION) continue;
-
- /* For each item in the event find an item in the set */
- error = col_bind_iterator(&it_set, cfg->set, COL_TRAVERSE_ONELEVEL);
- if (error) {
- TRACE_ERROR_NUMBER("Error bind iterator for set failed:", error);
- col_unbind_iterator(it_event);
- col_destroy_collection(lo);
- return error;
- }
-
- found = 0;
- while(1) {
- /* Loop through the event */
- error = col_iterate_collection(it_set, &item_set);
- if (error) {
- TRACE_ERROR_NUMBER("Error iterating set:", error);
- col_unbind_iterator(it_event);
- col_unbind_iterator(it_set);
- col_destroy_collection(lo);
- return error;
- }
-
- /* Are we done ? */
- if (item_set == NULL) break;
-
- /* Skip headers */
- if (col_get_item_type(item_set) == COL_TYPE_COLLECTION) continue;
-
- /* Hashes should match and the data in the set should be NULL,
- * and legths should be same.
- */
- (void)col_get_item_property(item_event, &len1);
- (void)col_get_item_property(item_set, &len2);
-
- if ((col_get_item_hash(item_event) == col_get_item_hash(item_set)) &&
- (*((struct collection_item **)(col_get_item_data(item_set))) == NULL) &&
- (len1 == len2)) {
- /* This is a candidate for match - compare strings */
- TRACE_INFO_STRING("Found a good candidate for match.","");
- TRACE_INFO_STRING("Set item:", col_get_item_property(item_set, NULL));
- TRACE_INFO_STRING("Event:", col_get_item_property(item_event, NULL));
-
- if (strncasecmp(col_get_item_property(item_set, NULL),
- col_get_item_property(item_event, NULL),
- len1) == 0) {
- TRACE_INFO_STRING("Match found!","");
- TRACE_INFO_STRING("Set item:", col_get_item_property(item_set, NULL));
- TRACE_INFO_STRING("Event:", col_get_item_property(item_event, NULL));
-
- *((struct collection_item **)(col_get_item_data(item_set))) = item_event;
- found = 1;
- break;
- }
- }
- }
- /* Done with the set */
- col_unbind_iterator(it_set);
-
- /* Is it a leftover ? */
- if ((!found) && (cfg->use_leftovers)) {
- /* We need to put it in the leftovers pile */
- /* To save time and space we do not care about property name.
- * The property name is going to be in the referenced item.
- */
- error = col_add_binary_property(lo,
- NULL,
- "",
- (void *)(&item_event),
- sizeof(struct collection_item *));
- if (error) {
- TRACE_ERROR_NUMBER("Error addding item to leftovers:", error);
- col_unbind_iterator(it_event);
- col_destroy_collection(lo);
- return error;
- }
- }
- }
-
- /* Done with the event */
- col_unbind_iterator(it_event);
-
- /* Save leftovers if any */
- *leftovers = lo;
-
- TRACE_FLOW_STRING("file_spserialized_lo->bufferlit_by_set", "Exit");
- return error;
-}
-
-/* Function to serialize one item */
-static int file_serialize_item(struct elapi_data_out *out_data,
- int type,
- int length,
- void *data,
- uint32_t mode,
- void *mode_cfg)
-{
- int error = EOK;
- TRACE_FLOW_STRING("file_serialize_item", "Entry");
-
- switch(mode) {
- case FILE_MODE_CSV:
- error = file_serialize_csv(out_data,
- type,
- length,
- data,
- mode_cfg);
- break;
-/* FIXME : add other iterative formats later */
-/*
- case FILE_MODE_HTML:
- error = file_serialize_html(out_data,
- type,
- length,
- data,
- mode_cfg);
- break;
- case FILE_MODE_XML:
- error = file_serialize_xml(out_data,
- type,
- length,
- data,
- mode_cfg);
- break;
- case FILE_MODE_JSON:
- error = file_serialize_json(out_data,
- type,
- length,
- data,
- mode_cfg);
- break;
- case FILE_MODE_KVP:
- error = file_serialize_kvp(out_data,
- type,
- length,
- data,
- mode_cfg);
- break;
-*/
- default:
- TRACE_ERROR_STRING("Unsupported mode", "Fatal error!");
- error = EINVAL;
-
- }
-
- TRACE_FLOW_STRING("file_serialize_item", "Exit");
- return error;
-
-}
-
-
-
-/* Function to serialize the list */
-static int file_serialize_list(struct elapi_data_out **out_data,
- int append,
- int reference,
- struct collection_item *input,
- uint32_t mode,
- void *mode_cfg)
-{
- int error = EOK;
- struct elapi_data_out *allocated = NULL;
- struct elapi_data_out *to_use = NULL;
- struct collection_iterator *iterator;
- struct collection_item *item;
-
- TRACE_FLOW_STRING("file_serialize_list", "Entry");
-
- /* Allocate storage if we are not appending */
- if (!append) {
- error = elapi_alloc_serialized_data(&allocated);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to allocated serialized data", error);
- return error;
- }
- TRACE_INFO_STRING("Allocated new out data", "");
- to_use = allocated;
- }
- else {
- TRACE_INFO_STRING("Appening, use passed in output data", "");
- to_use = *out_data;
- }
-
- /* FIXME: This logic works for iterative formats only. */
- /* When we implement the free form format this
- * logic should be augmented. */
-
-#ifdef ELAPI_VERBOSE
- /* FIXME: remove when stable */
- col_debug_collection(input, COL_TRAVERSE_FLAT);
-#endif
-
-
- /* Start iterating */
- error = col_bind_iterator(&iterator, input, COL_TRAVERSE_FLAT);
- if (error) {
- TRACE_ERROR_NUMBER("Error bind iterator failed:", error);
- return error;
- }
-
- while(1) {
- /* Loop through the collection */
- error = col_iterate_collection(iterator, &item);
- if (error) {
- TRACE_ERROR_NUMBER("Error iterating event:", error);
- col_unbind_iterator(iterator);
- /* Free allocated data if we allocated it */
- elapi_free_serialized_data(allocated);
- return error;
- }
-
- /* Are we done ? */
- if (item == NULL) break;
-
- /* Skip headers */
- if (col_get_item_type(item) == COL_TYPE_COLLECTION) continue;
-
- /* Got item */
- if (reference) {
- /* Derefernce the item before using */
- item = *((struct collection_item **)(col_get_item_data(item)));
- }
-
- if (item) {
- TRACE_ERROR_NUMBER("Item property", col_get_item_property(item, NULL));
-
- /* Serialize this item */
- error = file_serialize_item(to_use,
- col_get_item_type(item),
- col_get_item_length(item),
- col_get_item_data(item),
- mode,
- mode_cfg);
- }
- else {
- /* Serialize this item */
- error = file_serialize_item(to_use,
- COL_TYPE_BINARY,
- 0,
- NULL,
- mode,
- mode_cfg);
- }
-
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize item", error);
- col_unbind_iterator(iterator);
- /* Free allocated data if we allocated it */
- elapi_free_serialized_data(allocated);
- return error;
- }
- }
- col_unbind_iterator(iterator);
-
- *out_data = to_use;
-
- TRACE_FLOW_STRING("file_serialize_list", "Exit");
- return error;
-}
-
-/* Function to log event into sink */
-int file_prep_data(struct elapi_data_out **out_data,
- struct file_prvdr_ctx *ctx,
- struct collection_item *event)
-{
- int error = EOK;
- struct elapi_data_out *serialized = NULL;
- struct elapi_data_out *serialized_lo = NULL;
- struct collection_item *leftovers = NULL;
-
- TRACE_FLOW_STRING("file_prep_data", "Entry");
-
- /* Do we need to split the data into two parts by set ? */
- if (ctx->config.set) {
- /* Split collection based on the configured set of fields */
- error = file_split_by_set(&leftovers,
- &(ctx->config),
- event);
- if (error) {
- TRACE_ERROR_NUMBER("Split collection returned error", error);
- return error;
- }
-
- /* Serialize main items */
- error = file_serialize_list(&serialized,
- FILE_SER_NEW,
- FILE_ITEM_REF,
- ctx->config.set,
- ctx->config.outmode,
- ctx->config.main_fmt_cfg);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize main set", error);
- col_destroy_collection(leftovers);
- return error;
- }
-
- if (ctx->config.use_leftovers) {
- /* Do we have to jam leftovers? */
- if (ctx->config.jam_leftovers) {
- /* Serialise leftovers into one field */
- error = file_serialize_list(&serialized_lo,
- FILE_SER_NEW,
- FILE_ITEM_REF,
- leftovers,
- ctx->config.mode_leftovers,
- ctx->config.lo_fmt_cfg);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize main set", error);
- col_destroy_collection(leftovers);
- elapi_free_serialized_data(serialized);
- return error;
- }
-
- /* Check if we go anything */
- if (serialized_lo->length) {
- /* Append leftovers item */
- error = file_serialize_item(serialized,
- COL_TYPE_STRING,
- serialized_lo->length + 1,
- serialized_lo->buffer,
- ctx->config.outmode,
- ctx->config.main_fmt_cfg);
- }
- else {
- /* Put empty item */
- error = file_serialize_item(serialized,
- COL_TYPE_BINARY,
- 0,
- NULL,
- ctx->config.outmode,
- ctx->config.main_fmt_cfg);
- }
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize main set", error);
- col_destroy_collection(leftovers);
- elapi_free_serialized_data(serialized);
- elapi_free_serialized_data(serialized_lo);
- return error;
- }
-
- /* Done with the jammed leftovers */
- elapi_free_serialized_data(serialized_lo);
- }
- else {
- /* Leftovers are added as normal fields */
- error = file_serialize_list(&serialized,
- FILE_SER_APPEND,
- FILE_ITEM_REF,
- leftovers,
- ctx->config.outmode,
- ctx->config.main_fmt_cfg);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize main set", error);
- col_destroy_collection(leftovers);
- elapi_free_serialized_data(serialized);
- return error;
- }
- }
- /* Do not need leftovers */
- col_destroy_collection(leftovers);
- }
- }
- else {
- /* No set is defined - the whole event is processed */
- error = file_serialize_list(&serialized,
- FILE_SER_NEW,
- FILE_ITEM_DIRECT,
- event,
- ctx->config.outmode,
- ctx->config.main_fmt_cfg);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to serialize event", error);
- return error;
- }
- }
-
- *out_data = serialized;
-
- TRACE_FLOW_STRING("file_prep_data", "Exit");
- return error;
-
-}