mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-21 13:14:00 +00:00
Compare commits
12 Commits
10.4.0-rc2
...
10.4.2
Author | SHA1 | Date | |
---|---|---|---|
|
f47b05fef2 | ||
|
eb647a0e64 | ||
|
5f9c43a1a5 | ||
|
3c812dc35c | ||
|
1efbf62a57 | ||
|
1c6aa76086 | ||
|
1fb8b57dbd | ||
|
7ac4bf201b | ||
|
dbe5bb1719 | ||
|
ae642a1089 | ||
|
1e883659b7 | ||
|
72e7cf1f44 |
69
ChangeLog
69
ChangeLog
@@ -1,3 +1,72 @@
|
||||
2012-05-30 Asterisk Development Team <asteriskteam@digium.com>
|
||||
|
||||
* Asterisk 10.4.2 Released.
|
||||
|
||||
* Resolve crash in subscribing for MWI notifications.
|
||||
|
||||
ASTOBJ_UNREF sets the variable to NULL after unreffing it, so the
|
||||
variable shoudl definitely not be used after that. To solve this in
|
||||
the two cases that affect subscribing for MWI notifications, we
|
||||
instead save the ref locally, and unref them in the error
|
||||
conditions.
|
||||
|
||||
(closes issue ASTERISK-19827)
|
||||
Reported by: B. R.
|
||||
Review: https://reviewboard.asterisk.org/r/1940/
|
||||
|
||||
* Fix crash in ConfBridge when user announcement is played for more
|
||||
than 2 users
|
||||
|
||||
A patch introduced in r354938 made it so that ConfBridge would not
|
||||
attempt to play sound files if those files did not exist.
|
||||
Unfortunately, ConfBridge uses the same underlying fucntion,
|
||||
play_sound_helper, to playback both the sound files and numbers to
|
||||
callers. When a number is being played back, the name of the sound
|
||||
file is expected to be NULL. This NULL value was passed into a
|
||||
function that tested for the existance of a sound file and is not
|
||||
tolerant to NULL file names, causing a crash.
|
||||
|
||||
This patch fixes the behavior, such that if a sound file does not
|
||||
exist we do not attempt to play it, but we only attempt that check
|
||||
if the sound file was specified in the first place. If a sound file
|
||||
was not specified, we use the 'play number' logic in the helper
|
||||
function.
|
||||
|
||||
(closes issue ASTERISK-19899)
|
||||
Reported by: Florian Gilcher
|
||||
Tested by: Florian Gilcher
|
||||
patches:
|
||||
ASTERISK-19899.diff uploaded by mjordan (license 6283)
|
||||
|
||||
2012-05-29 Asterisk Development Team <asteriskteam@digium.com>
|
||||
|
||||
* Asterisk 10.4.1 Released.
|
||||
|
||||
* AST-2012-007
|
||||
|
||||
* AST-2012-008
|
||||
|
||||
2012-05-02 Asterisk Development Team <asteriskteam@digium.com>
|
||||
|
||||
* Asterisk 10.4.0 Released.
|
||||
|
||||
2012-05-01 Asterisk Development Team <asteriskteam@digium.com>
|
||||
|
||||
* Asterisk 10.4.0-rc3 Released.
|
||||
|
||||
* channels/chan_sip.c: Revert revision 360862
|
||||
|
||||
Revision 360862 was intended to improve identities sent in dialog-info
|
||||
NOTIFY requests. Some users reported that hint became broken once this
|
||||
was done. It's not clear exactly what part of the patch has caused
|
||||
this regression, but broken hints are bad.
|
||||
|
||||
For now, this revision is being reverted so that the next releases of
|
||||
Asterisk do not have bad behavior in them. The original reported issue
|
||||
will have to be fixed differently in the next version of Asterisk.
|
||||
|
||||
(issue ASTERISK-16735)
|
||||
|
||||
2012-04-24 Asterisk Development Team <asteriskteam@digium.com>
|
||||
|
||||
* Asterisk 10.4.0-rc2 Released.
|
||||
|
@@ -1144,8 +1144,8 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
|
||||
struct ast_channel *underlying_channel;
|
||||
|
||||
/* Do not waste resources trying to play files that do not exist */
|
||||
if (!ast_fileexists(filename, NULL, NULL)) {
|
||||
ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
|
||||
if (!ast_strlen_zero(filename) && !ast_fileexists(filename, NULL, NULL)) {
|
||||
ast_log(LOG_WARNING, "File %s does not exist in any format\n", !ast_strlen_zero(filename) ? filename : "<unknown>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1165,7 +1165,7 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
|
||||
/* The channel is all under our control, in goes the prompt */
|
||||
if (!ast_strlen_zero(filename)) {
|
||||
ast_stream_and_wait(conference_bridge->playback_chan, filename, "");
|
||||
} else {
|
||||
} else if (say_number >= 0) {
|
||||
ast_say_number(conference_bridge->playback_chan, say_number, "", conference_bridge->playback_chan->language, NULL);
|
||||
}
|
||||
|
||||
@@ -1188,7 +1188,7 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
|
||||
*/
|
||||
static int play_sound_file(struct conference_bridge *conference_bridge, const char *filename)
|
||||
{
|
||||
return play_sound_helper(conference_bridge, filename, 0);
|
||||
return play_sound_helper(conference_bridge, filename, -1);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<!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.4.0-rc2</title></head>
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-10.4.2</title></head>
|
||||
<body>
|
||||
<h1 align="center"><a name="top">Release Summary</a></h1>
|
||||
<h3 align="center">asterisk-10.4.0-rc2</h3>
|
||||
<h3 align="center">Date: 2012-04-24</h3>
|
||||
<h3 align="center">asterisk-10.4.2</h3>
|
||||
<h3 align="center">Date: 2012-05-30</h3>
|
||||
<h3 align="center"><asteriskteam@digium.com></h3>
|
||||
<hr/>
|
||||
<h2 align="center">Table of Contents</h2>
|
||||
@@ -17,7 +17,7 @@
|
||||
<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.4.0-rc1.</p>
|
||||
<p>The data in this summary reflects changes that have been made since the previous release, asterisk-10.4.1.</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>
|
||||
@@ -41,21 +41,20 @@
|
||||
<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=363330">363330</a></td><td>bebuild</td><td>Create 10.4.0-rc2 tag</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=363332">363332</a></td><td>bebuild</td><td>Merge r363103-363104, r363107, r363156 for -rc2</td>
|
||||
<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=367958">367958</a></td><td>bebuild</td><td>Create 10.4.2 tag</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=367964">367964</a></td><td>bebuild</td><td>Merge r367267,367562 for 10.4.2</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 | 10
|
||||
asterisk-10.4.0-rc1-summary.html | 265 --------------------
|
||||
asterisk-10.4.0-rc1-summary.txt | 494 ---------------------------------------
|
||||
channels/chan_sip.c | 4
|
||||
channels/chan_skinny.c | 12
|
||||
main/manager.c | 34 ++
|
||||
7 files changed, 55 insertions(+), 766 deletions(-)
|
||||
.version | 2
|
||||
ChangeLog | 40 +++++++++++++++++++
|
||||
apps/app_confbridge.c | 8 +--
|
||||
asterisk-10.4.1-summary.html | 62 -----------------------------
|
||||
asterisk-10.4.1-summary.txt | 90 -------------------------------------------
|
||||
channels/chan_sip.c | 13 +++---
|
||||
6 files changed, 53 insertions(+), 162 deletions(-)
|
||||
</pre><br/>
|
||||
<hr/>
|
||||
</body>
|
@@ -1,8 +1,8 @@
|
||||
Release Summary
|
||||
|
||||
asterisk-10.4.0-rc2
|
||||
asterisk-10.4.2
|
||||
|
||||
Date: 2012-04-24
|
||||
Date: 2012-05-30
|
||||
|
||||
<asteriskteam@digium.com>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
release series.
|
||||
|
||||
The data in this summary reflects changes that have been made since the
|
||||
previous release, asterisk-10.4.0-rc1.
|
||||
previous release, asterisk-10.4.1.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
+------------------------------------------------------------------------+
|
||||
| Revision | Author | Summary | Issues Referenced |
|
||||
|----------+---------+-------------------------------+-------------------|
|
||||
| 363330 | bebuild | Create 10.4.0-rc2 tag | |
|
||||
| 367958 | bebuild | Create 10.4.2 tag | |
|
||||
|----------+---------+-------------------------------+-------------------|
|
||||
| 363332 | bebuild | Merge r363103-363104, | |
|
||||
| | | r363107, r363156 for -rc2 | |
|
||||
| 367964 | bebuild | Merge r367267,367562 for | |
|
||||
| | | 10.4.2 | |
|
||||
+------------------------------------------------------------------------+
|
||||
|
||||
----------------------------------------------------------------------
|
||||
@@ -79,13 +79,12 @@
|
||||
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 | 10
|
||||
asterisk-10.4.0-rc1-summary.html | 265 --------------------
|
||||
asterisk-10.4.0-rc1-summary.txt | 494 ---------------------------------------
|
||||
channels/chan_sip.c | 4
|
||||
channels/chan_skinny.c | 12
|
||||
main/manager.c | 34 ++
|
||||
7 files changed, 55 insertions(+), 766 deletions(-)
|
||||
.version | 2
|
||||
ChangeLog | 40 +++++++++++++++++++
|
||||
apps/app_confbridge.c | 8 +--
|
||||
asterisk-10.4.1-summary.html | 62 -----------------------------
|
||||
asterisk-10.4.1-summary.txt | 90 -------------------------------------------
|
||||
channels/chan_sip.c | 13 +++---
|
||||
6 files changed, 53 insertions(+), 162 deletions(-)
|
||||
|
||||
----------------------------------------------------------------------
|
@@ -1922,24 +1922,25 @@ static void send_signaling(struct chan_iax2_pvt *pvt)
|
||||
* we have received a destination call number. */
|
||||
static int queue_signalling(struct chan_iax2_pvt *pvt, struct ast_frame *f)
|
||||
{
|
||||
struct signaling_queue_entry *new;
|
||||
struct signaling_queue_entry *qe;
|
||||
|
||||
if (f->frametype == AST_FRAME_IAX || !pvt->hold_signaling) {
|
||||
return 1; /* do not queue this frame */
|
||||
} else if (!(new = ast_calloc(1, sizeof(struct signaling_queue_entry)))) {
|
||||
} else if (!(qe = ast_calloc(1, sizeof(struct signaling_queue_entry)))) {
|
||||
return -1; /* out of memory */
|
||||
}
|
||||
|
||||
memcpy(&new->f, f, sizeof(new->f)); /* copy ast_frame into our queue entry */
|
||||
|
||||
if (new->f.datalen) { /* if there is data in this frame copy it over as well */
|
||||
if (!(new->f.data.ptr = ast_calloc(1, new->f.datalen))) {
|
||||
free_signaling_queue_entry(new);
|
||||
/* copy ast_frame into our queue entry */
|
||||
qe->f = *f;
|
||||
if (qe->f.datalen) {
|
||||
/* if there is data in this frame copy it over as well */
|
||||
if (!(qe->f.data.ptr = ast_malloc(qe->f.datalen))) {
|
||||
free_signaling_queue_entry(qe);
|
||||
return -1;
|
||||
}
|
||||
memcpy(new->f.data.ptr, f->data.ptr, sizeof(*new->f.data.ptr));
|
||||
memcpy(qe->f.data.ptr, f->data.ptr, qe->f.datalen);
|
||||
}
|
||||
AST_LIST_INSERT_TAIL(&pvt->signaling_queue, new, next);
|
||||
AST_LIST_INSERT_TAIL(&pvt->signaling_queue, qe, next);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -4244,6 +4245,15 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
|
||||
struct ast_channel *owner = NULL;
|
||||
struct ast_channel *bridge = NULL;
|
||||
|
||||
/*
|
||||
* Clear fr->af.data if there is no data in the buffer. Things
|
||||
* like AST_CONTROL_HOLD without a suggested music class must
|
||||
* have a NULL pointer.
|
||||
*/
|
||||
if (!fr->af.datalen) {
|
||||
memset(&fr->af.data, 0, sizeof(fr->af.data));
|
||||
}
|
||||
|
||||
/* Attempt to recover wrapped timestamps */
|
||||
unwrap_timestamp(fr);
|
||||
|
||||
|
@@ -12778,13 +12778,14 @@ static int __sip_subscribe_mwi_do(struct sip_subscription_mwi *mwi)
|
||||
/* If we have no DNS manager let's do a lookup */
|
||||
if (!mwi->dnsmgr) {
|
||||
char transport[MAXHOSTNAMELEN];
|
||||
struct sip_subscription_mwi *saved;
|
||||
snprintf(transport, sizeof(transport), "_%s._%s", get_srv_service(mwi->transport), get_srv_protocol(mwi->transport));
|
||||
|
||||
mwi->us.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
|
||||
ASTOBJ_REF(mwi); /* Add a ref for storing the mwi on the dnsmgr for updates */
|
||||
ast_dnsmgr_lookup_cb(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL, on_dns_update_mwi, mwi);
|
||||
saved = ASTOBJ_REF(mwi);
|
||||
ast_dnsmgr_lookup_cb(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL, on_dns_update_mwi, saved);
|
||||
if (!mwi->dnsmgr) {
|
||||
ASTOBJ_UNREF(mwi, sip_subscribe_mwi_destroy); /* dnsmgr disabled, remove reference */
|
||||
ASTOBJ_UNREF(saved, sip_subscribe_mwi_destroy); /* dnsmgr disabled, remove reference */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12987,8 +12988,6 @@ static void state_notify_build_xml(int state, int full, const char *exten, const
|
||||
if ((state & AST_EXTENSION_RINGING) && sip_cfg.notifyringing) {
|
||||
const char *local_display = exten;
|
||||
char *local_target = ast_strdupa(mto);
|
||||
const char *remote_display = exten;
|
||||
char *remote_target = ast_strdupa(mfrom);
|
||||
|
||||
/* There are some limitations to how this works. The primary one is that the
|
||||
callee must be dialing the same extension that is being monitored. Simply dialing
|
||||
@@ -12998,28 +12997,16 @@ static void state_notify_build_xml(int state, int full, const char *exten, const
|
||||
|
||||
if ((caller = ast_channel_callback(find_calling_channel, NULL, p, 0))) {
|
||||
char *cid_num;
|
||||
char *connected_num;
|
||||
int need;
|
||||
|
||||
ast_channel_lock(caller);
|
||||
cid_num = S_COR(caller->caller.id.number.valid,
|
||||
caller->caller.id.number.str, "");
|
||||
need = strlen(cid_num) + strlen(p->fromdomain) + sizeof("sip:@");
|
||||
remote_target = alloca(need);
|
||||
snprintf(remote_target, need, "sip:%s@%s", cid_num, p->fromdomain);
|
||||
|
||||
remote_display = ast_strdupa(S_COR(caller->caller.id.name.valid,
|
||||
caller->caller.id.name.str, ""));
|
||||
|
||||
connected_num = S_COR(caller->connected.id.number.valid,
|
||||
caller->connected.id.number.str, "");
|
||||
need = strlen(connected_num) + strlen(p->fromdomain) + sizeof("sip:@");
|
||||
local_target = alloca(need);
|
||||
snprintf(local_target, need, "sip:%s@%s", connected_num, p->fromdomain);
|
||||
|
||||
local_display = ast_strdupa(S_COR(caller->connected.id.name.valid,
|
||||
caller->connected.id.name.str, ""));
|
||||
|
||||
snprintf(local_target, need, "sip:%s@%s", cid_num, p->fromdomain);
|
||||
local_display = ast_strdupa(S_COR(caller->caller.id.name.valid,
|
||||
caller->caller.id.name.str, ""));
|
||||
ast_channel_unlock(caller);
|
||||
caller = ast_channel_unref(caller);
|
||||
}
|
||||
@@ -13041,10 +13028,10 @@ static void state_notify_build_xml(int state, int full, const char *exten, const
|
||||
"<target uri=\"%s\"/>\n"
|
||||
"</remote>\n"
|
||||
"<local>\n"
|
||||
"<identity display=\"%s\">%s</identity>\n"
|
||||
"<identity>%s</identity>\n"
|
||||
"<target uri=\"%s\"/>\n"
|
||||
"</local>\n",
|
||||
remote_display, remote_target, remote_target, local_display, local_target, local_target);
|
||||
local_display, local_target, local_target, mto, mto);
|
||||
} else {
|
||||
ast_str_append(tmp, 0, "<dialog id=\"%s\" direction=\"recipient\">\n", exten);
|
||||
}
|
||||
@@ -30493,10 +30480,12 @@ static void sip_send_all_registers(void)
|
||||
static void sip_send_all_mwi_subscriptions(void)
|
||||
{
|
||||
ASTOBJ_CONTAINER_TRAVERSE(&submwil, 1, do {
|
||||
struct sip_subscription_mwi *saved;
|
||||
ASTOBJ_WRLOCK(iterator);
|
||||
AST_SCHED_DEL(sched, iterator->resub);
|
||||
if ((iterator->resub = ast_sched_add(sched, 1, sip_subscribe_mwi_do, ASTOBJ_REF(iterator))) < 0) {
|
||||
ASTOBJ_UNREF(iterator, sip_subscribe_mwi_destroy);
|
||||
saved = ASTOBJ_REF(iterator);
|
||||
if ((iterator->resub = ast_sched_add(sched, 1, sip_subscribe_mwi_do, saved)) < 0) {
|
||||
ASTOBJ_UNREF(saved, sip_subscribe_mwi_destroy);
|
||||
}
|
||||
ASTOBJ_UNLOCK(iterator);
|
||||
} while (0));
|
||||
|
@@ -3104,6 +3104,10 @@ static void update_connectedline(struct skinny_subchannel *sub, const void *data
|
||||
struct skinny_line *l = sub->line;
|
||||
struct skinny_device *d = l->device;
|
||||
|
||||
if (!d) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!c->caller.id.number.valid
|
||||
|| ast_strlen_zero(c->caller.id.number.str)
|
||||
|| !c->connected.id.number.valid
|
||||
@@ -4224,6 +4228,11 @@ static void *skinny_ss(void *data)
|
||||
int res = 0;
|
||||
int loop_pause = 100;
|
||||
|
||||
if (!d) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ast_verb(3, "Starting simple switch on '%s@%s'\n", l->name, d->name);
|
||||
|
||||
len = strlen(sub->exten);
|
||||
@@ -4332,7 +4341,7 @@ static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
|
||||
struct ast_var_t *current;
|
||||
int doautoanswer = 0;
|
||||
|
||||
if (!d->registered) {
|
||||
if (!d || !d->registered) {
|
||||
ast_log(LOG_ERROR, "Device not registered, cannot call %s\n", dest);
|
||||
return -1;
|
||||
}
|
||||
@@ -4731,7 +4740,13 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s
|
||||
struct skinny_subchannel *sub = ast->tech_pvt;
|
||||
struct skinny_line *l = sub->line;
|
||||
struct skinny_device *d = l->device;
|
||||
struct skinnysession *s = d->session;
|
||||
struct skinnysession *s;
|
||||
|
||||
if (!d) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return -1;
|
||||
}
|
||||
s = d->session;
|
||||
|
||||
if (!s) {
|
||||
ast_log(LOG_NOTICE, "Asked to indicate '%s' condition on channel %s, but session does not exist.\n", control2str(ind), ast->name);
|
||||
@@ -5462,6 +5477,11 @@ static int handle_transfer_button(struct skinny_subchannel *sub)
|
||||
l = sub->line;
|
||||
d = l->device;
|
||||
|
||||
if (!d) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!sub->related) {
|
||||
/* Another sub has not been created so this must be first XFER press */
|
||||
if (!(sub->substate == SUBSTATE_HOLD)) {
|
||||
@@ -5506,6 +5526,11 @@ static int handle_callforward_button(struct skinny_subchannel *sub, int cfwdtype
|
||||
struct skinny_device *d = l->device;
|
||||
struct ast_channel *c = sub->owner;
|
||||
|
||||
if (!d) {
|
||||
ast_log(LOG_WARNING, "Device for line %s is not registered.\n", l->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (d->hookstate == SKINNY_ONHOOK) {
|
||||
d->hookstate = SKINNY_OFFHOOK;
|
||||
transmit_speaker_mode(d, SKINNY_SPEAKERON);
|
||||
|
Reference in New Issue
Block a user