aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-22 22:09:31 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-22 22:09:31 +0000
commitd533fe5e3abdbe6dd26b980e14b3e093bbe462f3 (patch)
tree241284ea44f67feb1be02a8d444c3b42e7c60f1c
parentcc58265a32057c76252b28b122b8727c1c254f8d (diff)
Merged revisions 139627 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r139627 | murf | 2008-08-22 16:03:13 -0600 (Fri, 22 Aug 2008) | 59 lines Merged revisions 139347 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r139347 | murf | 2008-08-21 17:03:50 -0600 (Thu, 21 Aug 2008) | 47 lines (closes issue #13251) Reported by: sergee Tested by: murf THis is a bold move for a static release fix, but I wouldn't have made it if I didn't feel confident (at least a *bit* confident) that it wouldn't mess everyone up. The reasoning goes something like this: 1. We simply cannot do anything with CDR's at the current point (in pbx.c, after the __ast_pbx_run loop). It's way too late to have any affect on the CDRs. The CDR is already posted and gone, and the remnants have been cleared. 2. I was very much afraid that moving the running of the 'h' extension down into the bridge code (where it would be now practical to do it), would result in a lot more calls to the 'h' exten, so I implemented it as another exten under another name, but found, to my pleasant surprise, that there was a 1:1 correspondence to the running of the 'h' exten in the pbx_run loop, and the new spot at the end of the bridge. So, I ifdef'd out the current 'h' loop, and moved it into the bridge code. The only difference I can see is the stuff about the AST_PBX_KEEPALIVE, and hopefully, if this is still an important decision point, I can replicate it if there are complaints. To be perfectly honest, the KEEPALIVE situation is not totally clear to me, and how it relates to a post-bridge situation is less clear. I suspect the users will point out everything in total clarity if this steps on anyone's toes! 3. I temporarily swap the bridge_cdr into the channel before running the 'h' exten, which makes it possible for users to edit the cdr before it goes out the door. And, of course, with the endbeforehexten config var set, the users can also get at the billsec/duration vals. After the h exten finishes, the cdr is swapped back and processing continues as normal. Please, all who deal with CDR's, please test this version of Asterisk, and file bug reports as appropriate! ........ I also made a little fix to the app_dial's 'e' option, that is related to my updates. ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@139628 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_dial.c2
-rw-r--r--main/features.c43
-rw-r--r--main/pbx.c4
3 files changed, 48 insertions, 1 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 7b813d8c8..aa53e5c4c 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1915,7 +1915,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
autoloopflag = ast_test_flag(peer, AST_FLAG_IN_AUTOLOOP); /* save value to restore at the end */
ast_set_flag(peer, AST_FLAG_IN_AUTOLOOP);
- while ((res = ast_spawn_extension(peer, peer->context, peer->exten, peer->priority, peer->cid.cid_num, &found, 1)))
+ while ((res = ast_spawn_extension(peer, peer->context, peer->exten, peer->priority, peer->cid.cid_num, &found, 1)) == 0)
peer->priority++;
if (found && res) {
diff --git a/main/features.c b/main/features.c
index 4cbd32ea3..6e79345c8 100644
--- a/main/features.c
+++ b/main/features.c
@@ -2140,6 +2140,49 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
}
before_you_go:
+ if (ast_exists_extension(chan, chan->context, "h", 1, chan->cid.cid_num)) {
+ struct ast_cdr *swapper;
+ char savelastapp[AST_MAX_EXTENSION];
+ char savelastdata[AST_MAX_EXTENSION];
+ char save_exten[AST_MAX_EXTENSION];
+ int save_prio;
+ int found = 0; /* set if we find at least one match */
+
+ if (chan->cdr && ast_opt_end_cdr_before_h_exten) {
+ ast_cdr_end(bridge_cdr);
+ }
+ /* swap the bridge cdr and the chan cdr for a moment, and let the endbridge
+ dialplan code operate on it */
+ swapper = chan->cdr;
+ ast_copy_string(savelastapp, bridge_cdr->lastapp, sizeof(bridge_cdr->lastapp));
+ ast_copy_string(savelastdata, bridge_cdr->lastdata, sizeof(bridge_cdr->lastdata));
+ chan->cdr = bridge_cdr;
+ ast_channel_lock(chan);
+ ast_copy_string(save_exten, chan->exten, sizeof(save_exten));
+ save_prio = chan->priority;
+ ast_copy_string(chan->exten, "h", sizeof(chan->exten));
+ chan->priority = 1;
+ ast_channel_unlock(chan);
+ while ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num, &found, 1)) == 0) {
+ chan->priority++;
+ }
+ if (found && res)
+ {
+ /* Something bad happened, or a hangup has been requested. */
+ ast_debug(1, "Spawn extension (%s,%s,%d) exited non-zero on '%s'\n", chan->context, chan->exten, chan->priority, chan->name);
+ ast_verb(2, "Spawn extension (%s, %s, %d) exited non-zero on '%s'\n", chan->context, chan->exten, chan->priority, chan->name);
+ }
+ /* swap it back */
+ ast_channel_lock(chan);
+ ast_copy_string(chan->exten, save_exten, sizeof(chan->exten));
+ chan->priority = save_prio;
+ chan->cdr = swapper;
+ ast_channel_lock(chan);
+ /* protect the lastapp/lastdata against the effects of the hangup/dialplan code */
+ ast_copy_string(bridge_cdr->lastapp, savelastapp, sizeof(bridge_cdr->lastapp));
+ ast_copy_string(bridge_cdr->lastdata, savelastdata, sizeof(bridge_cdr->lastdata));
+ }
+
/* obey the NoCDR() wishes. */
if (!chan->cdr || (chan->cdr && !ast_test_flag(chan->cdr, AST_CDR_FLAG_POST_DISABLED))) {
diff --git a/main/pbx.c b/main/pbx.c
index 8846a9e72..02e83fb4f 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -3845,7 +3845,10 @@ static int __ast_pbx_run(struct ast_channel *c)
ast_log(LOG_WARNING, "Don't know what to do with '%s'\n", c->name);
if (res != AST_PBX_KEEPALIVE)
ast_softhangup(c, c->hangupcause ? c->hangupcause : AST_CAUSE_NORMAL_CLEARING);
+#ifdef HANGUP_EXTEN_EXECUTION_MOVED_TO_res_features
if ((res != AST_PBX_KEEPALIVE) && ast_exists_extension(c, c->context, "h", 1, c->cid.cid_num)) {
+ /* end before h exten was here */
+
set_ext_pri(c, "h", 1);
while ((res = ast_spawn_extension(c, c->context, c->exten, c->priority, c->cid.cid_num, &found, 1)) == 0) {
c->priority++;
@@ -3856,6 +3859,7 @@ static int __ast_pbx_run(struct ast_channel *c)
ast_verb(2, "Spawn extension (%s, %s, %d) exited non-zero on '%s'\n", c->context, c->exten, c->priority, c->name);
}
}
+#endif
ast_set2_flag(c, autoloopflag, AST_FLAG_IN_AUTOLOOP);
pbx_destroy(c->pbx);