return ast_extension_match(cidpattern, callerid);
}
-static struct ast_exten *pbx_find_extension(struct ast_channel *chan, struct ast_context *bypass, const char *context, const char *exten, int priority, const char *label, const char *callerid, int action, char *incstack[], int *stacklen, int *status, struct ast_switch **swo, char **data)
+static struct ast_exten *pbx_find_extension(struct ast_channel *chan, struct ast_context *bypass, const char *context, const char *exten, int priority, const char *label, const char *callerid, int action, char *incstack[], int *stacklen, int *status, struct ast_switch **swo, char **data, const char **foundcontext)
{
int x, res;
struct ast_context *tmp;
*status = STATUS_NO_LABEL;
if (label && e->label && !strcmp(label, e->label)) {
*status = STATUS_SUCCESS;
+ *foundcontext = context;
return e;
}
} else if (e->priority == priority) {
*status = STATUS_SUCCESS;
+ *foundcontext = context;
return e;
}
e = e->peer;
/* Got a match */
*swo = asw;
*data = sw->data;
+ *foundcontext = context;
return NULL;
}
} else {
i = tmp->includes;
while(i) {
if (include_valid(i)) {
- if ((e = pbx_find_extension(chan, bypass, i->rname, exten, priority, label, callerid, action, incstack, stacklen, status, swo, data)))
+ if ((e = pbx_find_extension(chan, bypass, i->rname, exten, priority, label, callerid, action, incstack, stacklen, status, swo, data, foundcontext)))
return e;
if (*swo)
return NULL;
struct ast_app *app;
struct ast_switch *sw;
char *data;
+ const char *foundcontext=NULL;
int newstack = 0;
int res;
int status = 0;
else
return -1;
}
- e = pbx_find_extension(c, con, context, exten, priority, label, callerid, action, incstack, &stacklen, &status, &sw, &data);
+ e = pbx_find_extension(c, con, context, exten, priority, label, callerid, action, incstack, &stacklen, &status, &sw, &data, &foundcontext);
if (e) {
switch(action) {
case HELPER_CANMATCH:
case HELPER_EXEC:
ast_mutex_unlock(&conlock);
if (sw->exec)
- res = sw->exec(c, context, exten, priority, callerid, newstack, data);
+ res = sw->exec(c, foundcontext ? foundcontext : context, exten, priority, callerid, newstack, data);
else {
ast_log(LOG_WARNING, "No execution engine for switch %s\n", sw->name);
res = -1;
struct ast_exten *e;
struct ast_switch *sw;
char *data;
+ const char *foundcontext = NULL;
int status = 0;
char *incstack[AST_PBX_MAX_STACK];
int stacklen = 0;
ast_log(LOG_WARNING, "Unable to obtain lock\n");
return NULL;
}
- e = pbx_find_extension(c, NULL, context, exten, PRIORITY_HINT, NULL, "", HELPER_EXISTS, incstack, &stacklen, &status, &sw, &data);
+ e = pbx_find_extension(c, NULL, context, exten, PRIORITY_HINT, NULL, "", HELPER_EXISTS, incstack, &stacklen, &status, &sw, &data, &foundcontext);
ast_mutex_unlock(&conlock);
return e;
}