[asterisk-commits] russell: branch russell/parking_updates r114654 - in /team/russell/parking_up...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Apr 25 12:24:00 CDT 2008
Author: russell
Date: Fri Apr 25 12:23:58 2008
New Revision: 114654
URL: http://svn.digium.com/view/asterisk?view=rev&rev=114654
Log:
sync with trunk
Modified:
team/russell/parking_updates/ (props changed)
team/russell/parking_updates/apps/app_alarmreceiver.c
team/russell/parking_updates/apps/app_dial.c
team/russell/parking_updates/apps/app_disa.c
team/russell/parking_updates/apps/app_externalivr.c
team/russell/parking_updates/apps/app_followme.c
team/russell/parking_updates/apps/app_meetme.c
team/russell/parking_updates/apps/app_queue.c
team/russell/parking_updates/apps/app_voicemail.c
team/russell/parking_updates/channels/chan_alsa.c
team/russell/parking_updates/channels/chan_console.c
team/russell/parking_updates/channels/chan_gtalk.c
team/russell/parking_updates/channels/chan_h323.c
team/russell/parking_updates/channels/chan_iax2.c
team/russell/parking_updates/channels/chan_jingle.c
team/russell/parking_updates/channels/chan_local.c
team/russell/parking_updates/channels/chan_mgcp.c
team/russell/parking_updates/channels/chan_misdn.c
team/russell/parking_updates/channels/chan_oss.c
team/russell/parking_updates/channels/chan_sip.c
team/russell/parking_updates/channels/chan_skinny.c
team/russell/parking_updates/channels/chan_unistim.c
team/russell/parking_updates/channels/chan_zap.c
team/russell/parking_updates/include/asterisk/channel.h
team/russell/parking_updates/main/channel.c
Propchange: team/russell/parking_updates/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.
Propchange: team/russell/parking_updates/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/russell/parking_updates/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Fri Apr 25 12:23:58 2008
@@ -1,1 +1,1 @@
-/trunk:1-114613
+/trunk:1-114653
Modified: team/russell/parking_updates/apps/app_alarmreceiver.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_alarmreceiver.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_alarmreceiver.c (original)
+++ team/russell/parking_updates/apps/app_alarmreceiver.c Fri Apr 25 12:23:58 2008
@@ -252,6 +252,9 @@
/* If they hung up, leave */
if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
+ if (f->seqno) {
+ chan->hangupcause = f->seqno;
+ }
ast_frfree(f);
res = -1;
break;
Modified: team/russell/parking_updates/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_dial.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_dial.c (original)
+++ team/russell/parking_updates/apps/app_dial.c Fri Apr 25 12:23:58 2008
@@ -788,8 +788,11 @@
*to = -1;
strcpy(pa->status, "CANCEL");
ast_cdr_noanswer(in->cdr);
- if (f)
+ if (f) {
+ if (f->seqno)
+ in->hangupcause = f->seqno;
ast_frfree(f);
+ }
return NULL;
}
Modified: team/russell/parking_updates/apps/app_disa.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_disa.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_disa.c (original)
+++ team/russell/parking_updates/apps/app_disa.c Fri Apr 25 12:23:58 2008
@@ -195,6 +195,8 @@
}
if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
+ if (f->seqno)
+ chan->hangupcause = f->seqno;
ast_frfree(f);
ast_clear_flag(chan, AST_FLAG_END_DTMF_ONLY);
return -1;
Modified: team/russell/parking_updates/apps/app_externalivr.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_externalivr.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_externalivr.c (original)
+++ team/russell/parking_updates/apps/app_externalivr.c Fri Apr 25 12:23:58 2008
@@ -560,6 +560,9 @@
} else if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
ast_chan_log(LOG_NOTICE, chan, "Got AST_CONTROL_HANGUP\n");
send_eivr_event(eivr_events, 'H', NULL, chan);
+ if (f->seqno) {
+ chan->hangupcause = f->seqno;
+ }
ast_frfree(f);
res = -1;
break;
Modified: team/russell/parking_updates/apps/app_followme.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_followme.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_followme.c (original)
+++ team/russell/parking_updates/apps/app_followme.c Fri Apr 25 12:23:58 2008
@@ -607,6 +607,9 @@
switch(f->subclass) {
case AST_CONTROL_HANGUP:
ast_verb(3, "%s received a hangup frame.\n", winner->name);
+ if (f->seqno) {
+ winner->hangupcause = f->seqno;
+ }
if (dg == 0) {
ast_verb(3, "The calling channel hungup. Need to drop everyone else.\n");
clear_calling_tree(findme_user_list);
Modified: team/russell/parking_updates/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_meetme.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_meetme.c (original)
+++ team/russell/parking_updates/apps/app_meetme.c Fri Apr 25 12:23:58 2008
@@ -2706,35 +2706,56 @@
char useropts[32] = "";
char adminopts[32] = "";
struct ast_tm tm, etm;
- struct timeval starttime = { .tv_sec = 0 }, endtime = { .tv_sec = 0 };
+ struct timeval endtime = { .tv_sec = 0 };
if (rt_schedule) {
now = ast_tvnow();
- if (fuzzystart)
- now.tv_sec += fuzzystart;
-
ast_localtime(&now, &tm, NULL);
ast_strftime(currenttime, sizeof(currenttime), DATE_FORMAT, &tm);
- if (earlyalert) {
+ ast_debug(1, "Looking for conference %s that starts after %s\n", confno, eatime);
+
+ var = ast_load_realtime("meetme", "confno",
+ confno, "starttime <= ", currenttime, "endtime >= ",
+ currenttime, NULL);
+
+ if (!var && fuzzystart) {
+ now = ast_tvnow();
+ now.tv_sec += fuzzystart;
+
+ ast_localtime(&now, &tm, NULL);
+ ast_strftime(currenttime, sizeof(currenttime), DATE_FORMAT, &tm);
+ var = ast_load_realtime("meetme", "confno",
+ confno, "starttime <= ", currenttime, "endtime >= ",
+ currenttime, NULL);
+ }
+
+ if (!var && earlyalert) {
+ now = ast_tvnow();
now.tv_sec += earlyalert;
ast_localtime(&now, &etm, NULL);
ast_strftime(eatime, sizeof(eatime), DATE_FORMAT, &etm);
- } else {
- ast_copy_string(eatime, currenttime, sizeof(eatime));
+ var = ast_load_realtime("meetme", "confno",
+ confno, "starttime <= ", eatime, "endtime >= ",
+ currenttime, NULL);
+ if (var)
+ *too_early = 1;
}
- ast_debug(1, "Looking for conference %s that starts after %s\n", confno, eatime);
-
- var = ast_load_realtime("meetme", "confno",
- confno, "starttime <= ", eatime, "endtime >= ",
- currenttime, NULL);
} else
var = ast_load_realtime("meetme", "confno", confno, NULL);
if (!var)
return NULL;
+
+ if (rt_schedule && *too_early) {
+ /* Announce that the caller is early and exit */
+ if (!ast_streamfile(chan, "conf-has-not-started", chan->language))
+ ast_waitstream(chan, "");
+ ast_variables_destroy(var);
+ return NULL;
+ }
while (var) {
if (!strcasecmp(var->name, "pin")) {
@@ -2753,31 +2774,18 @@
struct tm tm;
} t = { { 0, }, };
strptime(var->value, "%Y-%m-%d %H:%M:%S", &t.tm);
+ /* strptime does not determine if a time is
+ * in DST or not. Set tm_isdst to -1 to
+ * allow ast_mktime to adjust for DST
+ * if needed */
+ t.tm.tm_isdst = -1;
endtime = ast_mktime(&t.atm, NULL);
- } else if (!strcasecmp(var->name, "starttime")) {
- union {
- struct ast_tm atm;
- struct tm tm;
- } t = { { 0, }, };
- strptime(var->value, "%Y-%m-%d %H:%M:%S", &t.tm);
- starttime = ast_mktime(&t.atm, NULL);
}
var = var->next;
}
+
ast_variables_destroy(var);
-
- if (earlyalert) {
- now = ast_tvnow();
-
- if (now.tv_sec + fuzzystart < starttime.tv_sec) {
- /* Announce that the caller is early and exit */
- if (!ast_streamfile(chan, "conf-has-not-started", chan->language))
- ast_waitstream(chan, "");
- *too_early = 1;
- return NULL;
- }
- }
cnf = build_conf(confno, pin ? pin : "", pinadmin ? pinadmin : "", make, dynamic, refcount, chan);
Modified: team/russell/parking_updates/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_queue.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_queue.c (original)
+++ team/russell/parking_updates/apps/app_queue.c Fri Apr 25 12:23:58 2008
@@ -2077,10 +2077,10 @@
j += 9;
}
}
- if (j > len - 1)
- j = len - 1;
- vars[j - 2] = '\r';
- vars[j - 1] = '\n';
+ if (j > len - 3)
+ j = len - 3;
+ vars[j++] = '\r';
+ vars[j++] = '\n';
vars[j] = '\0';
} else {
/* there are no channel variables; leave it blank */
@@ -2644,6 +2644,8 @@
/* Got hung up */
*to = -1;
if (f) {
+ if (f->seqno)
+ in->hangupcause = f->seqno;
ast_frfree(f);
}
return NULL;
Modified: team/russell/parking_updates/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/apps/app_voicemail.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/apps/app_voicemail.c (original)
+++ team/russell/parking_updates/apps/app_voicemail.c Fri Apr 25 12:23:58 2008
@@ -4561,11 +4561,11 @@
strncat(textfile, ".txt", sizeof(textfile) - strlen(textfile) - 1);
strncat(backup, "-bak", sizeof(backup) - strlen(backup) - 1);
- msg_cfg = ast_config_load(textfile, config_flags);
-
- *duration = 0;
- if ((duration_str = ast_variable_retrieve(msg_cfg, "message", "duration")))
+ if ((msg_cfg = ast_config_load(textfile, config_flags)) && (duration_str = ast_variable_retrieve(msg_cfg, "message", "duration"))) {
*duration = atoi(duration_str);
+ } else {
+ *duration = 0;
+ }
while ((cmd >= 0) && (cmd != 't') && (cmd != '*')) {
if (cmd)
@@ -4576,7 +4576,7 @@
prepend_duration = 0;
/* if we can't read the message metadata, stop now */
- if (!(msg_cfg = ast_config_load(textfile, config_flags))) {
+ if (!msg_cfg) {
cmd = 0;
break;
}
@@ -4631,7 +4631,8 @@
}
}
- ast_config_destroy(msg_cfg);
+ if (msg_cfg)
+ ast_config_destroy(msg_cfg);
if (already_recorded)
ast_filedelete(backup, NULL);
if (prepend_duration)
Modified: team/russell/parking_updates/channels/chan_alsa.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_alsa.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_alsa.c (original)
+++ team/russell/parking_updates/channels/chan_alsa.c Fri Apr 25 12:23:58 2008
@@ -766,7 +766,7 @@
hookstate = 0;
grab_owner();
if (alsa.owner) {
- ast_queue_hangup(alsa.owner);
+ ast_queue_hangup(alsa.owner, AST_CAUSE_NORMAL_CLEARING);
ast_channel_unlock(alsa.owner);
}
}
Modified: team/russell/parking_updates/channels/chan_console.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_console.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_console.c (original)
+++ team/russell/parking_updates/channels/chan_console.c Fri Apr 25 12:23:58 2008
@@ -874,7 +874,7 @@
pvt->hookstate = 0;
if (pvt->owner)
- ast_queue_hangup(pvt->owner);
+ ast_queue_hangup(pvt->owner, -1);
unref_pvt(pvt);
Modified: team/russell/parking_updates/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_gtalk.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_gtalk.c (original)
+++ team/russell/parking_updates/channels/chan_gtalk.c Fri Apr 25 12:23:58 2008
@@ -620,7 +620,7 @@
ast_getformatname_multiple(s2, BUFSIZ, tmp->peercapability),
ast_getformatname_multiple(s3, BUFSIZ, tmp->jointcapability));
/* close session if capabilities don't match */
- ast_queue_hangup(tmp->owner);
+ ast_queue_hangup(tmp->owner, -1);
return -1;
@@ -749,7 +749,7 @@
if (tmp) {
tmp->alreadygone = 1;
if (tmp->owner)
- ast_queue_hangup(tmp->owner);
+ ast_queue_hangup(tmp->owner, -1);
} else
ast_log(LOG_NOTICE, "Whoa, didn't find call!\n");
gtalk_response(client, from, pak, NULL, NULL);
Modified: team/russell/parking_updates/channels/chan_h323.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_h323.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_h323.c (original)
+++ team/russell/parking_updates/channels/chan_h323.c Fri Apr 25 12:23:58 2008
@@ -342,7 +342,7 @@
ast_debug(1, "Process pending hangup for %s\n", c->name);
c->_softhangup |= AST_SOFTHANGUP_DEV;
c->hangupcause = pvt->hangupcause;
- ast_queue_hangup(c);
+ ast_queue_hangup(c, pvt->hangupcause);
pvt->needhangup = 0;
pvt->newstate = pvt->newcontrol = pvt->newdigit = pvt->DTMFsched = -1;
}
@@ -2379,7 +2379,7 @@
/* Send hangup */
if (pvt->owner) {
pvt->owner->_softhangup |= AST_SOFTHANGUP_DEV;
- ast_queue_hangup(pvt->owner);
+ ast_queue_hangup(pvt->owner, -1);
ast_channel_unlock(pvt->owner);
}
ast_mutex_unlock(&pvt->lock);
@@ -2404,7 +2404,7 @@
if (pvt->owner && !ast_channel_trylock(pvt->owner)) {
pvt->owner->_softhangup |= AST_SOFTHANGUP_DEV;
pvt->owner->hangupcause = pvt->hangupcause = cause;
- ast_queue_hangup(pvt->owner);
+ ast_queue_hangup(pvt->owner, cause);
ast_channel_unlock(pvt->owner);
}
else {
Modified: team/russell/parking_updates/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_iax2.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_iax2.c (original)
+++ team/russell/parking_updates/channels/chan_iax2.c Fri Apr 25 12:23:58 2008
@@ -1662,7 +1662,7 @@
usleep(1);
ast_mutex_lock(&iaxsl[callno]);
} else {
- ast_queue_hangup(iaxs[callno]->owner);
+ ast_queue_hangup(iaxs[callno]->owner, -1);
ast_channel_unlock(iaxs[callno]->owner);
break;
}
@@ -2146,7 +2146,7 @@
/* If there's an owner, prod it to give up */
/* It is ok to use ast_queue_hangup() here instead of iax2_queue_hangup()
* because we already hold the owner channel lock. */
- ast_queue_hangup(owner);
+ ast_queue_hangup(owner, -1);
}
AST_LIST_LOCK(&frame_queue);
@@ -2220,10 +2220,8 @@
ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %d, ts=%d, seqno=%d)\n", ast_inet_ntoa(iaxs[f->callno]->addr.sin_addr),iaxs[f->callno]->owner->name , f->af.frametype, f->af.subclass, f->ts, f->oseqno);
iaxs[callno]->error = ETIMEDOUT;
if (iaxs[callno]->owner) {
- struct ast_frame fr = { 0, };
+ struct ast_frame fr = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP, .seqno = AST_CAUSE_DESTINATION_OUT_OF_ORDER };
/* Hangup the fd */
- fr.frametype = AST_FRAME_CONTROL;
- fr.subclass = AST_CONTROL_HANGUP;
iax2_queue_frame(callno, &fr); /* XXX */
/* Remember, owner could disappear */
if (iaxs[callno] && iaxs[callno]->owner)
Modified: team/russell/parking_updates/channels/chan_jingle.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_jingle.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_jingle.c (original)
+++ team/russell/parking_updates/channels/chan_jingle.c Fri Apr 25 12:23:58 2008
@@ -573,7 +573,7 @@
if (tmp) {
tmp->alreadygone = 1;
if (tmp->owner)
- ast_queue_hangup(tmp->owner);
+ ast_queue_hangup(tmp->owner, -1);
} else
ast_log(LOG_NOTICE, "Whoa, didn't find call!\n");
jingle_response(client, pak, NULL, NULL);
Modified: team/russell/parking_updates/channels/chan_local.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_local.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_local.c (original)
+++ team/russell/parking_updates/channels/chan_local.c Fri Apr 25 12:23:58 2008
@@ -505,6 +505,7 @@
p->chan->cid.cid_pres = p->owner->cid.cid_pres;
ast_string_field_set(p->chan, language, p->owner->language);
ast_string_field_set(p->chan, accountcode, p->owner->accountcode);
+ ast_cdr_update(p->chan);
p->chan->cdrflags = p->owner->cdrflags;
/* copy the channel variables from the incoming channel to the outgoing channel */
@@ -533,7 +534,7 @@
{
struct local_pvt *p = ast->tech_pvt;
int isoutbound;
- struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
+ struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP, .seqno = ast->hangupcause };
struct ast_channel *ochan = NULL;
int glaredetect = 0, res = 0;
@@ -550,7 +551,13 @@
/* Deadlock avoidance */
while (p->owner && ast_channel_trylock(p->owner)) {
ast_mutex_unlock(&p->lock);
+ if (ast) {
+ ast_channel_unlock(ast);
+ }
usleep(1);
+ if (ast) {
+ ast_channel_lock(ast);
+ }
ast_mutex_lock(&p->lock);
}
if (p->owner) {
Modified: team/russell/parking_updates/channels/chan_mgcp.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_mgcp.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_mgcp.c (original)
+++ team/russell/parking_updates/channels/chan_mgcp.c Fri Apr 25 12:23:58 2008
@@ -610,7 +610,7 @@
for(;;) {
if (sub->owner) {
if (!ast_channel_trylock(sub->owner)) {
- ast_queue_hangup(sub->owner);
+ ast_queue_hangup(sub->owner, -1);
ast_channel_unlock(sub->owner);
break;
} else {
Modified: team/russell/parking_updates/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_misdn.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_misdn.c (original)
+++ team/russell/parking_updates/channels/chan_misdn.c Fri Apr 25 12:23:58 2008
@@ -2320,13 +2320,13 @@
if (!p) {
ast_log(LOG_WARNING, " --> Channel not connected ??\n");
- ast_queue_hangup(ast);
+ ast_queue_hangup(ast, AST_CAUSE_NETWORK_OUT_OF_ORDER);
}
if (!p->bc) {
chan_misdn_log(1, 0, " --> Got Answer, but theres no bc obj ??\n");
- ast_queue_hangup(ast);
+ ast_queue_hangup(ast, AST_CAUSE_PROTOCOL_ERROR);
}
tmp = pbx_builtin_getvar_helper(p->ast, "CRYPT_KEY");
@@ -3665,7 +3665,7 @@
send_cause2ast(ch->ast, ch->bc, ch);
if (ch->ast)
- ast_queue_hangup(ch->ast);
+ ast_queue_hangup(ch->ast, ch->bc->cause);
cb_log(2, port, " --> queue_hangup\n");
} else {
cb_log(1, port, "Cannot hangup chan, no ast\n");
Modified: team/russell/parking_updates/channels/chan_oss.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_oss.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_oss.c (original)
+++ team/russell/parking_updates/channels/chan_oss.c Fri Apr 25 12:23:58 2008
@@ -1040,7 +1040,7 @@
}
o->hookstate = 0;
if (o->owner)
- ast_queue_hangup(o->owner);
+ ast_queue_hangup(o->owner, AST_CAUSE_NORMAL_CLEARING);
setformat(o, O_CLOSE);
return CLI_SUCCESS;
}
Modified: team/russell/parking_updates/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_sip.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_sip.c (original)
+++ team/russell/parking_updates/channels/chan_sip.c Fri Apr 25 12:23:58 2008
@@ -2970,7 +2970,7 @@
if (pkt->owner->owner) {
sip_alreadygone(pkt->owner);
ast_log(LOG_WARNING, "Hanging up call %s - no reply to our critical packet.\n", pkt->owner->callid);
- ast_queue_hangup(pkt->owner->owner);
+ ast_queue_hangup(pkt->owner->owner, AST_CAUSE_PROTOCOL_ERROR);
ast_channel_unlock(pkt->owner->owner);
} else {
/* If no channel owner, destroy now */
@@ -3112,7 +3112,7 @@
if (p->owner) {
ast_log(LOG_WARNING, "Autodestruct on dialog '%s' with owner in place (Method: %s)\n", p->callid, sip_methods[p->method].text);
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR);
} else if (p->refer) {
ast_debug(3, "Finally hanging up channel after transfer: %s\n", p->callid);
transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1);
@@ -5266,6 +5266,13 @@
ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
else {
p->owner = newchan;
+ /* Re-invite RTP back to Asterisk. Needed if channel is masqueraded out of a native
+ RTP bridge (i.e., RTP not going through Asterisk): RTP bridge code might not be
+ able to do this if the masquerade happens before the bridge breaks (e.g., AMI
+ redirect of both channels). Note that a channel can not be masqueraded *into*
+ a native bridge. So there is no danger that this breaks a native bridge that
+ should stay up. */
+ sip_set_rtp_peer(newchan, NULL, NULL, 0, 0, 0);
ret = 0;
}
ast_debug(3, "SIP Fixup: New owner for dialogue %s: %s (Old parent: %s)\n", p->callid, p->owner->name, oldchan->name);
@@ -15688,7 +15695,7 @@
*/
xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
if (p->owner && !req->ignore) {
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, AST_CAUSE_NORMAL_CLEARING);
append_history(p, "Hangup", "Got 487 on CANCEL request from us. Queued AST hangup request");
} else if (!req->ignore) {
update_call_counter(p, DEC_CALL_LIMIT);
@@ -15769,7 +15776,7 @@
if (p->owner) {
if (!p->refer) {
ast_log(LOG_WARNING, "Notify answer on an owned channel? - %s\n", p->owner->name);
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, AST_CAUSE_NORMAL_UNSPECIFIED);
} else {
ast_debug(4, "Got OK on REFER Notify message\n");
}
@@ -16331,7 +16338,7 @@
default:
/* Send hangup */
if (owner && sipmethod != SIP_MESSAGE && sipmethod != SIP_INFO && sipmethod != SIP_BYE)
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR);
break;
}
/* ACK on invite */
@@ -16385,7 +16392,7 @@
ast_debug(1, "Got 200 OK on NOTIFY for transfer\n");
} else
ast_log(LOG_WARNING, "Notify answer on an owned channel?\n");
- /* ast_queue_hangup(p->owner); Disabled */
+ /* ast_queue_hangup(p->owner, -1); Disabled */
} else {
if (!p->subscribed && !p->refer)
p->needdestroy = 1;
@@ -18235,7 +18242,7 @@
stop_media_flows(p); /* Immediately stop RTP, VRTP and UDPTL as applicable */
if (p->owner)
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, -1);
else
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
if (p->initreq.len > 0) {
@@ -18394,15 +18401,15 @@
ast_queue_control(c, AST_CONTROL_UNHOLD);
ast_async_goto(bridged_to, p->context, p->refer->refer_to, 1);
} else
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, -1);
}
} else {
ast_log(LOG_WARNING, "Invalid transfer information from '%s'\n", ast_inet_ntoa(p->recv.sin_addr));
if (p->owner)
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR);
}
} else if (p->owner) {
- ast_queue_hangup(p->owner);
+ ast_queue_hangup(p->owner, -1);
ast_debug(3, "Received bye, issuing owner hangup\n");
} else {
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
Modified: team/russell/parking_updates/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_skinny.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_skinny.c (original)
+++ team/russell/parking_updates/channels/chan_skinny.c Fri Apr 25 12:23:58 2008
@@ -4513,7 +4513,7 @@
if ((res = attempt_transfer(p)) < 0) {
if (sub->next && sub->next->owner) {
sub->next->alreadygone = 1;
- ast_queue_hangup(sub->next->owner,1);
+ ast_queue_hangup(sub->next->owner, -1);
}
} else if (res) {
ast_log(LOG_WARNING, "Transfer attempt failed\n");
@@ -4525,7 +4525,7 @@
/* If there is another active call, skinny_hangup will ring the phone with the other call */
if (sub->owner) {
sub->alreadygone = 1;
- ast_queue_hangup(sub->owner);
+ ast_queue_hangup(sub->owner, -1);
} else {
ast_log(LOG_WARNING, "Skinny(%s@%s-%d) channel already destroyed\n",
l->name, d->name, sub->callid);
@@ -5222,7 +5222,7 @@
if ((res = attempt_transfer(p)) < 0) {
if (sub->next && sub->next->owner) {
sub->next->alreadygone = 1;
- ast_queue_hangup(sub->next->owner, 1);
+ ast_queue_hangup(sub->next->owner, -1);
}
} else if (res) {
ast_log(LOG_WARNING, "Transfer attempt failed\n");
@@ -5234,7 +5234,7 @@
/* If there is another active call, skinny_hangup will ring the phone with the other call */
if (sub->owner) {
sub->alreadygone = 1;
- ast_queue_hangup(sub->owner);
+ ast_queue_hangup(sub->owner, -1);
} else {
ast_log(LOG_WARNING, "Skinny(%s@%s-%d) channel already destroyed\n",
l->name, d->name, sub->callid);
Modified: team/russell/parking_updates/channels/chan_unistim.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_unistim.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_unistim.c (original)
+++ team/russell/parking_updates/channels/chan_unistim.c Fri Apr 25 12:23:58 2008
@@ -1125,7 +1125,7 @@
if (sub->owner) { /* Call in progress ? */
if (unistimdebug)
ast_verb(0, "Aborting call\n");
- ast_queue_hangup(sub->owner);
+ ast_queue_hangup(sub->owner, AST_CAUSE_NETWORK_OUT_OF_ORDER);
}
} else
ast_log(LOG_WARNING, "Freeing a client with no subchannel !\n");
@@ -1974,11 +1974,11 @@
if (attempt_transfer(sub, l->subs[SUB_THREEWAY]) < 0)
ast_verb(0, "attempt_transfer failed.\n");
} else
- ast_queue_hangup(sub->owner);
+ ast_queue_hangup(sub->owner, -1);
} else {
if (l->subs[SUB_THREEWAY]) {
if (l->subs[SUB_THREEWAY]->owner)
- ast_queue_hangup(l->subs[SUB_THREEWAY]->owner);
+ ast_queue_hangup(l->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING);
else
ast_log(LOG_WARNING, "threeway sub without owner\n");
} else
@@ -2312,7 +2312,7 @@
if (unistimdebug)
ast_verb(0, "Transfer canceled, hangup our threeway channel\n");
if (p->subs[SUB_THREEWAY]->owner)
- ast_queue_hangup(p->subs[SUB_THREEWAY]->owner);
+ ast_queue_hangup(p->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING);
else
ast_log(LOG_WARNING, "Canceling a threeway channel without owner\n");
return;
@@ -2368,7 +2368,7 @@
/* start switch */
if (ast_pthread_create(&t, NULL, unistim_ss, c)) {
display_last_error("Unable to create switch thread");
- ast_queue_hangup(c);
+ ast_queue_hangup(c, AST_CAUSE_SWITCH_CONGESTION);
}
} else
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n",
Modified: team/russell/parking_updates/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/channels/chan_zap.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/channels/chan_zap.c (original)
+++ team/russell/parking_updates/channels/chan_zap.c Fri Apr 25 12:23:58 2008
@@ -4522,7 +4522,7 @@
/* It hasn't been long enough since the last flashook. This is probably a bounce on
hanging up. Hangup both channels now */
if (p->subs[SUB_THREEWAY].owner)
- ast_queue_hangup(p->subs[SUB_THREEWAY].owner);
+ ast_queue_hangup(p->subs[SUB_THREEWAY].owner, AST_CAUSE_NO_ANSWER);
p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
ast_debug(1, "Looks like a bounced flash, hanging up both calls on %d\n", p->channel);
ast_channel_unlock(p->subs[SUB_THREEWAY].owner);
@@ -10096,7 +10096,7 @@
ast_mutex_lock(&p->lock);
}
if (p->subs[x].owner) {
- ast_queue_hangup(p->subs[x].owner);
+ ast_queue_hangup(p->subs[x].owner, AST_CAUSE_PRE_EMPTED);
ast_channel_unlock(p->subs[x].owner);
}
}
Modified: team/russell/parking_updates/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/include/asterisk/channel.h?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/include/asterisk/channel.h (original)
+++ team/russell/parking_updates/include/asterisk/channel.h Fri Apr 25 12:23:58 2008
@@ -731,7 +731,7 @@
*
* \note The channel does not need to be locked before calling this function.
*/
-int ast_queue_hangup(struct ast_channel *chan);
+int ast_queue_hangup(struct ast_channel *chan, int cause);
/*!
* \brief Queue a control frame with payload
Modified: team/russell/parking_updates/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/russell/parking_updates/main/channel.c?view=diff&rev=114654&r1=114653&r2=114654
==============================================================================
--- team/russell/parking_updates/main/channel.c (original)
+++ team/russell/parking_updates/main/channel.c Fri Apr 25 12:23:58 2008
@@ -1000,12 +1000,19 @@
}
/*! \brief Queue a hangup frame for channel */
-int ast_queue_hangup(struct ast_channel *chan)
+int ast_queue_hangup(struct ast_channel *chan, int cause)
{
struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
+
+ if (cause >= 0)
+ f.seqno = cause;
+
/* Yeah, let's not change a lock-critical value without locking */
if (!ast_channel_trylock(chan)) {
chan->_softhangup |= AST_SOFTHANGUP_DEV;
+ if (cause < 0)
+ f.seqno = chan->hangupcause;
+
ast_channel_unlock(chan);
}
return ast_queue_frame(chan, &f);
@@ -2307,7 +2314,7 @@
struct ast_frame *f = NULL; /* the return value */
int blah;
int prestate;
- int count = 0;
+ int count = 0, cause = 0;
/* this function is very long so make sure there is only one return
* point at the end (there are only two exceptions to this).
@@ -2418,6 +2425,7 @@
/* Interpret hangup and return NULL */
/* XXX why not the same for frames from the channel ? */
if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
+ cause = f->seqno;
ast_frfree(f);
f = NULL;
}
@@ -2687,6 +2695,8 @@
} else {
/* Make sure we always return NULL in the future */
chan->_softhangup |= AST_SOFTHANGUP_DEV;
+ if (cause)
+ chan->hangupcause = cause;
if (chan->generator)
ast_deactivate_generator(chan);
/* End the CDR if appropriate */
More information about the asterisk-commits
mailing list