Instead of taking a string and compiling the template ourselves, take a LogTemplate instance instead. Signed-off-by: Balazs Scheidler <bazsi@balabit.hu> Signed-off-by: Gergely Nagy <algernon@balabit.hu> --- lib/cfg-grammar.y | 12 ++++++++++-- lib/value-pairs.c | 27 +++++++++++++++++---------- lib/value-pairs.h | 7 ++++--- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/lib/cfg-grammar.y b/lib/cfg-grammar.y index dc21f05..41830f5 100644 --- a/lib/cfg-grammar.y +++ b/lib/cfg-grammar.y @@ -1101,8 +1101,16 @@ vp_options ; vp_option - : KW_PAIR '(' string ':' string ')' { value_pairs_add_pair(last_value_pairs, configuration, $3, $5); free($3); free($5); } - | KW_PAIR '(' string string ')' { value_pairs_add_pair(last_value_pairs, configuration, $3, $4); free($3); free($4); } + : KW_PAIR '(' string ':' template_content ')' + { + value_pairs_add_pair(last_value_pairs, $3, $5); + free($3); + } + | KW_PAIR '(' string template_content ')' + { + value_pairs_add_pair(last_value_pairs, $3, $4); + free($3); + } | KW_KEY '(' string KW_REKEY '(' { last_vp_transset = value_pairs_transform_set_new($3); diff --git a/lib/value-pairs.c b/lib/value-pairs.c index ca76fd8..5fb3e8d 100644 --- a/lib/value-pairs.c +++ b/lib/value-pairs.c @@ -151,16 +151,15 @@ value_pairs_add_glob_pattern(ValuePairs *vp, const gchar *pattern, vp->patterns[i] = p; } -void -value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key, const gchar *value) +gboolean +value_pairs_add_pair(ValuePairs *vp, const gchar *key, LogTemplate *value) { VPPairConf *p = g_new(VPPairConf, 1); p->name = g_strdup(key); - p->template = log_template_new(cfg, NULL); - log_template_compile(p->template, value, NULL); - + p->template = log_template_ref(value); g_ptr_array_add(vp->vpairs, p); + return TRUE; } static gchar * @@ -739,6 +738,8 @@ vp_cmdline_parse_pair (const gchar *option_name, const gchar *value, ValuePairs *vp = (ValuePairs *) args[1]; GlobalConfig *cfg = (GlobalConfig *) args[0]; gchar **kv; + gboolean res = FALSE; + LogTemplate *template; vp_cmdline_parse_rekey_finish (data); if (!g_strstr_len (value, strlen (value), "=")) @@ -749,13 +750,19 @@ vp_cmdline_parse_pair (const gchar *option_name, const gchar *value, } kv = g_strsplit(value, "=", 2); - value_pairs_add_pair (vp, cfg, kv[0], kv[1]); - g_free (kv[0]); - g_free (kv[1]); - g_free (kv); + template = log_template_new(cfg, NULL); + if (!log_template_compile(template, kv[1], error)) + goto error; - return TRUE; + value_pairs_add_pair(vp, kv[0], template); + + res = TRUE; + error: + log_template_unref(template); + g_strfreev(kv); + + return res; } static ValuePairsTransformSet * diff --git a/lib/value-pairs.h b/lib/value-pairs.h index a6c9f34..b060d54 100644 --- a/lib/value-pairs.h +++ b/lib/value-pairs.h @@ -1,6 +1,6 @@ /* - * Copyright (c) 2011-2012 BalaBit IT Ltd, Budapest, Hungary - * Copyright (c) 2011-2012 Gergely Nagy <algernon@balabit.hu> + * Copyright (c) 2011-2013 BalaBit IT Ltd, Budapest, Hungary + * Copyright (c) 2011-2013 Gergely Nagy <algernon@balabit.hu> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -27,6 +27,7 @@ #include "syslog-ng.h" #include "nvtable.h" +#include "template/templates.h" typedef struct _ValuePairs ValuePairs; typedef gboolean (*VPForeachFunc)(const gchar *name, const gchar *value, gpointer user_data); @@ -41,7 +42,7 @@ typedef gboolean (*VPWalkCallbackFunc)(const gchar *name, gboolean value_pairs_add_scope(ValuePairs *vp, const gchar *scope); void value_pairs_add_glob_pattern(ValuePairs *vp, const gchar *pattern, gboolean include); -void value_pairs_add_pair(ValuePairs *vp, GlobalConfig *cfg, const gchar *key, const gchar *value); +gboolean value_pairs_add_pair(ValuePairs *vp, const gchar *key, LogTemplate *value); void value_pairs_add_transforms(ValuePairs *vp, gpointer vpts); -- 1.7.10.4