summaryrefslogtreecommitdiff
path: root/main/pbx.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/pbx.c')
-rw-r--r--main/pbx.c235
1 files changed, 109 insertions, 126 deletions
diff --git a/main/pbx.c b/main/pbx.c
index 370087412..74166af27 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -3431,8 +3431,12 @@ static void manager_dpsendack(struct mansession *s, struct message *m, int *sent
return;
}
-/*! \brief Show dialplan extensions */
-static int manager_show_dialplan_helper(struct mansession *s, struct message *m, char *actionidtext, char *context, char *exten, struct dialplan_counters *dpc, struct ast_include *rinclude)
+/*! \brief Show dialplan extensions
+ * XXX this function is similar but not exactly the same as the CLI's
+ * show dialplan. Must check whether the difference is intentional or not.
+ */
+static int manager_show_dialplan_helper(struct mansession *s, struct message *m,
+ const char *actionidtext, const char *context, char *exten, struct dialplan_counters *dpc, struct ast_include *rinclude)
{
struct ast_context *c;
int res=0, old_total_exten = dpc->total_exten;
@@ -3453,137 +3457,115 @@ static int manager_show_dialplan_helper(struct mansession *s, struct message *m,
return -1;
}
- /* walk all contexts ... */
- for (c = ast_walk_contexts(NULL); c ; c = ast_walk_contexts(c)) {
- /* show this context? */
- if (!context ||
- !strcmp(ast_get_context_name(c), context)) {
- dpc->context_existence = 1;
+ c = NULL; /* walk all contexts ... */
+ while ( (c = ast_walk_contexts(c)) ) {
+ struct ast_exten *e;
+ struct ast_include *i;
+ struct ast_ignorepat *ip;
+
+ if (context && strcmp(ast_get_context_name(c), context) != 0)
+ continue; /* not the name we want */
+
+ dpc->context_existence = 1;
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Found Context: %s \n", ast_get_context_name(c));
+
+ if (ast_lock_context(c)) { /* failed to lock */
if (option_debug > 2)
- ast_log(LOG_DEBUG, "manager_show_dialplan: Found Context: %s \n", ast_get_context_name(c));
-
- /* try to lock context before walking in ... */
- if (!ast_lock_context(c)) {
- struct ast_exten *e;
- struct ast_include *i;
- struct ast_ignorepat *ip;
- struct ast_sw *sw;
- char buf[256], buf2[256];
-
- /* walk extensions in context */
- for (e = ast_walk_context_extensions(c, NULL); e; e = ast_walk_context_extensions(c, e)) {
- struct ast_exten *p;
- int prio;
-
- /* looking for extension? is this our extension? */
- if (exten &&
- !ast_extension_match(ast_get_extension_name(e), exten))
- {
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "manager_show_dialplan: Skipping extension %s\n", ast_get_extension_name(e));
- /* we are looking for extension and it's not our
- * extension, so skip to next extension */
- continue;
- }
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "manager_show_dialplan: Found Extension: %s \n", ast_get_extension_name(e));
-
- dpc->extension_existence = 1;
-
- /* may we print context info? */
- dpc->total_context++;
- dpc->total_prio++;
-
- /* write extension name and first peer */
- bzero(buf, sizeof(buf));
-
- dpc->total_items++;
- manager_dpsendack(s, m, &sentpositivemanagerack);
- astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
- astman_append(s, "Context: %s\r\nExtension: %s\r\n", ast_get_context_name(c), ast_get_extension_name(e) );
-
- prio = ast_get_extension_priority(e);
- if (prio == PRIORITY_HINT) {
- astman_append(s, "Priority: hint\r\nApplication: %s\r\n", ast_get_extension_app(e));
- } else {
- astman_append(s, "Priority: %d\r\nApplication: %s\r\nAppData: %s\r\n", prio, ast_get_extension_app(e), (char *) ast_get_extension_app_data(e));
- }
- astman_append(s, "Registrar: %s\r\n\r\n", ast_get_extension_registrar(e));
-
- dpc->total_exten++;
-
- /* walk next extension peers */
- for (p=ast_walk_extension_priorities(e, e); p; p=ast_walk_extension_priorities(e, p)) {
- dpc->total_prio++;
- bzero((void *)buf2, sizeof(buf2));
- bzero((void *)buf, sizeof(buf));
- dpc->total_items++;
- manager_dpsendack(s, m, &sentpositivemanagerack);
- astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
- astman_append(s, "Context: %s\r\nExtension: %s\r\n", ast_get_context_name(c), ast_get_extension_name(e) );
-
- if (ast_get_extension_label(p))
- astman_append(s, "ExtensionLabel: %s\r\n", ast_get_extension_label(p));
- prio = ast_get_extension_priority(p);
- if (prio == PRIORITY_HINT) {
- astman_append(s, "Priority: hint\r\nApplication: %s\r\n", ast_get_extension_app(p));
- } else {
- astman_append(s, "Priority: %d\r\nApplication: %s\r\nAppData: %s\r\n", prio, ast_get_extension_app(p), (char *) ast_get_extension_app_data(p));
- }
- astman_append(s, "Registrar: %s\r\n\r\n", ast_get_extension_registrar(e));
- }
- }
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Failed to lock context\n");
+ continue;
+ }
- /* walk included and write info ... */
- for (i = ast_walk_context_includes(c, NULL); i; i = ast_walk_context_includes(c, i)) {
- if (exten) {
- /* Check all includes for the requested extension */
- manager_show_dialplan_helper(s, m, actionidtext, (char *)ast_get_include_name(i), exten, dpc, i);
- } else {
- dpc->total_items++;
- manager_dpsendack(s, m, &sentpositivemanagerack);
- astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
- astman_append(s, "Context: %s\r\nIncludeContext: %s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ast_get_include_name(i), ast_get_include_registrar(i));
- astman_append(s, "\r\n");
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "manager_show_dialplan: Found Included context: %s \n", buf);
- }
- }
+ /* XXX note- an empty context is not printed */
+ e = NULL; /* walk extensions in context */
+ while ( (e = ast_walk_context_extensions(c, e)) ) {
+ struct ast_exten *p;
- /* walk ignore patterns and write info ... */
- for (ip=ast_walk_context_ignorepats(c, NULL); ip; ip=ast_walk_context_ignorepats(c, ip)) {
- const char *ipname = ast_get_ignorepat_name(ip);
- char ignorepat[AST_MAX_EXTENSION];
-
- snprintf(ignorepat, sizeof(ignorepat), "_%s.", ipname);
- if ((!exten) || ast_extension_match(ignorepat, exten)) {
- dpc->total_items++;
- manager_dpsendack(s, m, &sentpositivemanagerack);
- astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
- astman_append(s, "Context: %s\r\nIgnorePattern: %s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ipname, ast_get_ignorepat_registrar(ip));
- astman_append(s, "\r\n");
- }
- }
- if (!rinclude) {
- for (sw = ast_walk_context_switches(c, NULL); sw; sw = ast_walk_context_switches(c, sw)) {
- dpc->total_items++;
- manager_dpsendack(s, m, &sentpositivemanagerack);
- astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
- astman_append(s, "Context: %s\r\nSwitch: %s/%s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ast_get_switch_name(sw), ast_get_switch_data(sw), ast_get_switch_registrar(sw));
- astman_append(s, "\r\n");
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "manager_show_dialplan: Found Switch : %s \n", buf);
- }
+ /* looking for extension? is this our extension? */
+ if (exten && !ast_extension_match(ast_get_extension_name(e), exten)) {
+ /* not the one we are looking for, continue */
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Skipping extension %s\n", ast_get_extension_name(e));
+ continue;
+ }
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Found Extension: %s \n", ast_get_extension_name(e));
+
+ dpc->extension_existence = 1;
+
+ /* may we print context info? */
+ dpc->total_context++;
+ dpc->total_exten++;
+
+ p = NULL; /* walk next extension peers */
+ while ( (p = ast_walk_extension_priorities(e, p)) ) {
+ int prio = ast_get_extension_priority(p);
+
+ dpc->total_prio++;
+ dpc->total_items++;
+ manager_dpsendack(s, m, &sentpositivemanagerack);
+ astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
+ astman_append(s, "Context: %s\r\nExtension: %s\r\n", ast_get_context_name(c), ast_get_extension_name(e) );
+
+ /* XXX maybe make this conditional, if p != e ? */
+ if (ast_get_extension_label(p))
+ astman_append(s, "ExtensionLabel: %s\r\n", ast_get_extension_label(p));
+
+ if (prio == PRIORITY_HINT) {
+ astman_append(s, "Priority: hint\r\nApplication: %s\r\n", ast_get_extension_app(p));
+ } else {
+ astman_append(s, "Priority: %d\r\nApplication: %s\r\nAppData: %s\r\n", prio, ast_get_extension_app(p), (char *) ast_get_extension_app_data(p));
}
-
- ast_unlock_context(c);
+ astman_append(s, "Registrar: %s\r\n\r\n", ast_get_extension_registrar(e));
+ }
+ }
- } else if (option_debug > 2) {
- ast_log(LOG_DEBUG, "manager_show_dialplan: Failed to lock context\n");
+ i = NULL; /* walk included and write info ... */
+ while ( (i = ast_walk_context_includes(c, i)) ) {
+ if (exten) {
+ /* Check all includes for the requested extension */
+ manager_show_dialplan_helper(s, m, actionidtext, ast_get_include_name(i), exten, dpc, i);
+ } else {
+ dpc->total_items++;
+ manager_dpsendack(s, m, &sentpositivemanagerack);
+ astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
+ astman_append(s, "Context: %s\r\nIncludeContext: %s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ast_get_include_name(i), ast_get_include_registrar(i));
+ astman_append(s, "\r\n");
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Found Included context: %s \n", ast_get_include_name(i));
+ }
+ }
+
+ ip = NULL; /* walk ignore patterns and write info ... */
+ while ( (ip = ast_walk_context_ignorepats(c, ip)) ) {
+ const char *ipname = ast_get_ignorepat_name(ip);
+ char ignorepat[AST_MAX_EXTENSION];
+
+ snprintf(ignorepat, sizeof(ignorepat), "_%s.", ipname);
+ if (!exten || ast_extension_match(ignorepat, exten)) {
+ dpc->total_items++;
+ manager_dpsendack(s, m, &sentpositivemanagerack);
+ astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
+ astman_append(s, "Context: %s\r\nIgnorePattern: %s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ipname, ast_get_ignorepat_registrar(ip));
+ astman_append(s, "\r\n");
+ }
+ }
+ if (!rinclude) {
+ struct ast_sw *sw = NULL;
+ while ( (sw = ast_walk_context_switches(c, sw)) ) {
+ dpc->total_items++;
+ manager_dpsendack(s, m, &sentpositivemanagerack);
+ astman_append(s, "Event: ListDialplan\r\n%s", actionidtext);
+ astman_append(s, "Context: %s\r\nSwitch: %s/%s\r\nRegistrar: %s\r\n", ast_get_context_name(c), ast_get_switch_name(sw), ast_get_switch_data(sw), ast_get_switch_registrar(sw));
+ astman_append(s, "\r\n");
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "manager_show_dialplan: Found Switch : %s \n", ast_get_switch_name(sw));
}
}
- }
+
+ ast_unlock_context(c);
+ }
ast_unlock_contexts();
if (dpc->total_exten == old_total_exten) {
@@ -3609,7 +3591,8 @@ static int manager_show_dialplan(struct mansession *s, struct message *m)
if (id && !ast_strlen_zero(id))
snprintf(idtext, sizeof(idtext), "ActionID: %s\r\n", id);
-
+ else
+ idtext[0] = '\0';
memset(&counters, 0, sizeof(counters));