summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/ulogd/ulogd.h1
-rw-r--r--output/ulogd_output_OPRINT.c42
-rw-r--r--src/ulogd.c45
3 files changed, 53 insertions, 35 deletions
diff --git a/include/ulogd/ulogd.h b/include/ulogd/ulogd.h
index 7e71ca7..a8628db 100644
--- a/include/ulogd/ulogd.h
+++ b/include/ulogd/ulogd.h
@@ -217,6 +217,7 @@ void __ulogd_log(int level, char *file, int line, const char *message, ...);
#define SET_NEEDED(x) (x.flags |= ULOGD_RETF_NEEDED)
int ulogd_key_size(struct ulogd_key *key);
+int ulogd_wildcard_inputkeys(struct ulogd_pluginstance *upi);
/***********************************************************************
* file descriptor handling
diff --git a/output/ulogd_output_OPRINT.c b/output/ulogd_output_OPRINT.c
index e8b8d0e..07364b6 100644
--- a/output/ulogd_output_OPRINT.c
+++ b/output/ulogd_output_OPRINT.c
@@ -137,43 +137,15 @@ static void sighup_handler_print(struct ulogd_pluginstance *upi, int signal)
static int oprint_configure(struct ulogd_pluginstance *upi,
struct ulogd_pluginstance_stack *stack)
{
- struct ulogd_pluginstance *pi_cur;
- unsigned int num_keys = 0;
- unsigned int index = 0;
-
- /* ok, this is a bit tricky, and probably requires some documentation.
- * Since we are a output plugin (SINK), we can only be the last one
- * in the stack. Therefore, all other (input/filter) plugins, area
- * already linked into the stack. This means, we can iterate over them,
- * get a list of all the keys, and create one input key for every output
- * key that any of the upstream plugins provide. By the time we resolve
- * the inter-key pointers, everything will work as expected. */
-
- /* first pass: count keys */
- llist_for_each_entry(pi_cur, &stack->list, list) {
- ulogd_log(ULOGD_DEBUG, "iterating over pluginstance '%s'\n",
- pi_cur->id);
- num_keys += pi_cur->plugin->output.num_keys;
- }
-
- ulogd_log(ULOGD_DEBUG, "allocating %u input keys\n", num_keys);
- upi->input.keys = malloc(sizeof(struct ulogd_key) * num_keys);
- if (!upi->input.keys)
- return -ENOMEM;
-
- /* second pass: copy key names */
- llist_for_each_entry(pi_cur, &stack->list, list) {
- struct ulogd_key *cur;
- int i;
-
- for (i = 0; i < pi_cur->plugin->output.num_keys; i++)
- upi->input.keys[index++] = pi_cur->output.keys[i];
- }
+ int ret;
- config_parse_file(upi->id, upi->config_kset);
+ ret = ulogd_wildcard_inputkeys(upi);
+ if (ret < 0)
+ return ret;
- /* the count needs to be per-instance */
- upi->input.num_keys = num_keys;
+ ret = config_parse_file(upi->id, upi->config_kset);
+ if (ret < 0)
+ return ret;
return 0;
}
diff --git a/src/ulogd.c b/src/ulogd.c
index f10a008..1acfa33 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -180,6 +180,51 @@ int ulogd_key_size(struct ulogd_key *key)
return ret;
}
+int ulogd_wildcard_inputkeys(struct ulogd_pluginstance *upi)
+{
+ struct ulogd_pluginstance_stack *stack = upi->stack;
+ struct ulogd_pluginstance *pi_cur;
+ unsigned int num_keys = 0;
+ unsigned int index = 0;
+
+ /* ok, this is a bit tricky, and probably requires some documentation.
+ * Since we are a output plugin (SINK), we can only be the last one
+ * in the stack. Therefore, all other (input/filter) plugins, area
+ * already linked into the stack. This means, we can iterate over them,
+ * get a list of all the keys, and create one input key for every output
+ * key that any of the upstream plugins provide. By the time we resolve
+ * the inter-key pointers, everything will work as expected. */
+
+ if (upi->input.keys)
+ free(upi->input.keys);
+
+ /* first pass: count keys */
+ llist_for_each_entry(pi_cur, &stack->list, list) {
+ ulogd_log(ULOGD_DEBUG, "iterating over pluginstance '%s'\n",
+ pi_cur->id);
+ num_keys += pi_cur->plugin->output.num_keys;
+ }
+
+ ulogd_log(ULOGD_DEBUG, "allocating %u input keys\n", num_keys);
+ upi->input.keys = malloc(sizeof(struct ulogd_key) * num_keys);
+ if (!upi->input.keys)
+ return -ENOMEM;
+
+ /* second pass: copy key names */
+ llist_for_each_entry(pi_cur, &stack->list, list) {
+ struct ulogd_key *cur;
+ int i;
+
+ for (i = 0; i < pi_cur->plugin->output.num_keys; i++)
+ upi->input.keys[index++] = pi_cur->output.keys[i];
+ }
+
+ upi->input.num_keys = num_keys;
+
+ return 0;
+}
+
+
/***********************************************************************
* PLUGIN MANAGEMENT
***********************************************************************/