mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-28 00:53:35 +00:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
248d8ac9c4 | ||
|
6a2446e841 | ||
|
b5607cdb59 | ||
|
2cfe97162e | ||
|
60ec12a609 | ||
|
ebe3211bb6 | ||
|
e5bae0ddc5 | ||
|
1d55849d73 | ||
|
7ea5977f2f | ||
|
068ff012d5 | ||
|
f70d82e739 | ||
|
6f651f939e | ||
|
143fa8adf6 | ||
|
b8fc5be107 | ||
|
9fec338749 |
3
.lastclean
Normal file
3
.lastclean
Normal file
@@ -0,0 +1,3 @@
|
||||
39
|
||||
|
||||
|
@@ -1759,25 +1759,28 @@ static void free_user(struct ast_vm_user *vmu)
|
||||
static int vm_allocate_dh(struct vm_state *vms, struct ast_vm_user *vmu, int count_msg) {
|
||||
|
||||
int arraysize = (vmu->maxmsg > count_msg ? vmu->maxmsg : count_msg);
|
||||
if (!vms->dh_arraysize) {
|
||||
/* initial allocation */
|
||||
|
||||
/* remove old allocation */
|
||||
if (vms->deleted) {
|
||||
ast_free(vms->deleted);
|
||||
vms->deleted = NULL;
|
||||
}
|
||||
if (vms->heard) {
|
||||
ast_free(vms->heard);
|
||||
vms->heard = NULL;
|
||||
}
|
||||
vms->dh_arraysize = 0;
|
||||
|
||||
if (arraysize > 0) {
|
||||
if (!(vms->deleted = ast_calloc(arraysize, sizeof(int)))) {
|
||||
return -1;
|
||||
}
|
||||
if (!(vms->heard = ast_calloc(arraysize, sizeof(int)))) {
|
||||
ast_free(vms->deleted);
|
||||
vms->deleted = NULL;
|
||||
return -1;
|
||||
}
|
||||
vms->dh_arraysize = arraysize;
|
||||
} else if (vms->dh_arraysize < arraysize) {
|
||||
if (!(vms->deleted = ast_realloc(vms->deleted, arraysize * sizeof(int)))) {
|
||||
return -1;
|
||||
}
|
||||
if (!(vms->heard = ast_realloc(vms->heard, arraysize * sizeof(int)))) {
|
||||
return -1;
|
||||
}
|
||||
memset(vms->deleted, 0, arraysize * sizeof(int));
|
||||
memset(vms->heard, 0, arraysize * sizeof(int));
|
||||
vms->dh_arraysize = arraysize;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -6554,13 +6557,20 @@ static void adsi_message(struct ast_channel *chan, struct vm_state *vms)
|
||||
ast_callerid_parse(cid, &name, &num);
|
||||
if (!name)
|
||||
name = num;
|
||||
} else
|
||||
} else {
|
||||
name = "Unknown Caller";
|
||||
}
|
||||
|
||||
/* If deleted, show "undeleted" */
|
||||
|
||||
if (vms->deleted[vms->curmsg])
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_lock(&vms->lock);
|
||||
#endif
|
||||
if (vms->deleted[vms->curmsg]) {
|
||||
keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
|
||||
}
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_unlock(&vms->lock);
|
||||
#endif
|
||||
|
||||
/* Except "Exit" */
|
||||
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
|
||||
@@ -6613,8 +6623,15 @@ static void adsi_delete(struct ast_channel *chan, struct vm_state *vms)
|
||||
}
|
||||
|
||||
/* If deleted, show "undeleted" */
|
||||
if (vms->deleted[vms->curmsg])
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_lock(&vms->lock);
|
||||
#endif
|
||||
if (vms->deleted[vms->curmsg]) {
|
||||
keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
|
||||
}
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_unlock(&vms->lock);
|
||||
#endif
|
||||
|
||||
/* Except "Exit" */
|
||||
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
|
||||
@@ -7795,8 +7812,12 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc
|
||||
|
||||
if (!res) {
|
||||
make_file(vms->fn, sizeof(vms->fn), vms->curdir, vms->curmsg);
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_lock(&vms->lock);
|
||||
#endif
|
||||
vms->heard[vms->curmsg] = 1;
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_unlock(&vms->lock);
|
||||
/*IMAP storage stores any prepended message from a forward
|
||||
* as a separate file from the rest of the message
|
||||
*/
|
||||
@@ -8011,6 +8032,7 @@ static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
}
|
||||
ast_unlock_path(vms->curdir);
|
||||
#else /* defined(IMAP_STORAGE) */
|
||||
ast_mutex_lock(&vms->lock);
|
||||
if (vms->deleted) {
|
||||
/* Since we now expunge after each delete, deleting in reverse order
|
||||
* ensures that no reordering occurs between each step. */
|
||||
@@ -8025,12 +8047,18 @@ static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
#endif
|
||||
|
||||
done:
|
||||
if (vms->deleted && last_msg_idx) {
|
||||
if (vms->deleted) {
|
||||
ast_free(vms->deleted);
|
||||
vms->deleted = NULL;
|
||||
}
|
||||
if (vms->heard && last_msg_idx) {
|
||||
if (vms->heard) {
|
||||
ast_free(vms->heard);
|
||||
vms->heard = NULL;
|
||||
}
|
||||
vms->dh_arraysize = 0;
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_unlock(&vms->lock);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -9125,14 +9153,25 @@ static int vm_instructions_en(struct ast_channel *chan, struct ast_vm_user *vmu,
|
||||
res = ast_play_and_wait(chan, "vm-next");
|
||||
}
|
||||
if (!res) {
|
||||
if (!vms->deleted[vms->curmsg])
|
||||
int curmsg_deleted;
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_lock(&vms->lock);
|
||||
#endif
|
||||
curmsg_deleted = vms->deleted[vms->curmsg];
|
||||
#ifdef IMAP_STORAGE
|
||||
ast_mutex_unlock(&vms->lock);
|
||||
#endif
|
||||
if (!curmsg_deleted) {
|
||||
res = ast_play_and_wait(chan, "vm-delete");
|
||||
else
|
||||
} else {
|
||||
res = ast_play_and_wait(chan, "vm-undelete");
|
||||
if (!res)
|
||||
}
|
||||
if (!res) {
|
||||
res = ast_play_and_wait(chan, "vm-toforward");
|
||||
if (!res)
|
||||
}
|
||||
if (!res) {
|
||||
res = ast_play_and_wait(chan, "vm-savemessage");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!res) {
|
||||
@@ -10169,6 +10208,7 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
|
||||
}
|
||||
|
||||
vms.starting = 1;
|
||||
vms.curmsg = 0;
|
||||
break;
|
||||
case '3': /* Advanced options */
|
||||
ast_test_suite_event_notify("ADVOPTIONS", "Message: entering advanced options menu");
|
||||
|
61
asterisk-10.6.1-summary.html
Normal file
61
asterisk-10.6.1-summary.html
Normal file
@@ -0,0 +1,61 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-10.6.1</title></head>
|
||||
<body>
|
||||
<h1 align="center"><a name="top">Release Summary</a></h1>
|
||||
<h3 align="center">asterisk-10.6.1</h3>
|
||||
<h3 align="center">Date: 2012-07-16</h3>
|
||||
<h3 align="center"><asteriskteam@digium.com></h3>
|
||||
<hr/>
|
||||
<h2 align="center">Table of Contents</h2>
|
||||
<ol>
|
||||
<li><a href="#summary">Summary</a></li>
|
||||
<li><a href="#contributors">Contributors</a></li>
|
||||
<li><a href="#commits">Other Changes</a></li>
|
||||
<li><a href="#diffstat">Diffstat</a></li>
|
||||
</ol>
|
||||
<hr/>
|
||||
<a name="summary"><h2 align="center">Summary</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This release includes only bug fixes. The changes included were made only to address problems that have been identified in this release series. Users should be able to safely upgrade to this version if this release series is already in use. Users considering upgrading from a previous release series are strongly encouraged to review the UPGRADE.txt document as well as the CHANGES document for information about upgrading to this release series.</p>
|
||||
<p>The data in this summary reflects changes that have been made since the previous release, asterisk-10.6.0.</p>
|
||||
<hr/>
|
||||
<a name="contributors"><h2 align="center">Contributors</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were closed by commits that went into this release.</p>
|
||||
<table width="100%" border="0">
|
||||
<tr>
|
||||
<td width="33%"><h3>Coders</h3></td>
|
||||
<td width="33%"><h3>Testers</h3></td>
|
||||
<td width="33%"><h3>Reporters</h3></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
3 bebuild<br/>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<hr/>
|
||||
<a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a list of all changes that went into this release that did not directly close an issue from the issue tracker. The commits may have been marked as being related to an issue. If that is the case, the issue numbers are listed here, as well.</p>
|
||||
<table width="100%" border="1">
|
||||
<tr><td><b>Revision</b></td><td><b>Author</b></td><td><b>Summary</b></td><td><b>Issues Referenced</b></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=370079">370079</a></td><td>bebuild</td><td>Create 10.6.1</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=370102">370102</a></td><td>bebuild</td><td>Merge 369732 for 10.6.1</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=370106">370106</a></td><td>bebuild</td><td>Update ChangeLog</td>
|
||||
<td></td></tr></table>
|
||||
<hr/>
|
||||
<a name="diffstat"><h2 align="center">Diffstat Results</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p>
|
||||
<pre>
|
||||
.version | 2
|
||||
ChangeLog | 16 +
|
||||
asterisk-10.6.0-summary.html | 439 ---------------------------------
|
||||
asterisk-10.6.0-summary.txt | 570 -------------------------------------------
|
||||
main/tcptls.c | 3
|
||||
5 files changed, 17 insertions(+), 1013 deletions(-)
|
||||
</pre><br/>
|
||||
<hr/>
|
||||
</body>
|
||||
</html>
|
90
asterisk-10.6.1-summary.txt
Normal file
90
asterisk-10.6.1-summary.txt
Normal file
@@ -0,0 +1,90 @@
|
||||
Release Summary
|
||||
|
||||
asterisk-10.6.1
|
||||
|
||||
Date: 2012-07-16
|
||||
|
||||
<asteriskteam@digium.com>
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Table of Contents
|
||||
|
||||
1. Summary
|
||||
2. Contributors
|
||||
3. Other Changes
|
||||
4. Diffstat
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Summary
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This release includes only bug fixes. The changes included were made only
|
||||
to address problems that have been identified in this release series.
|
||||
Users should be able to safely upgrade to this version if this release
|
||||
series is already in use. Users considering upgrading from a previous
|
||||
release series are strongly encouraged to review the UPGRADE.txt document
|
||||
as well as the CHANGES document for information about upgrading to this
|
||||
release series.
|
||||
|
||||
The data in this summary reflects changes that have been made since the
|
||||
previous release, asterisk-10.6.0.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Contributors
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This table lists the people who have submitted code, those that have
|
||||
tested patches, as well as those that reported issues on the issue tracker
|
||||
that were resolved in this release. For coders, the number is how many of
|
||||
their patches (of any size) were committed into this release. For testers,
|
||||
the number is the number of times their name was listed as assisting with
|
||||
testing a patch. Finally, for reporters, the number is the number of
|
||||
issues that they reported that were closed by commits that went into this
|
||||
release.
|
||||
|
||||
Coders Testers Reporters
|
||||
3 bebuild
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Commits Not Associated with an Issue
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a list of all changes that went into this release that did not
|
||||
directly close an issue from the issue tracker. The commits may have been
|
||||
marked as being related to an issue. If that is the case, the issue
|
||||
numbers are listed here, as well.
|
||||
|
||||
+------------------------------------------------------------------------+
|
||||
| Revision | Author | Summary | Issues Referenced |
|
||||
|------------+-----------+--------------------------+--------------------|
|
||||
| 370079 | bebuild | Create 10.6.1 | |
|
||||
|------------+-----------+--------------------------+--------------------|
|
||||
| 370102 | bebuild | Merge 369732 for 10.6.1 | |
|
||||
|------------+-----------+--------------------------+--------------------|
|
||||
| 370106 | bebuild | Update ChangeLog | |
|
||||
+------------------------------------------------------------------------+
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Diffstat Results
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a summary of the changes to the source code that went into this
|
||||
release that was generated using the diffstat utility.
|
||||
|
||||
.version | 2
|
||||
ChangeLog | 16 +
|
||||
asterisk-10.6.0-summary.html | 439 ---------------------------------
|
||||
asterisk-10.6.0-summary.txt | 570 -------------------------------------------
|
||||
main/tcptls.c | 3
|
||||
5 files changed, 17 insertions(+), 1013 deletions(-)
|
||||
|
||||
----------------------------------------------------------------------
|
@@ -3870,7 +3870,7 @@ static int __sip_autodestruct(const void *data)
|
||||
ast_debug(3, "Re-scheduled destruction of SIP call %s\n", p->callid ? p->callid : "<unknown>");
|
||||
append_history(p, "ReliableXmit", "timeout");
|
||||
if (sscanf(p->lastmsg, "Tx: %30s", method_str) == 1 || sscanf(p->lastmsg, "Rx: %30s", method_str) == 1) {
|
||||
if (method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
|
||||
if (p->ongoing_reinvite || method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
|
||||
pvt_set_needdestroy(p, "autodestruct");
|
||||
}
|
||||
}
|
||||
@@ -6266,6 +6266,21 @@ const char *hangup_cause2sip(int cause)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int reinvite_timeout(const void *data)
|
||||
{
|
||||
struct sip_pvt *dialog = (struct sip_pvt *) data;
|
||||
struct ast_channel *owner = sip_pvt_lock_full(dialog);
|
||||
dialog->reinviteid = -1;
|
||||
check_pendings(dialog);
|
||||
if (owner) {
|
||||
ast_channel_unlock(owner);
|
||||
ast_channel_unref(owner);
|
||||
}
|
||||
ao2_unlock(dialog);
|
||||
dialog_unref(dialog, "unref for reinvite timeout");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief sip_hangup: Hangup SIP call
|
||||
* Part of PBX interface, called from ast_hangup */
|
||||
static int sip_hangup(struct ast_channel *ast)
|
||||
@@ -6460,8 +6475,16 @@ static int sip_hangup(struct ast_channel *ast)
|
||||
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
|
||||
ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE);
|
||||
AST_SCHED_DEL_UNREF(sched, p->waitid, dialog_unref(p, "when you delete the waitid sched, you should dec the refcount for the stored dialog ptr"));
|
||||
if (sip_cancel_destroy(p))
|
||||
if (sip_cancel_destroy(p)) {
|
||||
ast_log(LOG_WARNING, "Unable to cancel SIP destruction. Expect bad things.\n");
|
||||
}
|
||||
/* If we have an ongoing reinvite, there is a chance that we have gotten a provisional
|
||||
* response, but something weird has happened and we will never receive a final response.
|
||||
* So, just in case, check for pending actions after a bit of time to trigger the pending
|
||||
* bye that we are setting above */
|
||||
if (p->ongoing_reinvite && p->reinviteid < 0) {
|
||||
p->reinviteid = ast_sched_add(sched, 32 * p->timer_t1, reinvite_timeout, dialog_ref(p, "ref for reinvite_timeout"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7791,6 +7814,7 @@ struct sip_pvt *sip_alloc(ast_string_field callid, struct ast_sockaddr *addr,
|
||||
p->method = intended_method;
|
||||
p->initid = -1;
|
||||
p->waitid = -1;
|
||||
p->reinviteid = -1;
|
||||
p->autokillid = -1;
|
||||
p->request_queue_sched_id = -1;
|
||||
p->provisional_keepalive_sched_id = -1;
|
||||
@@ -10657,10 +10681,9 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, ui
|
||||
* final response. For a CANCEL or ACK, we have to send to the same destination
|
||||
* as the original INVITE.
|
||||
*/
|
||||
if (sipmethod == SIP_CANCEL ||
|
||||
(sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED))) {
|
||||
set_destination(p, ast_strdupa(p->uri));
|
||||
} else if (p->route) {
|
||||
if (p->route &&
|
||||
!(sipmethod == SIP_CANCEL ||
|
||||
(sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED)))) {
|
||||
set_destination(p, p->route->hop);
|
||||
add_route(req, is_strict ? p->route->next : p->route);
|
||||
}
|
||||
@@ -12278,7 +12301,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, int t38version, int old
|
||||
initialize_initreq(p, &req);
|
||||
p->lastinvite = p->ocseq;
|
||||
ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Change direction of this dialog */
|
||||
|
||||
p->ongoing_reinvite = 1;
|
||||
return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
|
||||
}
|
||||
|
||||
@@ -20463,8 +20486,11 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req, char
|
||||
static void check_pendings(struct sip_pvt *p)
|
||||
{
|
||||
if (ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
|
||||
/* if we can't BYE, then this is really a pending CANCEL */
|
||||
if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
|
||||
if (p->reinviteid > -1) {
|
||||
/* Outstanding p->reinviteid timeout, so wait... */
|
||||
return;
|
||||
} else if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
|
||||
/* if we can't BYE, then this is really a pending CANCEL */
|
||||
p->invitestate = INV_CANCELLED;
|
||||
transmit_request(p, SIP_CANCEL, p->lastinvite, XMIT_RELIABLE, FALSE);
|
||||
/* If the cancel occurred on an initial invite, cancel the pending BYE */
|
||||
@@ -20475,8 +20501,9 @@ static void check_pendings(struct sip_pvt *p)
|
||||
INVITE, but do set an autodestruct just in case we never get it. */
|
||||
} else {
|
||||
/* We have a pending outbound invite, don't send something
|
||||
new in-transaction */
|
||||
if (p->pendinginvite)
|
||||
* new in-transaction, unless it is a pending reinvite, then
|
||||
* by the time we are called here, we should probably just hang up. */
|
||||
if (p->pendinginvite && !p->ongoing_reinvite)
|
||||
return;
|
||||
|
||||
if (p->owner) {
|
||||
@@ -20686,9 +20713,17 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
|
||||
if (resp >= 300 && (p->invitestate == INV_CALLING || p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA ))
|
||||
p->invitestate = INV_COMPLETED;
|
||||
|
||||
if ((resp >= 200 && reinvite)) {
|
||||
p->ongoing_reinvite = 0;
|
||||
if (p->reinviteid > -1) {
|
||||
AST_SCHED_DEL_UNREF(sched, p->reinviteid, dialog_unref(p, "unref dialog for reinvite timeout because of a final response"));
|
||||
}
|
||||
}
|
||||
|
||||
/* Final response, clear out pending invite */
|
||||
if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite)
|
||||
if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite) {
|
||||
p->pendinginvite = 0;
|
||||
}
|
||||
|
||||
/* If this is a response to our initial INVITE, we need to set what we can use
|
||||
* for this peer.
|
||||
@@ -30064,6 +30099,12 @@ static int apply_directmedia_ha(struct sip_pvt *p1, struct sip_pvt *p2, const ch
|
||||
ast_rtp_instance_get_remote_address(p1->rtp, &them);
|
||||
ast_rtp_instance_get_local_address(p1->rtp, &us);
|
||||
|
||||
/* If p2 is a guest call, there will be no peer. If there is no peer, there
|
||||
* is no directmediaha, so go ahead and allow it */
|
||||
if (!p2->relatedpeer) {
|
||||
return res;
|
||||
}
|
||||
|
||||
if ((res = ast_apply_ha(p2->relatedpeer->directmediaha, &them)) == AST_SENSE_DENY) {
|
||||
const char *us_addr = ast_strdupa(ast_sockaddr_stringify(&us));
|
||||
const char *them_addr = ast_strdupa(ast_sockaddr_stringify(&them));
|
||||
|
@@ -4976,6 +4976,11 @@ static void setsubstate(struct skinny_subchannel *sub, int state)
|
||||
pthread_t t;
|
||||
int actualstate = state;
|
||||
|
||||
if (!l->device) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sub->substate == SUBSTATE_ONHOOK) {
|
||||
return;
|
||||
}
|
||||
@@ -5365,15 +5370,20 @@ static void dumpsub(struct skinny_subchannel *sub, int forcehangup)
|
||||
struct skinny_subchannel *activatesub = NULL;
|
||||
struct skinny_subchannel *tsub;
|
||||
|
||||
if (!l->device) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (skinnydebug) {
|
||||
ast_verb(3, "Sub %d - Dumping\n", sub->callid);
|
||||
}
|
||||
|
||||
|
||||
if (!forcehangup && sub->substate == SUBSTATE_HOLD) {
|
||||
l->activesub = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (sub == l->activesub) {
|
||||
d->hookstate = SKINNY_ONHOOK;
|
||||
transmit_speaker_mode(d, SKINNY_SPEAKEROFF);
|
||||
|
@@ -1099,6 +1099,7 @@ struct sip_pvt {
|
||||
struct sip_auth_container *peerauth;/*!< Realm authentication credentials */
|
||||
int noncecount; /*!< Nonce-count */
|
||||
unsigned int stalenonce:1; /*!< Marks the current nonce as responded too */
|
||||
unsigned int ongoing_reinvite:1; /*!< There is a reinvite in progress that might need to be cleaned up */
|
||||
char lastmsg[256]; /*!< Last Message sent/received */
|
||||
int amaflags; /*!< AMA Flags */
|
||||
uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
|
||||
@@ -1111,6 +1112,7 @@ struct sip_pvt {
|
||||
|
||||
int initid; /*!< Auto-congest ID if appropriate (scheduler) */
|
||||
int waitid; /*!< Wait ID for scheduler after 491 or other delays */
|
||||
int reinviteid; /*!< Reinvite in case of provisional, but no final response */
|
||||
int autokillid; /*!< Auto-kill ID (scheduler) */
|
||||
int t38id; /*!< T.38 Response ID */
|
||||
struct sip_refer *refer; /*!< REFER: SIP transfer data structure */
|
||||
|
192
main/features.c
192
main/features.c
@@ -4619,7 +4619,6 @@ static int manage_parked_call(struct parkeduser *pu, const struct pollfd *pfds,
|
||||
struct ast_channel *chan = pu->chan; /* shorthand */
|
||||
int tms; /* timeout for this item */
|
||||
int x; /* fd index in channel */
|
||||
int parking_complete = 0;
|
||||
|
||||
tms = ast_tvdiff_ms(ast_tvnow(), pu->start);
|
||||
if (tms > pu->parkingtime) {
|
||||
@@ -4734,104 +4733,103 @@ static int manage_parked_call(struct parkeduser *pu, const struct pollfd *pfds,
|
||||
}
|
||||
|
||||
/* And take them out of the parking lot */
|
||||
parking_complete = 1;
|
||||
} else { /* still within parking time, process descriptors */
|
||||
x = 0;
|
||||
if (pfds) {
|
||||
for (; x < AST_MAX_FDS; x++) {
|
||||
struct ast_frame *f;
|
||||
int y;
|
||||
|
||||
if (chan->fds[x] == -1) {
|
||||
continue; /* nothing on this descriptor */
|
||||
}
|
||||
|
||||
for (y = 0; y < nfds; y++) {
|
||||
if (pfds[y].fd == chan->fds[x]) {
|
||||
/* Found poll record! */
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (y == nfds) {
|
||||
/* Not found */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(pfds[y].revents & (POLLIN | POLLERR | POLLPRI))) {
|
||||
/* Next x */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pfds[y].revents & POLLPRI) {
|
||||
ast_set_flag(chan, AST_FLAG_EXCEPTION);
|
||||
} else {
|
||||
ast_clear_flag(chan, AST_FLAG_EXCEPTION);
|
||||
}
|
||||
chan->fdno = x;
|
||||
|
||||
/* See if they need servicing */
|
||||
f = ast_read(pu->chan);
|
||||
/* Hangup? */
|
||||
if (!f || (f->frametype == AST_FRAME_CONTROL
|
||||
&& f->subclass.integer == AST_CONTROL_HANGUP)) {
|
||||
if (f) {
|
||||
ast_frfree(f);
|
||||
}
|
||||
post_manager_event("ParkedCallGiveUp", pu);
|
||||
ast_cel_report_event(pu->chan, AST_CEL_PARK_END, NULL, "ParkedCallGiveUp",
|
||||
NULL);
|
||||
|
||||
/* There's a problem, hang them up */
|
||||
ast_verb(2, "%s got tired of being parked\n", chan->name);
|
||||
ast_hangup(chan);
|
||||
|
||||
/* And take them out of the parking lot */
|
||||
parking_complete = 1;
|
||||
break;
|
||||
} else {
|
||||
/* XXX Maybe we could do something with packets, like dial "0" for operator or something XXX */
|
||||
ast_frfree(f);
|
||||
if (pu->hold_method == AST_CONTROL_HOLD
|
||||
&& pu->moh_trys < 3
|
||||
&& !chan->generatordata) {
|
||||
ast_debug(1,
|
||||
"MOH on parked call stopped by outside source. Restarting on channel %s.\n",
|
||||
chan->name);
|
||||
ast_indicate_data(chan, AST_CONTROL_HOLD,
|
||||
S_OR(pu->parkinglot->cfg.mohclass, NULL),
|
||||
(!ast_strlen_zero(pu->parkinglot->cfg.mohclass)
|
||||
? strlen(pu->parkinglot->cfg.mohclass) + 1 : 0));
|
||||
pu->moh_trys++;
|
||||
}
|
||||
goto std; /* XXX Ick: jumping into an else statement??? XXX */
|
||||
}
|
||||
} /* End for */
|
||||
}
|
||||
if (x >= AST_MAX_FDS) {
|
||||
std:
|
||||
for (x = 0; x < AST_MAX_FDS; x++) { /* mark fds for next round */
|
||||
if (chan->fds[x] > -1) {
|
||||
void *tmp = ast_realloc(*new_pfds,
|
||||
(*new_nfds + 1) * sizeof(struct pollfd));
|
||||
|
||||
if (!tmp) {
|
||||
continue;
|
||||
}
|
||||
*new_pfds = tmp;
|
||||
(*new_pfds)[*new_nfds].fd = chan->fds[x];
|
||||
(*new_pfds)[*new_nfds].events = POLLIN | POLLERR | POLLPRI;
|
||||
(*new_pfds)[*new_nfds].revents = 0;
|
||||
(*new_nfds)++;
|
||||
}
|
||||
}
|
||||
/* Keep track of our shortest wait */
|
||||
if (tms < *ms || *ms < 0) {
|
||||
*ms = tms;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return parking_complete;
|
||||
/* still within parking time, process descriptors */
|
||||
if (pfds) {
|
||||
for (x = 0; x < AST_MAX_FDS; x++) {
|
||||
struct ast_frame *f;
|
||||
int y;
|
||||
|
||||
if (chan->fds[x] == -1) {
|
||||
continue; /* nothing on this descriptor */
|
||||
}
|
||||
|
||||
for (y = 0; y < nfds; y++) {
|
||||
if (pfds[y].fd == chan->fds[x]) {
|
||||
/* Found poll record! */
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (y == nfds) {
|
||||
/* Not found */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(pfds[y].revents & (POLLIN | POLLERR | POLLPRI))) {
|
||||
/* Next x */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pfds[y].revents & POLLPRI) {
|
||||
ast_set_flag(chan, AST_FLAG_EXCEPTION);
|
||||
} else {
|
||||
ast_clear_flag(chan, AST_FLAG_EXCEPTION);
|
||||
}
|
||||
chan->fdno = x;
|
||||
|
||||
/* See if they need servicing */
|
||||
f = ast_read(pu->chan);
|
||||
/* Hangup? */
|
||||
if (!f || (f->frametype == AST_FRAME_CONTROL
|
||||
&& f->subclass.integer == AST_CONTROL_HANGUP)) {
|
||||
if (f) {
|
||||
ast_frfree(f);
|
||||
}
|
||||
post_manager_event("ParkedCallGiveUp", pu);
|
||||
ast_cel_report_event(pu->chan, AST_CEL_PARK_END, NULL, "ParkedCallGiveUp",
|
||||
NULL);
|
||||
|
||||
/* There's a problem, hang them up */
|
||||
ast_verb(2, "%s got tired of being parked\n", chan->name);
|
||||
ast_hangup(chan);
|
||||
|
||||
/* And take them out of the parking lot */
|
||||
return 1;
|
||||
} else {
|
||||
/* XXX Maybe we could do something with packets, like dial "0" for operator or something XXX */
|
||||
ast_frfree(f);
|
||||
if (pu->hold_method == AST_CONTROL_HOLD
|
||||
&& pu->moh_trys < 3
|
||||
&& !chan->generatordata) {
|
||||
ast_debug(1,
|
||||
"MOH on parked call stopped by outside source. Restarting on channel %s.\n",
|
||||
chan->name);
|
||||
ast_indicate_data(chan, AST_CONTROL_HOLD,
|
||||
S_OR(pu->parkinglot->cfg.mohclass, NULL),
|
||||
(!ast_strlen_zero(pu->parkinglot->cfg.mohclass)
|
||||
? strlen(pu->parkinglot->cfg.mohclass) + 1 : 0));
|
||||
pu->moh_trys++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} /* End for */
|
||||
}
|
||||
|
||||
/* mark fds for next round */
|
||||
for (x = 0; x < AST_MAX_FDS; x++) {
|
||||
if (chan->fds[x] > -1) {
|
||||
void *tmp = ast_realloc(*new_pfds,
|
||||
(*new_nfds + 1) * sizeof(struct pollfd));
|
||||
|
||||
if (!tmp) {
|
||||
continue;
|
||||
}
|
||||
*new_pfds = tmp;
|
||||
(*new_pfds)[*new_nfds].fd = chan->fds[x];
|
||||
(*new_pfds)[*new_nfds].events = POLLIN | POLLERR | POLLPRI;
|
||||
(*new_pfds)[*new_nfds].revents = 0;
|
||||
(*new_nfds)++;
|
||||
}
|
||||
}
|
||||
/* Keep track of our shortest wait */
|
||||
if (tms < *ms || *ms < 0) {
|
||||
*ms = tms;
|
||||
}
|
||||
|
||||
/* Stay in the parking lot. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Run management on parkinglots, called once per parkinglot */
|
||||
|
@@ -130,9 +130,6 @@ HOOK_T ast_tcptls_server_write(struct ast_tcptls_session_instance *tcptls_sessio
|
||||
static void session_instance_destructor(void *obj)
|
||||
{
|
||||
struct ast_tcptls_session_instance *i = obj;
|
||||
if (i->parent && i->parent->tls_cfg) {
|
||||
ast_ssl_teardown(i->parent->tls_cfg);
|
||||
}
|
||||
ast_mutex_destroy(&i->lock);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user