commit 813496d: [Minor] Allow to set include trace function
Vsevolod Stakhov
vsevolod at highsecure.ru
Thu Mar 7 16:07:03 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-03-07 15:29:14 +0000
URL: https://github.com/rspamd/rspamd/commit/813496dd02e73d00ca9936397c7a9bed5bcd61a3
[Minor] Allow to set include trace function
---
contrib/libucl/ucl.h | 35 ++++++++++++++++++++++++++++++++++-
contrib/libucl/ucl_internal.h | 4 +++-
contrib/libucl/ucl_util.c | 26 ++++++++++++++++++++++++++
3 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/contrib/libucl/ucl.h b/contrib/libucl/ucl.h
index 852a77cf1..f7f8354c5 100644
--- a/contrib/libucl/ucl.h
+++ b/contrib/libucl/ucl.h
@@ -1279,6 +1279,13 @@ UCL_EXTERN bool ucl_parser_pubkey_add (struct ucl_parser *parser,
UCL_EXTERN bool ucl_parser_set_filevars (struct ucl_parser *parser, const char *filename,
bool need_expand);
+/**
+ * Returns current file for the parser
+ * @param parser parser object
+ * @return current file or NULL if parsing memory
+ */
+UCL_EXTERN const char *ucl_parser_get_cur_file (struct ucl_parser *parser);
+
/**
* Defines special handler for certain types of data (identified by magic)
*/
@@ -1300,13 +1307,39 @@ struct ucl_parser_special_handler {
};
/**
- * Add special handler for a parser
+ * Add special handler for a parser, handles special sequences identified by magic
* @param parser parser structure
* @param handler handler structure
*/
UCL_EXTERN void ucl_parser_add_special_handler (struct ucl_parser *parser,
struct ucl_parser_special_handler *handler);
+/**
+ * Handler for include traces:
+ * @param parser parser object
+ * @param parent where include is done from
+ * @param args arguments to an include
+ * @param path path of the include
+ * @param pathlen length of the path
+ * @param user_data opaque userdata
+ */
+typedef void (ucl_include_trace_func_t) (struct ucl_parser *parser,
+ const ucl_object_t *parent,
+ const ucl_object_t *args,
+ const char *path,
+ size_t pathlen,
+ void *user_data);
+
+/**
+ * Register trace function for an include handler
+ * @param parser parser object
+ * @param func function to trace includes
+ * @param user_data opaque data
+ */
+UCL_EXTERN void ucl_parser_set_include_tracer (struct ucl_parser *parser,
+ ucl_include_trace_func_t func,
+ void *user_data);
+
/** @} */
/**
diff --git a/contrib/libucl/ucl_internal.h b/contrib/libucl/ucl_internal.h
index 8c16dce8b..ed4a7d767 100644
--- a/contrib/libucl/ucl_internal.h
+++ b/contrib/libucl/ucl_internal.h
@@ -255,7 +255,9 @@ struct ucl_parser {
struct ucl_stack *stack;
struct ucl_chunk *chunks;
struct ucl_pubkey *keys;
- struct ucl_parser_special_handler *special_handlers;
+ struct ucl_parser_special_handler *special_handlers;
+ ucl_include_trace_func_t *include_trace_func;
+ void *include_trace_ud;
struct ucl_variable *variables;
ucl_variable_handler var_handler;
void *var_data;
diff --git a/contrib/libucl/ucl_util.c b/contrib/libucl/ucl_util.c
index 051ac2c27..fdd0862cc 100644
--- a/contrib/libucl/ucl_util.c
+++ b/contrib/libucl/ucl_util.c
@@ -1490,6 +1490,17 @@ ucl_include_common (const unsigned char *data, size_t len,
params.strat = UCL_DUPLICATE_APPEND;
params.must_exist = !default_try;
+ if (parser->include_trace_func) {
+ const ucl_object_t *parent = NULL;
+
+ if (parser->stack) {
+ parent = parser->stack->obj;
+ }
+
+ parser->include_trace_func (parser, parent, args,
+ data, len, parser->include_trace_ud);
+ }
+
/* Process arguments */
if (args != NULL && args->type == UCL_OBJECT) {
while ((param = ucl_object_iterate (args, &it, true)) != NULL) {
@@ -3840,3 +3851,18 @@ ucl_comments_add (ucl_object_t *comments, const ucl_object_t *obj,
(const char *)&obj, sizeof (void *), true);
}
}
+
+void
+ucl_parser_set_include_tracer (struct ucl_parser *parser,
+ ucl_include_trace_func_t func,
+ void *user_data)
+{
+ parser->include_trace_func = func;
+ parser->include_trace_ud = user_data;
+}
+
+const char *
+ucl_parser_get_cur_file (struct ucl_parser *parser)
+{
+ return parser->cur_file;
+}
\ No newline at end of file
More information about the Commits
mailing list