diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-29 19:42:04 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-29 19:42:04 +0000 |
commit | 312e4a569d2811228dc5da22a814a24cc2bb9a75 (patch) | |
tree | e2a74de081c7bbae3863daef966dd541bdf4eb42 /apps/app_queue.c | |
parent | f11bdacca7fc5d1aa1b32fa8200ccee671e9c198 (diff) |
Merged revisions 114848 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r114848 | mmichelson | 2008-04-29 14:40:06 -0500 (Tue, 29 Apr 2008) | 14 lines
Use the MACRO_CONTEXT and MACRO_EXTEN channel variables instead of the channel's macrocontext
and macroexten fields. This is needed because if macros are daisy-chained, the incorrect
context and extension are placed on the new channel. I also added locking to the channel prior
to accessing these variables as noted in trunk's janitor project file.
(closes issue #12549)
Reported by: darren1713
Patches:
app_queue.c.macroextenpatch uploaded by darren1713 (license 116)
(with modifications from me)
Tested by: putnopvut
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@114849 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r-- | apps/app_queue.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index 3999e4dc3..1624529c6 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2110,6 +2110,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies int status; char tech[256]; char *location; + const char *macrocontext, *macroexten; /* on entry here, we know that tmp->chan == NULL */ if ((tmp->lastqueue && tmp->lastqueue->wrapuptime && (time(NULL) - tmp->lastcall < tmp->lastqueue->wrapuptime)) || @@ -2192,14 +2193,18 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies tmp->chan->adsicpe = qe->chan->adsicpe; /* Inherit context and extension */ - if (!ast_strlen_zero(qe->chan->macrocontext)) - ast_copy_string(tmp->chan->dialcontext, qe->chan->macrocontext, sizeof(tmp->chan->dialcontext)); + ast_channel_lock(qe->chan); + macrocontext = pbx_builtin_getvar_helper(qe->chan, "MACRO_CONTEXT"); + if (!ast_strlen_zero(macrocontext)) + ast_copy_string(tmp->chan->dialcontext, macrocontext, sizeof(tmp->chan->dialcontext)); else ast_copy_string(tmp->chan->dialcontext, qe->chan->context, sizeof(tmp->chan->dialcontext)); - if (!ast_strlen_zero(qe->chan->macroexten)) - ast_copy_string(tmp->chan->exten, qe->chan->macroexten, sizeof(tmp->chan->exten)); + macroexten = pbx_builtin_getvar_helper(qe->chan, "MACRO_EXTEN"); + if (!ast_strlen_zero(macroexten)) + ast_copy_string(tmp->chan->exten, macroexten, sizeof(tmp->chan->exten)); else ast_copy_string(tmp->chan->exten, qe->chan->exten, sizeof(tmp->chan->exten)); + ast_channel_unlock(qe->chan); /* Place the call, but don't wait on the answer */ if ((res = ast_call(tmp->chan, location, 0))) { |