From b137a92aef5f08359f11bc7ea686cd361814f3b7 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 22 Dec 2014 00:17:49 +0000 Subject: [PATCH] res_pjsip_phoneprovi_provider: Fix reload Reloading wasn't working correctly because on a reload, the sorcery apply handler was never being called for unchanged users. So, instead of using an apply handler, I'm now iterating over all users. Works much more reliably. Tested-by: George Joseph Review: https://reviewboard.asterisk.org/r/4288/ ........ Merged revisions 429914 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@429915 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_pjsip_phoneprov_provider.c | 41 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/res/res_pjsip_phoneprov_provider.c b/res/res_pjsip_phoneprov_provider.c index 3b65940577..70dd99e067 100644 --- a/res/res_pjsip_phoneprov_provider.c +++ b/res/res_pjsip_phoneprov_provider.c @@ -285,15 +285,8 @@ static int load_endpoint(const char *id, const char *endpoint_name, struct varsh return 0; } -/*! \brief Callback that loads the users from phoneprov sections */ -static int load_users(void) -{ - ast_sorcery_reload_object(sorcery, "phoneprov"); - return 0; -} - /*! \brief Callback that validates the phoneprov object */ -static int users_apply_handler(const struct ast_sorcery *sorcery, void *obj) +static int users_apply_handler(void *obj, void *arg, int flags) { struct phoneprov *pp = obj; const char *id = ast_sorcery_object_get_id(pp); @@ -303,19 +296,19 @@ static int users_apply_handler(const struct ast_sorcery *sorcery, void *obj) if (!ast_var_find(pp->vars, ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_MAC))) { ast_log(LOG_ERROR, "phoneprov %s must contain a MAC entry.\n", id); - return -1; + return 0; } if (!ast_var_find(pp->vars, ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_PROFILE))) { ast_log(LOG_ERROR, "phoneprov %s must contain a PROFILE entry.\n", id); - return -1; + return 0; } endpoint_name = ast_var_find(pp->vars, "endpoint"); if (endpoint_name) { if (load_endpoint(id, endpoint_name, pp->vars, port_string)) { - return -1; + return 0; } } @@ -342,13 +335,31 @@ static int users_apply_handler(const struct ast_sorcery *sorcery, void *obj) ast_log(LOG_ERROR, "phoneprov %s didn't contain a PROFILE entry.\n", id); } - if (!ast_phoneprov_add_extension(AST_MODULE, pp->vars)) { + ast_phoneprov_add_extension(AST_MODULE, pp->vars); + + return CMP_MATCH; +} + +/*! \brief Callback that loads the users from phoneprov sections */ +static int load_users(void) +{ + struct ao2_container *users; + + ast_sorcery_reload_object(sorcery, "phoneprov"); + + users = ast_sorcery_retrieve_by_fields(sorcery, "phoneprov", + AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL); + if (!users) { return 0; } - return -1; + ao2_callback(users, OBJ_MULTIPLE, users_apply_handler, sorcery); + ao2_ref(users, -1); + + return 0; } + static int load_module(void) { CHECK_PJSIP_MODULE_LOADED(); @@ -360,13 +371,15 @@ static int load_module(void) "pjsip.conf,criteria=type=phoneprov"); ast_sorcery_object_register(sorcery, "phoneprov", phoneprov_alloc, NULL, - users_apply_handler); + NULL); ast_sorcery_object_field_register(sorcery, "phoneprov", "type", "", OPT_NOOP_T, 0, 0); ast_sorcery_object_fields_register(sorcery, "phoneprov", "^", aco_handler, fields_handler); + ast_sorcery_load_object(sorcery, "phoneprov"); + if (ast_phoneprov_provider_register(AST_MODULE, load_users)) { ast_log(LOG_ERROR, "Unable to register pjsip phoneprov provider.\n"); return AST_MODULE_LOAD_DECLINE;