summaryrefslogtreecommitdiffstats
path: root/common/elapi/elapi_priv.h
blob: 0fa01b406a6b30594cf40170132defe2a0250e61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
    ELAPI

    Private header file continaing internal data for the ELAPI interface.

    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/>.
*/

#ifndef ELAPI_PRIV_H
#define ELAPI_PRIV_H

#include <stdint.h>

#include "collection.h"
#include "elapi_async.h"
/* Classes of the collections used by ELAPI internally */
#define COL_CLASS_ELAPI_BASE        21000
#define COL_CLASS_ELAPI_EVENT       COL_CLASS_ELAPI_BASE + 0
#define COL_CLASS_ELAPI_TEMPLATE    COL_CLASS_ELAPI_BASE + 1
#define COL_CLASS_ELAPI_SINK        COL_CLASS_ELAPI_BASE + 2
#define COL_CLASS_ELAPI_TARGET      COL_CLASS_ELAPI_BASE + 3
#define COL_CLASS_ELAPI_SINK_REF    COL_CLASS_ELAPI_BASE + 4

/* Names for the collections */
#define E_TEMPLATE_NAME "template"
#define E_EVENT_NAME "event"

/* Constants used in INI file and in
 * the internal collection objects.
 */
#define ELAPI_DISPATCHER    "dispatcher"
#define ELAPI_SINKS         "sinks"
#define ELAPI_TARGETS       "targets"
#define ELAPI_SINK_REFS     "srefs"
#define ELAPI_TARGET_VALUE  "value"
#define ELAPI_SINK_PROVIDER "provider"

#define ELAPI_TARGET_ALL    0xFFFF  /* 65k targets should be enough */

struct elapi_dispatcher {
    /* Application name */
    char *appname;
    /* List of target names and chars */
    char **targets;
    /* Collection of targets */
    struct collection_item *target_list;
    /* Counter of the targets */
    int target_counter;
    /* Collection of sinks */
    struct collection_item *sink_list;
    /* Configuration */
    struct collection_item *ini_config;
    /* Default event template */
    struct collection_item *default_template;
    /* Async processing related data */
    elapi_add_fd add_fd_add_fn;
    elapi_rem_fd add_fd_rem_fn;
    elapi_add_timer add_timer_fn;
    void *callers_data;
    uint32_t async_mode;
};

/* Structure to pass data from logging function to targets */
struct elapi_target_pass_in_data {
    struct collection_item *event;
    struct elapi_dispatcher *handle;
    uint32_t target_mask;
};

/* This is a structure that holds the information
 *  about the target.
 */
struct elapi_target_context {
    /* Value associted with the
     * target in the config file.
     */
    uint32_t target_value;
    /* Collection of pointers to sink objects */
    struct collection_item *sink_ref_list;
    /* FIXME - other things that belong here are:
     * state of the chain
     * reference to the current sink
     * reference to the preferred sink
     * etc.
     */
};

/* The structure that describes the sink in the dispatcher */
struct elapi_sink_context {
    /* Inpit queue of a sink */
    struct collection_item *in_queue;
    /* Pending list */
    struct collection_item *pending;
    /* FIXME: add:
     * sink's error status
     * sink's common config data (common between all sinks)
     * sink personal specific config data (config data specific to this sink)
     */
    /* Is this a sink or async sink */
    uint32_t async_mode;
};

/* The structure to hold a command and a result of the command execution */
struct elapi_get_sink {
    int action;
    int found;
};

/* Function to create event using arg list */
int elapi_create_event_with_vargs(struct collection_item **event,
                                  struct collection_item *template,
                                  struct collection_item *collection,
                                  int mode, va_list args);

/* Function to create event template using arg list */
int elapi_create_event_template_with_vargs(struct collection_item **template,
                                           unsigned base,
                                           va_list args);

/* Sink handler function */
int elapi_internal_sink_handler(const char *sink,
                                int sink_len,
                                int type,
                                void *data,
                                int length,
                                void *passed_data,
                                int *stop);

/* Internal sink cleanup function */
int elapi_internal_sink_cleanup_handler(const char *sink,
                                        int sink_len,
                                        int type,
                                        void *data,
                                        int length,
                                        void *passed_data,
                                        int *stop);


/* Create list of the sinks */
int elapi_internal_construct_sink_list(struct elapi_dispatcher *handle);

/* Function to add a sink based on configuration  */
int elapi_internal_add_sink(struct collection_item **sink_ref,
                            char *sink,
                            struct elapi_dispatcher *handle);

/* Create target object */
int elapi_internal_create_target(struct elapi_target_context **context,
                                 char *target,
                                 struct elapi_dispatcher *handle);

/* Destroy target object */
void elapi_internal_destroy_target(struct elapi_target_context *context);

/* Internal target cleanup function */
int elapi_internal_target_cleanup_handler(const char *sink,
                                          int sink_len,
                                          int type,
                                          void *data,
                                          int length,
                                          void *passed_data,
                                          int *stop);

/* Handler for logging through the targets */
int elapi_internal_target_handler(const char *target,
                                  int target_len,
                                  int type,
                                  void *data,
                                  int length,
                                  void *passed_data,
                                  int *stop);

/* Create list of targets for a dispatcher */
int elapi_internal_construct_target_list(struct elapi_dispatcher *handle);

/* Send ELAPI config errors into a file */
void elapi_internal_dump_errors_to_file(struct collection_item *error_list);

/* Print dispatcher internals for testing and debugin purposes */
void elapi_internal_print_dispatcher(struct elapi_dispatcher *handle);


#endif