diff options
Diffstat (limited to 'res/res_phoneprov.c')
-rw-r--r-- | res/res_phoneprov.c | 75 |
1 files changed, 51 insertions, 24 deletions
diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c index 38111ffae..5e658f5e5 100644 --- a/res/res_phoneprov.c +++ b/res/res_phoneprov.c @@ -172,6 +172,7 @@ static char global_default_profile[80] = ""; /*!< Default profile to use if one /*! \brief List of global variables currently available: VOICEMAIL_EXTEN, EXTENSION_LENGTH */ static struct varshead global_variables; +static ast_mutex_t globals_lock; /*! \brief Return mime type based on extension */ static char *ftype2mtype(const char *ftype) @@ -665,12 +666,14 @@ static void build_profile(const char *name, struct ast_variable *v) /* Append the global variables to the variables list for this profile. * This is for convenience later, when we need to provide a single * variable list for use in substitution. */ + ast_mutex_lock(&globals_lock); AST_LIST_TRAVERSE(&global_variables, var, entries) { struct ast_var_t *new_var; if ((new_var = ast_var_assign(var->name, var->value))) { AST_LIST_INSERT_TAIL(profile->headp, new_var, entries); } } + ast_mutex_unlock(&globals_lock); ao2_link(profiles, profile); @@ -890,10 +893,11 @@ static int build_user_routes(struct user *user) /* \brief Parse config files and create appropriate structures */ static int set_config(void) { - struct ast_config *cfg; + struct ast_config *cfg, *phoneprov_cfg; char *cat; struct ast_variable *v; struct ast_flags config_flags = { 0 }; + struct ast_var_t *var; /* Try to grab the port from sip.conf. If we don't get it here, we'll set it * to whatever is set in phoneprov.conf or default to 5060 */ @@ -902,15 +906,37 @@ static int set_config(void) ast_config_destroy(cfg); } - if (!(cfg = ast_config_load("phoneprov.conf", config_flags))) { + if (!(cfg = ast_config_load("users.conf", config_flags))) { + ast_log(LOG_WARNING, "Unable to load users.cfg\n"); + return 0; + } + + /* Go ahead and load global variables from users.conf so we can append to profiles */ + for (v = ast_variable_browse(cfg, "general"); v; v = v->next) { + if (!strcasecmp(v->name, "vmexten")) { + if ((var = ast_var_assign("VOICEMAIL_EXTEN", v->value))) { + ast_mutex_lock(&globals_lock); + AST_LIST_INSERT_TAIL(&global_variables, var, entries); + ast_mutex_unlock(&globals_lock); + } + } + if (!strcasecmp(v->name, "localextenlength")) { + if ((var = ast_var_assign("EXTENSION_LENGTH", v->value))) + ast_mutex_lock(&globals_lock); + AST_LIST_INSERT_TAIL(&global_variables, var, entries); + ast_mutex_unlock(&globals_lock); + } + } + + if (!(phoneprov_cfg = ast_config_load("phoneprov.conf", config_flags))) { ast_log(LOG_ERROR, "Unable to load config phoneprov.conf\n"); return -1; } cat = NULL; - while ((cat = ast_category_browse(cfg, cat))) { + while ((cat = ast_category_browse(phoneprov_cfg, cat))) { if (!strcasecmp(cat, "general")) { - for (v = ast_variable_browse(cfg, cat); v; v = v->next) { + for (v = ast_variable_browse(phoneprov_cfg, cat); v; v = v->next) { if (!strcasecmp(v->name, "serveraddr")) ast_copy_string(global_server, v->value, sizeof(global_server)); else if (!strcasecmp(v->name, "serveriface")) { @@ -923,15 +949,10 @@ static int set_config(void) ast_copy_string(global_default_profile, v->value, sizeof(global_default_profile)); } } else - build_profile(cat, ast_variable_browse(cfg, cat)); + build_profile(cat, ast_variable_browse(phoneprov_cfg, cat)); } - ast_config_destroy(cfg); - - if (!(cfg = ast_config_load("users.conf", config_flags))) { - ast_log(LOG_WARNING, "Unable to load users.cfg\n"); - return 0; - } + ast_config_destroy(phoneprov_cfg); cat = NULL; while ((cat = ast_category_browse(cfg, cat))) { @@ -939,19 +960,9 @@ static int set_config(void) struct user *user; struct phone_profile *profile; struct extension *exten; - struct ast_var_t *var; if (!strcasecmp(cat, "general")) { - for (v = ast_variable_browse(cfg, cat); v; v = v->next) { - if (!strcasecmp(v->name, "vmexten")) { - if ((var = ast_var_assign("VOICEMAIL_EXTEN", v->value))) - AST_LIST_INSERT_TAIL(&global_variables, var, entries); - } - if (!strcasecmp(v->name, "localextenlength")) { - if ((var = ast_var_assign("EXTENSION_LENGTH", v->value))) - AST_LIST_INSERT_TAIL(&global_variables, var, entries); - } - } + continue; } if (!strcasecmp(cat, "authentication")) @@ -971,7 +982,6 @@ static int set_config(void) continue; } - if (!(user = find_user(mac))) { if (!(profile = find_profile(tmp))) { ast_log(LOG_WARNING, "Could not look up profile '%s' - skipping.\n", tmp); @@ -1140,6 +1150,8 @@ static int pp_each_extension_exec(struct ast_channel *chan, const char *cmd, cha ast_build_string(&buf, &len, "%s", expand_buf); } + ast_free(file); + user = unref_user(user); return 0; @@ -1220,6 +1232,7 @@ static int load_module(void) users = ao2_container_alloc(MAX_USER_BUCKETS, users_hash_fn, users_cmp_fn); AST_LIST_HEAD_INIT_NOLOCK(&global_variables); + ast_mutex_init(&globals_lock); ast_custom_function_register(&pp_each_user_function); ast_custom_function_register(&pp_each_extension_function); @@ -1247,17 +1260,31 @@ static int unload_module(void) ao2_ref(http_routes, -1); ao2_ref(users, -1); - while ((var = AST_LIST_REMOVE_HEAD(&global_variables, entries))) + ast_mutex_lock(&globals_lock); + while ((var = AST_LIST_REMOVE_HEAD(&global_variables, entries))) { ast_var_delete(var); + } + ast_mutex_unlock(&globals_lock); + + ast_mutex_destroy(&globals_lock); return 0; } static int reload(void) { + struct ast_var_t *var; + delete_routes(); delete_users(); delete_profiles(); + + ast_mutex_lock(&globals_lock); + while ((var = AST_LIST_REMOVE_HEAD(&global_variables, entries))) { + ast_var_delete(var); + } + ast_mutex_unlock(&globals_lock); + set_config(); return 0; |