From: Vsevolod Stakhov Date: Sat, 19 Apr 2014 21:43:35 +0000 (+0100) Subject: Deprecate xml config utilities finally. X-Git-Tag: 0.7.0~319 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=baeb17562f47dc31610c0f65079c45a7e6ad44bb;p=rspamd.git Deprecate xml config utilities finally. --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c8eeed516..c8f4dfdcc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,7 +23,6 @@ SET(LIBRSPAMDSERVERSRC buffer.c cfg_utils.c cfg_rcl.c - cfg_xml.c dkim.c dns.c dynamic_cfg.c diff --git a/src/cfg_utils.c b/src/cfg_utils.c index a83f63573..3f31946f1 100644 --- a/src/cfg_utils.c +++ b/src/cfg_utils.c @@ -30,7 +30,6 @@ #include "filter.h" #include "settings.h" #include "classifiers/classifiers.h" -#include "cfg_xml.h" #include "lua/lua_common.h" #include "kvstorage_config.h" #include "map.h" @@ -666,25 +665,6 @@ check_worker_conf (struct config_file *cfg, struct worker_conf *c) return c; } -static GMarkupParser xml_parser = { - .start_element = rspamd_xml_start_element, - .end_element = rspamd_xml_end_element, - .passthrough = NULL, - .text = rspamd_xml_text, - .error = rspamd_xml_error, -}; - -static const char* -get_filename_extension (const char *filename) -{ - const char *dot_pos = strrchr (filename, '.'); - - if (dot_pos != NULL) { - return (dot_pos + 1); - } - - return NULL; -} static bool rspamd_include_map_handler (const guchar *data, gsize len, void* ud) @@ -749,13 +729,10 @@ read_rspamd_config (struct config_file *cfg, const gchar *filename, { struct stat st; gint fd; - gchar *data, *rcl; - const gchar *ext; - GMarkupParseContext *ctx; + gchar *data; GError *err = NULL; struct rspamd_rcl_section *top, *logger; - gboolean res, is_xml = FALSE; - struct rspamd_xml_userdata ud; + gboolean res; struct ucl_parser *parser; if (stat (filename, &st) == -1) { @@ -774,67 +751,25 @@ read_rspamd_config (struct config_file *cfg, const gchar *filename, return FALSE; } close (fd); - - if (convert_to != NULL) { - is_xml = TRUE; - } - else { - ext = get_filename_extension (filename); - if (ext != NULL && strcmp (ext, "xml") == 0) { - is_xml = TRUE; - } - } - - if (is_xml) { - /* Prepare xml parser */ - memset (&ud, 0, sizeof (ud)); - ud.cfg = cfg; - ud.state = 0; - ctx = g_markup_parse_context_new (&xml_parser, G_MARKUP_TREAT_CDATA_AS_TEXT, &ud, NULL); - res = g_markup_parse_context_parse (ctx, data, st.st_size, &err); - munmap (data, st.st_size); - } - else { - parser = ucl_parser_new (0); - rspamd_ucl_add_conf_variables (parser); - rspamd_ucl_add_conf_macros (parser, cfg); - if (!ucl_parser_add_chunk (parser, data, st.st_size)) { - msg_err ("ucl parser error: %s", ucl_parser_get_error (parser)); - ucl_parser_free (parser); - munmap (data, st.st_size); - return FALSE; - } - munmap (data, st.st_size); - cfg->rcl_obj = ucl_parser_get_object (parser); + parser = ucl_parser_new (0); + rspamd_ucl_add_conf_variables (parser); + rspamd_ucl_add_conf_macros (parser, cfg); + if (!ucl_parser_add_chunk (parser, data, st.st_size)) { + msg_err ("ucl parser error: %s", ucl_parser_get_error (parser)); ucl_parser_free (parser); - res = TRUE; + munmap (data, st.st_size); + return FALSE; } + munmap (data, st.st_size); + cfg->rcl_obj = ucl_parser_get_object (parser); + ucl_parser_free (parser); + res = TRUE; if (!res) { return FALSE; } - if (is_xml && convert_to != NULL) { - /* Convert XML config to UCL */ - rcl = ucl_object_emit (cfg->rcl_obj, UCL_EMIT_CONFIG); - if (rcl != NULL) { - fd = open (convert_to, O_CREAT|O_TRUNC|O_WRONLY, 00644); - if (fd == -1) { - msg_err ("cannot open %s: %s", convert_to, strerror (errno)); - } - else if (write (fd, rcl, strlen (rcl)) == -1) { - msg_err ("cannot write rcl %s: %s", convert_to, strerror (errno)); - } - else { - msg_info ("dumped xml configuration %s to ucl configuration %s", - filename, convert_to); - } - close (fd); - free (rcl); - } - } - top = rspamd_rcl_config_init (); err = NULL; diff --git a/src/cfg_xml.c b/src/cfg_xml.c deleted file mode 100644 index e8f0207cb..000000000 --- a/src/cfg_xml.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (c) 2009-2012, Vsevolod Stakhov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Read and write rspamd dynamic parameters from xml files - */ - -#include "config.h" -#include "cfg_xml.h" -#include "main.h" -#include "logger.h" -#include "util.h" -#include "classifiers/classifiers.h" -#include "tokenizers/tokenizers.h" -#include "cfg_file.h" - -#include "view.h" -#include "map.h" -#include "expressions.h" -#include "settings.h" - -#include "lua/lua_common.h" - -enum xml_read_state { - XML_READ_START, - XML_READ_PARAM, - XML_READ_MODULE, - XML_READ_MODULE_META, - XML_READ_MODULES, - XML_READ_CLASSIFIER, - XML_READ_STATFILE, - XML_READ_METRIC, - XML_READ_WORKER, - XML_READ_VIEW, - XML_READ_LOGGING, - XML_READ_OPTIONS, - XML_READ_VALUE, - XML_SKIP_ELEMENTS, - XML_ERROR, - XML_SUBPARSER, - XML_END -}; - -/* Maximum attributes for param */ -#define MAX_PARAM 64 - -#define EOL "\n" - -GQuark -xml_error_quark (void) -{ - return g_quark_from_static_string ("xml-error-quark"); -} - -static inline const gchar * -xml_state_to_string (struct rspamd_xml_userdata *ud) -{ - switch (ud->state) { - case XML_READ_START: - return "read start tag"; - case XML_READ_PARAM: - return "read param"; - case XML_READ_MODULE: - return "read module section"; - case XML_READ_MODULE_META: - return "read module meta section"; - case XML_READ_OPTIONS: - return "read options section"; - case XML_READ_MODULES: - return "read modules section"; - case XML_READ_CLASSIFIER: - return "read classifier section"; - case XML_READ_STATFILE: - return "read statfile section"; - case XML_READ_METRIC: - return "read metric section"; - case XML_READ_WORKER: - return "read worker section"; - case XML_READ_VIEW: - return "read view section"; - case XML_READ_LOGGING: - return "read logging section"; - case XML_READ_VALUE: - return "read value"; - case XML_SKIP_ELEMENTS: - return "skip if block"; - case XML_ERROR: - return "error occured"; - case XML_END: - return "read final tag"; - case XML_SUBPARSER: - return "subparser handle"; - } - /* Unreached */ - return "unknown state"; -} - -static inline gboolean -extract_attr (const gchar *attr, const gchar **attribute_names, const gchar **attribute_values, gchar **res) -{ - const gchar **cur_attr, **cur_value; - - cur_attr = attribute_names; - cur_value = attribute_values; - - while (*cur_attr && *cur_value) { - if (g_ascii_strcasecmp (*cur_attr, attr) == 0) { - *res = (gchar *) *cur_value; - return TRUE; - } - cur_attr ++; - cur_value ++; - } - - return FALSE; -} - - -/* Find among attributes required ones and form new array of pairs attribute-value */ -static gboolean -process_attrs (const gchar **attribute_names, const gchar **attribute_values, ucl_object_t *top) -{ - const gchar **attr, **value; - gboolean res = FALSE; - - attr = attribute_names; - value = attribute_values; - while (*attr) { - /* Copy attributes to pool */ - top = ucl_object_insert_key (top, ucl_object_fromstring_common (*value, 0, UCL_STRING_PARSE), *attr, 0, TRUE); - attr ++; - value ++; - res = TRUE; - } - return res; -} - - -/* Handlers */ - -/* XML callbacks */ -void -rspamd_xml_start_element (GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, - const gchar **attribute_values, gpointer user_data, GError **error) -{ - struct rspamd_xml_userdata *ud = user_data; - gchar *res; - ucl_object_t *obj, *tobj; - - - switch (ud->state) { - case XML_READ_START: - if (g_ascii_strcasecmp (element_name, "rspamd") != 0) { - /* Invalid XML, it must contains root element */ - *error = g_error_new (xml_error_quark (), XML_START_MISSING, "start element is missing"); - ud->state = XML_ERROR; - } - else { - ud->state = XML_READ_PARAM; - } - break; - case XML_READ_PARAM: - /* Read parameter name and try to find among list of known parameters */ - /* Legacy XML support */ - if (g_ascii_strcasecmp (element_name, "param") == 0) { - if (extract_attr ("value", attribute_names, attribute_values, &res)) { - element_name = res; - } - else if (extract_attr ("name", attribute_names, attribute_values, &res)) { - element_name = res; - } - else { - *error = g_error_new (xml_error_quark (), XML_PARAM_MISSING, "attribute 'value' or 'name' are required for tag 'param'"); - ud->state = XML_ERROR; - } - } - - rspamd_strlcpy (ud->section_name[ud->nested], element_name, MAX_NAME); - if (ud->nested == 0) { - /* Top object */ - - if (g_ascii_strcasecmp (element_name, "lua") == 0 && - extract_attr ("src", attribute_names, attribute_values, &res)) { - /* Lua is 'special' tag */ - obj = ucl_object_fromstring (res); - ud->cfg->rcl_obj = ucl_object_insert_key (ud->cfg->rcl_obj, obj, element_name, 0, true); - ud->parent_pointer[0] = obj; - ud->nested ++; - } - else if (g_ascii_strcasecmp (element_name, "composite") == 0) { - /* Composite is 'special' tag */ - obj = ucl_object_new (); - obj->type = UCL_OBJECT; - ud->parent_pointer[0] = obj; - ud->cfg->rcl_obj = ucl_object_insert_key (ud->cfg->rcl_obj, obj, element_name, 0, true); - process_attrs (attribute_names, attribute_values, obj); - ud->nested ++; - rspamd_strlcpy (ud->section_name[ud->nested], "expression", MAX_NAME); - } - else if (g_ascii_strcasecmp (element_name, "module") == 0 && - extract_attr ("name", attribute_names, attribute_values, &res)) { - obj = ucl_object_new (); - obj->type = UCL_OBJECT; - ud->parent_pointer[0] = obj; - ud->cfg->rcl_obj = ucl_object_insert_key (ud->cfg->rcl_obj, obj, res, 0, true); - ud->nested ++; - } - else { - obj = ucl_object_new (); - obj->type = UCL_OBJECT; - ud->parent_pointer[0] = obj; - ud->cfg->rcl_obj = ucl_object_insert_key (ud->cfg->rcl_obj, obj, element_name, 0, true); - process_attrs (attribute_names, attribute_values, obj); - ud->nested ++; - } - } - else { - tobj = ucl_object_new (); - if (g_ascii_strcasecmp (element_name, "symbol") == 0 && - process_attrs (attribute_names, attribute_values, tobj)) { - ud->parent_pointer[ud->nested] = tobj; - tobj->type = UCL_OBJECT; - ud->parent_pointer[ud->nested - 1] = - ucl_object_insert_key (ud->parent_pointer[ud->nested - 1], tobj, element_name, 0, true); - ud->nested ++; - /* XXX: very ugly */ - rspamd_strlcpy (ud->section_name[ud->nested], "name", MAX_NAME); - } - else if (g_ascii_strcasecmp (element_name, "statfile") == 0) { - /* XXX: ugly as well */ - ud->parent_pointer[ud->nested] = tobj; - tobj->type = UCL_OBJECT; - ud->parent_pointer[ud->nested - 1] = - ucl_object_insert_key (ud->parent_pointer[ud->nested - 1], tobj, element_name, 0, true); - ud->nested ++; - } - else { - ucl_object_unref (tobj); - process_attrs (attribute_names, attribute_values, ud->parent_pointer[ud->nested - 1]); - } - } - break; - default: - if (*error == NULL) { - *error = g_error_new (xml_error_quark (), XML_EXTRA_ELEMENT, "element %s is unexpected in this state %s", - element_name, xml_state_to_string (ud)); - } - break; - } -} - - -void -rspamd_xml_end_element (GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) -{ - - struct rspamd_xml_userdata *ud = user_data; - - if (ud->nested > 0) { - if (g_ascii_strcasecmp (ud->section_name[ud->nested - 1], element_name) == 0) { - ud->nested --; - } - else if (g_ascii_strcasecmp (element_name, "param") == 0) { - /* Another ugly hack */ - ud->nested --; - } - else if (g_ascii_strcasecmp (ud->section_name[ud->nested], element_name) != 0) { - *error = g_error_new (xml_error_quark (), XML_EXTRA_ELEMENT, "element %s is unmatched", element_name); - ud->state = XML_ERROR; - } - } - else if (g_ascii_strcasecmp ("rspamd", element_name) != 0) { - *error = g_error_new (xml_error_quark (), XML_EXTRA_ELEMENT, "element %s is unmatched on the top level", element_name); - ud->state = XML_ERROR; - } -} -#undef CHECK_TAG - -void -rspamd_xml_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) -{ - struct rspamd_xml_userdata *ud = user_data; - ucl_object_t *top; - - while (text_len > 0 && g_ascii_isspace (*text)) { - text_len --; - text ++; - } - - if (text_len == 0) { - return; - } - - - top = ud->parent_pointer[ud->nested - 1]; - ud->parent_pointer[ud->nested - 1] = - ucl_object_insert_key (top, ucl_object_fromstring_common (text, text_len, - UCL_STRING_PARSE|UCL_STRING_PARSE_BYTES), - ud->section_name[ud->nested], 0, true); -} - -void -rspamd_xml_error (GMarkupParseContext *context, GError *error, gpointer user_data) -{ - struct rspamd_xml_userdata *ud = user_data; - - msg_err ("xml parser error: %s, at state \"%s\"", error->message, xml_state_to_string (ud)); -} diff --git a/src/cfg_xml.h b/src/cfg_xml.h deleted file mode 100644 index e9d2707b0..000000000 --- a/src/cfg_xml.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef RSPAMD_CFG_XML_H -#define RSPAMD_CFG_XML_H - -#include "config.h" -#include "cfg_file.h" - -#define MAX_NAME 128 - -#define XML_START_MISSING 1 -#define XML_PARAM_MISSING 2 -#define XML_EXTRA_ELEMENT 3 -#define XML_UNMATCHED_TAG 4 -#define XML_INVALID_ATTR 5 - -#define MAX_INHERIT 5 - -/** - * Structure that is used for semantic resolution of configuration - */ -struct rspamd_xml_userdata { - int state; /*< state of parser */ - struct config_file *cfg; /*< configuration object */ - gchar section_name[MAX_INHERIT][MAX_NAME]; /*< current section */ - gpointer section_pointer; /*< pointer to object related with section */ - gpointer parent_pointer[MAX_INHERIT]; /*< parent's section object */ - GHashTable *cur_attrs; /*< attributes of current tag */ - gint nested; -}; - - -/* Called for open tags */ -void rspamd_xml_start_element (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error); - -/* Called for close tags */ -void rspamd_xml_end_element (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error); - -/* text is not nul-terminated */ -void rspamd_xml_text (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error); - - -/* XML error quark for reporting errors */ -GQuark xml_error_quark (void); - -void rspamd_xml_error (GMarkupParseContext *context, GError *error, gpointer user_data); - -#endif diff --git a/src/controller.c b/src/controller.c index 92dd87d91..b1ba37162 100644 --- a/src/controller.c +++ b/src/controller.c @@ -29,7 +29,6 @@ #include "protocol.h" #include "upstream.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "map.h" #include "dns.h" #include "tokenizers/tokenizers.h" diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index 6a3e12a04..80f899216 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -32,7 +32,6 @@ #include "protocol.h" #include "upstream.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "url.h" #include "message.h" #include "fuzzy.h" diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c index acf3ae3be..878bb4ef1 100644 --- a/src/lua/lua_config.c +++ b/src/lua/lua_config.c @@ -30,7 +30,6 @@ #include "radix.h" #include "trie.h" #include "classifiers/classifiers.h" -#include "cfg_xml.h" /* Config file methods */ LUA_FUNCTION_DEF (config, get_module_opt); diff --git a/src/lua_worker.c b/src/lua_worker.c index 2bf4a9a9f..319242a3a 100644 --- a/src/lua_worker.c +++ b/src/lua_worker.c @@ -28,7 +28,6 @@ #include "protocol.h" #include "upstream.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "url.h" #include "message.h" #include "map.h" diff --git a/src/main.c b/src/main.c index e5c444a5b..83cf1c53a 100644 --- a/src/main.c +++ b/src/main.c @@ -31,7 +31,6 @@ #include "map.h" #include "fuzzy_storage.h" #include "kvstorage_server.h" -#include "cfg_xml.h" #include "symbols_cache.h" #include "lua/lua_common.h" #include "ottery.h" @@ -79,8 +78,6 @@ static gchar *rspamd_pidfile = NULL; static gboolean dump_cache = FALSE; static gboolean is_debug = FALSE; static gboolean is_insecure = FALSE; -static gchar *convert_config = FALSE; - /* List of workers that are pending to start */ static GList *workers_pending = NULL; @@ -107,7 +104,6 @@ static GOptionEntry entries[] = { "test-lua", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &lua_tests, "Specify lua file(s) to test", NULL }, { "sign-config", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &sign_configs, "Specify config file(s) to sign", NULL }, { "private-key", 0, 0, G_OPTION_ARG_FILENAME, &privkey, "Specify private key to sign", NULL }, - { "convert-config", 0, 0, G_OPTION_ARG_FILENAME, &convert_config, "Convert cnfiguration to UCL", NULL}, { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } }; @@ -774,7 +770,7 @@ load_rspamd_config (struct config_file *cfg, gboolean init_modules) struct filter *filt; struct module_ctx *cur_module = NULL; - if (! read_rspamd_config (cfg, cfg->cfg_name, convert_config, + if (! read_rspamd_config (cfg, cfg->cfg_name, NULL, config_logger, rspamd_main)) { return FALSE; } diff --git a/src/plugins/chartable.c b/src/plugins/chartable.c index 47b5efd7e..87f4c728e 100644 --- a/src/plugins/chartable.c +++ b/src/plugins/chartable.c @@ -37,7 +37,6 @@ #include "cfg_file.h" #include "expressions.h" #include "view.h" -#include "cfg_xml.h" #define DEFAULT_SYMBOL "R_CHARSET_MIXED" #define DEFAULT_THRESHOLD 0.1 diff --git a/src/plugins/dkim_check.c b/src/plugins/dkim_check.c index 225f781c0..29186e766 100644 --- a/src/plugins/dkim_check.c +++ b/src/plugins/dkim_check.c @@ -46,7 +46,6 @@ #include "view.h" #include "map.h" #include "dkim.h" -#include "cfg_xml.h" #include "hash.h" #define DEFAULT_SYMBOL_REJECT "R_DKIM_REJECT" diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index d1e55a678..d184d85ea 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -49,7 +49,6 @@ #include "map.h" #include "images.h" #include "fuzzy_storage.h" -#include "cfg_xml.h" #define DEFAULT_SYMBOL "R_FUZZY_HASH" #define DEFAULT_UPSTREAM_ERROR_TIME 10 diff --git a/src/plugins/regexp.c b/src/plugins/regexp.c index 6569dd150..298c03849 100644 --- a/src/plugins/regexp.c +++ b/src/plugins/regexp.c @@ -37,8 +37,6 @@ #include "view.h" #include "lua/lua_common.h" #include "json/jansson.h" -#include "cfg_xml.h" - #define DEFAULT_STATFILE_PREFIX "./" diff --git a/src/plugins/spf.c b/src/plugins/spf.c index 395313067..2a58021d3 100644 --- a/src/plugins/spf.c +++ b/src/plugins/spf.c @@ -41,7 +41,6 @@ #include "view.h" #include "map.h" #include "spf.h" -#include "cfg_xml.h" #include "hash.h" #define DEFAULT_SYMBOL_FAIL "R_SPF_FAIL" diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index 585e174fb..f26f7adc7 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -50,7 +50,6 @@ #include "view.h" #include "map.h" #include "dns.h" -#include "cfg_xml.h" #include "hash.h" #include "surbl.h" diff --git a/src/smtp_proxy.c b/src/smtp_proxy.c index 4d4bcf593..be978e936 100644 --- a/src/smtp_proxy.c +++ b/src/smtp_proxy.c @@ -24,7 +24,6 @@ #include "config.h" #include "main.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "util.h" #include "smtp_proto.h" #include "map.h" diff --git a/src/webui.c b/src/webui.c index 8b0fd8787..0a542993f 100644 --- a/src/webui.c +++ b/src/webui.c @@ -30,7 +30,6 @@ #include "protocol.h" #include "upstream.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "map.h" #include "dns.h" #include "tokenizers/tokenizers.h" diff --git a/src/worker.c b/src/worker.c index 36d441d07..ddeadbd8e 100644 --- a/src/worker.c +++ b/src/worker.c @@ -32,7 +32,6 @@ #include "protocol.h" #include "upstream.h" #include "cfg_file.h" -#include "cfg_xml.h" #include "url.h" #include "message.h" #include "map.h"