diff options
author | Sean Bright <sean.bright@gmail.com> | 2017-02-21 11:47:28 -0500 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2017-02-21 13:45:03 -0500 |
commit | d5522de597cc6fbbc9747fa6798144cd5d00cdb1 (patch) | |
tree | e846cdeb4630b435f96f4ab71b0643e8fbb1f31c /apps | |
parent | f29ea24d9f1d5771f7a5fe2f0bae51c4bf9a657a (diff) |
realtime: Fix ast_load_realtime_multientry handling
ast_load_realtime_multientry() returns an ast_config structure whose
ast_categorys are keyed with the empty strings. Several modules were
giving semantic meaning to the category names causing problems at
runtime.
* app_directory: Treated the category name as the mailbox name, and
would fail to direct calls to the appropriate extension after an
entry was chosen.
* app_queue: Queues, queue members, and queue rules were all affected
and needed to be updated.
* pbx_realtime: Pattern matching would never succeed because the
extension entered by the user was always compared to the empty
string.
Change-Id: Ie7e44986344b0b76ea8f6ddb5879f5040c6ca8a7
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_directory.c | 18 | ||||
-rw-r--r-- | apps/app_queue.c | 65 |
2 files changed, 45 insertions, 38 deletions
diff --git a/apps/app_directory.c b/apps/app_directory.c index ef3c363f9..b75e85763 100644 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -466,7 +466,7 @@ static struct ast_config *realtime_directory(char *context) struct ast_config *rtdata = NULL; struct ast_category *cat; struct ast_variable *var; - char *mailbox; + char *category = NULL; const char *fullname; const char *hidefromdir, *searchcontexts = NULL; struct ast_flags config_flags = { 0 }; @@ -507,13 +507,12 @@ static struct ast_config *realtime_directory(char *context) return cfg; } - mailbox = NULL; - while ( (mailbox = ast_category_browse(rtdata, mailbox)) ) { - struct ast_variable *alias; - const char *ctx = ast_variable_retrieve(rtdata, mailbox, "context"); + while ((category = ast_category_browse(rtdata, category))) { + const char *mailbox = ast_variable_retrieve(rtdata, category, "mailbox"); + const char *ctx = ast_variable_retrieve(rtdata, category, "context"); - fullname = ast_variable_retrieve(rtdata, mailbox, "fullname"); - hidefromdir = ast_variable_retrieve(rtdata, mailbox, "hidefromdir"); + fullname = ast_variable_retrieve(rtdata, category, "fullname"); + hidefromdir = ast_variable_retrieve(rtdata, category, "hidefromdir"); if (ast_true(hidefromdir)) { /* Skip hidden */ continue; @@ -521,8 +520,9 @@ static struct ast_config *realtime_directory(char *context) /* password,Full Name,email,pager,options */ ast_str_set(&tmp, 0, "no-password,%s,,,", S_OR(fullname, "")); - if (ast_variable_retrieve(rtdata, mailbox, "alias")) { - for (alias = ast_variable_browse(rtdata, mailbox); alias; alias = alias->next) { + if (ast_variable_retrieve(rtdata, category, "alias")) { + struct ast_variable *alias; + for (alias = ast_variable_browse(rtdata, category); alias; alias = alias->next) { if (!strcasecmp(alias->name, "alias")) { ast_str_append(&tmp, 0, "|alias=%s", alias->value); } diff --git a/apps/app_queue.c b/apps/app_queue.c index 2867e6ba3..f7cee6a76 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2869,13 +2869,19 @@ static int load_realtime_rules(void) ast_log(LOG_WARNING, "Failed to load queue rules from realtime\n"); return 0; } - while ((rulecat = ast_category_browse(cfg, rulecat)) && !ast_strlen_zero(rulecat)) { - const char *timestr, *maxstr, *minstr; + while ((rulecat = ast_category_browse(cfg, rulecat))) { + const char *timestr, *maxstr, *minstr, *rule_name; int penaltychangetime, rule_exists = 0, inserted = 0; int max_penalty = 0, min_penalty = 0, min_relative = 0, max_relative = 0; struct penalty_rule *new_penalty_rule = NULL; + + rule_name = ast_variable_retrieve(cfg, rulecat, "rule_name"); + if (ast_strlen_zero(rule_name)) { + continue; + } + AST_LIST_TRAVERSE(&rule_lists, rl_iter, list) { - if (!(strcasecmp(rl_iter->name, rulecat))) { + if (!(strcasecmp(rl_iter->name, rule_name))) { rule_exists = 1; new_rl = rl_iter; break; @@ -2886,13 +2892,13 @@ static int load_realtime_rules(void) ast_config_destroy(cfg); return -1; } - ast_copy_string(new_rl->name, rulecat, sizeof(new_rl->name)); + ast_copy_string(new_rl->name, rule_name, sizeof(new_rl->name)); AST_LIST_INSERT_TAIL(&rule_lists, new_rl, list); } timestr = ast_variable_retrieve(cfg, rulecat, "time"); if (!(timestr) || sscanf(timestr, "%30d", &penaltychangetime) != 1) { ast_log(LOG_NOTICE, "Failed to parse time (%s) for one of the %s rules, skipping it\n", - (ast_strlen_zero(timestr) ? "invalid value" : timestr), rulecat); + (ast_strlen_zero(timestr) ? "invalid value" : timestr), rule_name); continue; } if (!(new_penalty_rule = ast_calloc(1, sizeof(*new_penalty_rule)))) { @@ -3227,7 +3233,7 @@ static void member_remove_from_queue(struct call_queue *queue, struct member *me * Search for member in queue, if found update penalty/paused state, * if no member exists create one flag it as a RT member and add to queue member list. */ -static void rt_handle_member_record(struct call_queue *q, char *interface, struct ast_config *member_config) +static void rt_handle_member_record(struct call_queue *q, char *category, struct ast_config *member_config) { struct member *m; struct ao2_iterator mem_iter; @@ -3237,11 +3243,12 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, struc int ringinuse = q->ringinuse; const char *config_val; - const char *rt_uniqueid = ast_variable_retrieve(member_config, interface, "uniqueid"); - const char *membername = S_OR(ast_variable_retrieve(member_config, interface, "membername"), interface); - const char *state_interface = S_OR(ast_variable_retrieve(member_config, interface, "state_interface"), interface); - const char *penalty_str = ast_variable_retrieve(member_config, interface, "penalty"); - const char *paused_str = ast_variable_retrieve(member_config, interface, "paused"); + const char *interface = ast_variable_retrieve(member_config, category, "interface"); + const char *rt_uniqueid = ast_variable_retrieve(member_config, category, "uniqueid"); + const char *membername = S_OR(ast_variable_retrieve(member_config, category, "membername"), interface); + const char *state_interface = S_OR(ast_variable_retrieve(member_config, category, "state_interface"), interface); + const char *penalty_str = ast_variable_retrieve(member_config, category, "penalty"); + const char *paused_str = ast_variable_retrieve(member_config, category, "paused"); if (ast_strlen_zero(rt_uniqueid)) { ast_log(LOG_WARNING, "Realtime field uniqueid is empty for member %s\n", S_OR(membername, "NULL")); @@ -3264,7 +3271,7 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, struc } } - if ((config_val = ast_variable_retrieve(member_config, interface, realtime_ringinuse_field))) { + if ((config_val = ast_variable_retrieve(member_config, category, realtime_ringinuse_field))) { if (ast_true(config_val)) { ringinuse = 1; } else if (ast_false(config_val)) { @@ -3380,7 +3387,7 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as }; struct member *m; struct ao2_iterator mem_iter; - char *interface = NULL; + char *category = NULL; const char *tmp_name; char *tmp; char tmpbuf[64]; /* Must be longer than the longest queue param name. */ @@ -3481,8 +3488,8 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as } ao2_iterator_destroy(&mem_iter); - while ((interface = ast_category_browse(member_config, interface))) { - rt_handle_member_record(q, interface, member_config); + while ((category = ast_category_browse(member_config, category))) { + rt_handle_member_record(q, category, member_config); } /* Delete all realtime members that have been deleted in DB. */ @@ -3591,7 +3598,7 @@ static void update_realtime_members(struct call_queue *q) { struct ast_config *member_config = NULL; struct member *m; - char *interface = NULL; + char *category = NULL; struct ao2_iterator mem_iter; if (!(member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", q->name , SENTINEL))) { @@ -3624,8 +3631,8 @@ static void update_realtime_members(struct call_queue *q) } ao2_iterator_destroy(&mem_iter); - while ((interface = ast_category_browse(member_config, interface))) { - rt_handle_member_record(q, interface, member_config); + while ((category = ast_category_browse(member_config, category))) { + rt_handle_member_record(q, category, member_config); } /* Delete all realtime members that have been deleted in DB. */ @@ -7401,12 +7408,11 @@ static int set_member_value(const char *queuename, const char *interface, int pr if (ast_strlen_zero(queuename)) { /* This means we need to iterate through all the queues. */ if (ast_check_realtime("queues")) { - char *name; queue_config = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL); if (queue_config) { - for (name = ast_category_browse(queue_config, NULL); - !ast_strlen_zero(name); - name = ast_category_browse(queue_config, name)) { + char *category = NULL; + while ((category = ast_category_browse(queue_config, category))) { + const char *name = ast_variable_retrieve(queue_config, category, "name"); if ((q = find_load_queue_rt_friendly(name))) { foundqueue++; foundinterface += set_member_value_help_members(q, interface, property, value); @@ -9207,9 +9213,10 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char * * which have not yet been added to the in-core container */ struct ast_config *cfg = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL); - char *queuename; if (cfg) { - for (queuename = ast_category_browse(cfg, NULL); !ast_strlen_zero(queuename); queuename = ast_category_browse(cfg, queuename)) { + char *category = NULL; + while ((category = ast_category_browse(cfg, category))) { + const char *queuename = ast_variable_retrieve(cfg, category, "name"); if ((q = find_load_queue_rt_friendly(queuename))) { queue_t_unref(q, "Done with temporary pointer"); } @@ -9272,7 +9279,8 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char * ast_str_set(&out, 0, " %s", mem->membername); if (strcasecmp(mem->membername, mem->interface)) { ast_str_append(&out, 0, " (%s", mem->interface); - if (!ast_strlen_zero(mem->state_interface)) { + if (!ast_strlen_zero(mem->state_interface) + && strcmp(mem->state_interface, mem->interface)) { ast_str_append(&out, 0, " from %s", mem->state_interface); } ast_str_append(&out, 0, ")"); @@ -10769,14 +10777,13 @@ static int queues_data_provider_get(const struct ast_data_search *search, struct ao2_iterator i; struct call_queue *queue, *queue_realtime = NULL; struct ast_config *cfg; - char *queuename; /* load realtime queues. */ cfg = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL); if (cfg) { - for (queuename = ast_category_browse(cfg, NULL); - !ast_strlen_zero(queuename); - queuename = ast_category_browse(cfg, queuename)) { + char *category = NULL; + while ((category = ast_category_browse(cfg, category))) { + const char *queuename = ast_variable_retrieve(cfg, category, "name"); if ((queue = find_load_queue_rt_friendly(queuename))) { queue_unref(queue); } |