|
|
@ -37,6 +37,7 @@
|
|
|
|
#include "asterisk/channel.h"
|
|
|
|
#include "asterisk/channel.h"
|
|
|
|
#include "asterisk/pbx.h"
|
|
|
|
#include "asterisk/pbx.h"
|
|
|
|
#include "asterisk/module.h"
|
|
|
|
#include "asterisk/module.h"
|
|
|
|
|
|
|
|
#include "asterisk/extconf.h"
|
|
|
|
#include "asterisk/config.h"
|
|
|
|
#include "asterisk/config.h"
|
|
|
|
#include "asterisk/utils.h"
|
|
|
|
#include "asterisk/utils.h"
|
|
|
|
#include "asterisk/lock.h"
|
|
|
|
#include "asterisk/lock.h"
|
|
|
@ -186,12 +187,21 @@ static void macro_fixup(void *data, struct ast_channel *old_chan, struct ast_cha
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static struct ast_exten *find_matching_priority(struct ast_context *c, const char *exten, int priority, const char *callerid)
|
|
|
|
static struct ast_exten *find_matching_priority(struct ast_context *c, const char *exten,
|
|
|
|
|
|
|
|
int priority, const char *callerid, int iter, int *had_error)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct ast_exten *e;
|
|
|
|
struct ast_exten *e;
|
|
|
|
struct ast_context *c2;
|
|
|
|
struct ast_context *c2;
|
|
|
|
int idx;
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (iter >= AST_PBX_MAX_STACK) {
|
|
|
|
|
|
|
|
if (!(*had_error)) {
|
|
|
|
|
|
|
|
*had_error = 1;
|
|
|
|
|
|
|
|
ast_log(LOG_ERROR, "Potential infinite loop detected, will not recurse further.\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (e=ast_walk_context_extensions(c, NULL); e; e=ast_walk_context_extensions(c, e)) {
|
|
|
|
for (e=ast_walk_context_extensions(c, NULL); e; e=ast_walk_context_extensions(c, e)) {
|
|
|
|
if (ast_extension_match(ast_get_extension_name(e), exten)) {
|
|
|
|
if (ast_extension_match(ast_get_extension_name(e), exten)) {
|
|
|
|
int needmatch = ast_get_extension_matchcid(e);
|
|
|
|
int needmatch = ast_get_extension_matchcid(e);
|
|
|
@ -214,7 +224,7 @@ static struct ast_exten *find_matching_priority(struct ast_context *c, const cha
|
|
|
|
|
|
|
|
|
|
|
|
for (c2=ast_walk_contexts(NULL); c2; c2=ast_walk_contexts(c2)) {
|
|
|
|
for (c2=ast_walk_contexts(NULL); c2; c2=ast_walk_contexts(c2)) {
|
|
|
|
if (!strcmp(ast_get_context_name(c2), ast_get_include_name(i))) {
|
|
|
|
if (!strcmp(ast_get_context_name(c2), ast_get_include_name(i))) {
|
|
|
|
e = find_matching_priority(c2, exten, priority, callerid);
|
|
|
|
e = find_matching_priority(c2, exten, priority, callerid, iter + 1, had_error);
|
|
|
|
if (e)
|
|
|
|
if (e)
|
|
|
|
return e;
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -251,6 +261,7 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive
|
|
|
|
char *save_macro_offset;
|
|
|
|
char *save_macro_offset;
|
|
|
|
int save_in_subroutine;
|
|
|
|
int save_in_subroutine;
|
|
|
|
struct ast_datastore *macro_store = ast_channel_datastore_find(chan, ¯o_ds_info, NULL);
|
|
|
|
struct ast_datastore *macro_store = ast_channel_datastore_find(chan, ¯o_ds_info, NULL);
|
|
|
|
|
|
|
|
int had_infinite_include_error = 0;
|
|
|
|
static int deprecation_notice = 0;
|
|
|
|
static int deprecation_notice = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (ast_strlen_zero(data)) {
|
|
|
|
if (ast_strlen_zero(data)) {
|
|
|
@ -426,7 +437,9 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock context?\n");
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock context?\n");
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
e = find_matching_priority(c, ast_channel_exten(chan), ast_channel_priority(chan),
|
|
|
|
e = find_matching_priority(c, ast_channel_exten(chan), ast_channel_priority(chan),
|
|
|
|
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
|
|
|
|
S_COR(ast_channel_caller(chan)->id.number.valid,
|
|
|
|
|
|
|
|
ast_channel_caller(chan)->id.number.str, NULL),
|
|
|
|
|
|
|
|
0, &had_infinite_include_error);
|
|
|
|
if (e) { /* This will only be undefined for pbx_realtime, which is majorly broken. */
|
|
|
|
if (e) { /* This will only be undefined for pbx_realtime, which is majorly broken. */
|
|
|
|
ast_copy_string(runningapp, ast_get_extension_app(e), sizeof(runningapp));
|
|
|
|
ast_copy_string(runningapp, ast_get_extension_app(e), sizeof(runningapp));
|
|
|
|
ast_copy_string(runningdata, ast_get_extension_app_data(e), sizeof(runningdata));
|
|
|
|
ast_copy_string(runningdata, ast_get_extension_app_data(e), sizeof(runningdata));
|
|
|
|