From befa445d01e0d7ef2f0cf5984fbbc58f9a87fa70 Mon Sep 17 00:00:00 2001 From: "/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org" Date: Thu, 15 Dec 2005 14:07:15 +0000 Subject: move plugin wildcard input key generation into core --- include/ulogd/ulogd.h | 1 + output/ulogd_output_OPRINT.c | 42 +++++++---------------------------------- src/ulogd.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ 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 ***********************************************************************/ -- cgit v1.2.3