From: Joshua C. Colp Date: Tue, 19 May 2020 12:55:32 +0000 (-0300) Subject: res_sorcery_config: Always reload configuration on errors. X-Git-Tag: 17.5.0-rc1~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=441b614fa0cc74921bf9c3bf6b512b8f4e2d6b3d;p=thirdparty%2Fasterisk.git res_sorcery_config: Always reload configuration on errors. When a configuration file in Asterisk is loaded information about it is stored such that on a reload it is not reloaded if nothing has changed. This can be problematic when an error exists in a configuration file in PJSIP since the error will be output at start and not subsequently on reload if the file is unchanged. This change makes it so that if an error is encountered when res_sorcery_config is loading a configuration file a reload will always read in the configuration file, allowing the error to be seen easier. Change-Id: If2e05a017570f1f5f4f49120da09601e9ecdf9ed --- 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);