diff --git a/res/res_sorcery_config.c b/res/res_sorcery_config.c index 602978924c..67679a2280 100644 --- a/res/res_sorcery_config.c +++ b/res/res_sorcery_config.c @@ -62,6 +62,9 @@ struct sorcery_config { /*! \brief Enable enforcement of a single configuration object of this type */ unsigned int single_object:1; + /*! \brief Configuration is invalid in some way, force reload */ + unsigned int configuration_invalid:1; + /*! \brief Filename of the configuration file */ char filename[]; }; @@ -310,7 +313,7 @@ static int sorcery_is_configuration_met(const struct ast_sorcery *sorcery, const static void sorcery_config_internal_load(void *data, const struct ast_sorcery *sorcery, const char *type, unsigned int reload) { struct sorcery_config *config = data; - struct ast_flags flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; + struct ast_flags flags = { reload && !config->configuration_invalid ? CONFIG_FLAG_FILEUNCHANGED : 0 }; struct ast_config *cfg = ast_config_load2(config->filename, config->uuid, flags); struct ast_category *category = NULL; RAII_VAR(struct ao2_container *, objects, NULL, ao2_cleanup); @@ -328,6 +331,9 @@ static void sorcery_config_internal_load(void *data, const struct ast_sorcery *s return; } + /* When parsing the configuration assume it is valid until proven otherwise */ + config->configuration_invalid = 0; + if (!config->buckets) { while ((category = ast_category_browse_filtered(cfg, NULL, category, NULL))) { @@ -361,6 +367,7 @@ static void sorcery_config_internal_load(void *data, const struct ast_sorcery *s ast_log(LOG_ERROR, "Config file '%s' could not be loaded; configuration contains more than one object of type '%s'\n", config->filename, type); ast_config_destroy(cfg); + config->configuration_invalid = 1; return; } @@ -373,6 +380,7 @@ static void sorcery_config_internal_load(void *data, const struct ast_sorcery *s ast_log(LOG_ERROR, "Could not create bucket for new objects from '%s', keeping existing objects\n", config->filename); ast_config_destroy(cfg); + config->configuration_invalid = 1; /* Not strictly invalid but we want to try next time */ return; } @@ -393,6 +401,7 @@ static void sorcery_config_internal_load(void *data, const struct ast_sorcery *s ast_log(LOG_ERROR, "Config file '%s' could not be loaded; configuration contains a duplicate object: '%s' of type '%s'\n", config->filename, id, type); ast_config_destroy(cfg); + config->configuration_invalid = 1; return; } @@ -403,10 +412,12 @@ static void sorcery_config_internal_load(void *data, const struct ast_sorcery *s ast_log(LOG_ERROR, "Config file '%s' could not be loaded due to error with object '%s' of type '%s'\n", config->filename, id, type); ast_config_destroy(cfg); + config->configuration_invalid = 1; return; } else { ast_log(LOG_ERROR, "Could not create an object of type '%s' with id '%s' from configuration file '%s'\n", type, id, config->filename); + config->configuration_invalid = 1; } ao2_cleanup(obj);