summaryrefslogtreecommitdiff
path: root/res/res_pjsip_phoneprov_provider.c
diff options
context:
space:
mode:
authorGeorge Joseph <george.joseph@fairview5.com>2014-12-22 00:17:49 +0000
committerGeorge Joseph <george.joseph@fairview5.com>2014-12-22 00:17:49 +0000
commitb137a92aef5f08359f11bc7ea686cd361814f3b7 (patch)
tree88e5ceb420421680b28c2435c4a167cc0c995034 /res/res_pjsip_phoneprov_provider.c
parentba403e83bd86073585a1d38da21fb5608adff528 (diff)
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
Diffstat (limited to 'res/res_pjsip_phoneprov_provider.c')
-rw-r--r--res/res_pjsip_phoneprov_provider.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/res/res_pjsip_phoneprov_provider.c b/res/res_pjsip_phoneprov_provider.c
index 3b6594057..70dd99e06 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;