diff options
author | Terry Wilson <twilson@digium.com> | 2012-06-14 13:35:07 +0000 |
---|---|---|
committer | Terry Wilson <twilson@digium.com> | 2012-06-14 13:35:07 +0000 |
commit | 01307e4b7bbf01f2ff7e5a0a9e9047e7b5cd789f (patch) | |
tree | 0bf3e9762bc567605d08f304f2626080ad248417 | |
parent | 21997aa7bba8e2b2bc6fc6b01f0de4cc8ea56131 (diff) |
Add filename alias support to the Config Options API
This adds the ability to handle a single filename alias for a config
file. This is useful if a config filename has changed, but the old
filename should be supported for backwards compatibility.
Review: https://reviewboard.asterisk.org/r/1981/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@368920 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | include/asterisk/config_options.h | 6 | ||||
-rw-r--r-- | main/config_options.c | 12 |
2 files changed, 15 insertions, 3 deletions
diff --git a/include/asterisk/config_options.h b/include/asterisk/config_options.h index b697ecb54..3e4c4a5ca 100644 --- a/include/asterisk/config_options.h +++ b/include/asterisk/config_options.h @@ -136,9 +136,11 @@ typedef int (*aco_pre_apply_config)(void); */ typedef void *(*aco_snapshot_alloc)(void); +/*! \brief The representation of a single configuration file to be processed */ struct aco_file { - const char *filename; - const char **preload; + const char *filename; /*!< \brief The filename to be processed */ + const char *alias; /*!< \brief An alias filename to be tried if 'filename' cannot be found */ + const char **preload; /*!< \brief A null-terminated oredered array of categories to be loaded first */ struct aco_type *types[]; /*!< The list of types for this config. Required. Use a sentinel! */ }; diff --git a/main/config_options.c b/main/config_options.c index c8fb4ffad..7baf67836 100644 --- a/main/config_options.c +++ b/main/config_options.c @@ -434,7 +434,13 @@ enum aco_process_status aco_process_config(struct aco_info *info, int reload) } while (res != ACO_PROCESS_ERROR && (file = info->files[x++])) { - if (!(cfg = ast_config_load(file->filename, cfg_flags))) { + const char *filename = file->filename; +try_alias: + if (!(cfg = ast_config_load(filename, cfg_flags))) { + if (file->alias && strcmp(file->alias, filename)) { + filename = file->alias; + goto try_alias; + } ast_log(LOG_ERROR, "Unable to load config file '%s'\n", file->filename); res = ACO_PROCESS_ERROR; break; @@ -447,6 +453,10 @@ enum aco_process_status aco_process_config(struct aco_info *info, int reload) res = ACO_PROCESS_ERROR; break; } else if (cfg == CONFIG_STATUS_FILEMISSING) { + if (file->alias && strcmp(file->alias, filename)) { + filename = file->alias; + goto try_alias; + } ast_log(LOG_ERROR, "%s is missing! Cannot load %s\n", file->filename, info->module); res = ACO_PROCESS_ERROR; break; |