]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Allow to set include trace function
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Mar 2019 15:29:14 +0000 (15:29 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Mar 2019 15:29:14 +0000 (15:29 +0000)
contrib/libucl/ucl.h
contrib/libucl/ucl_internal.h
contrib/libucl/ucl_util.c

index 852a77cf125aaf7f07aa88c56c2b64602671cbb7..f7f8354c5586b36a92d7b8ce0ef9a5cbb68539fc 100644 (file)
@@ -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);
+
 /** @} */
 
 /**
index 8c16dce8b148375539b90587f2d4f9305719c26d..ed4a7d76778dd6badb9d8f9b3e3a0bfe8e5f1c7c 100644 (file)
@@ -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;
index 051ac2c27438ad709bba87d25c07ff2ca629ef4c..fdd0862cce5d9f9ed2efb448da7c923718c28ba8 100644 (file)
@@ -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