Merged revisions 7265-7266,7268-7275 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r7265 | oej | 2005-12-01 17:18:14 -0600 (Thu, 01 Dec 2005) | 2 lines

Changing bug report address to the Asterisk issue tracker

........
r7266 | kpfleming | 2005-12-01 17:18:29 -0600 (Thu, 01 Dec 2005) | 3 lines

Makefile 'update' target now supports updating from Subversion repositories (issue #5875)
remove support for 'patches' subdirectory, it's no longer useful

........
r7268 | kpfleming | 2005-12-01 17:34:58 -0600 (Thu, 01 Dec 2005) | 2 lines

ensure channel's scheduling context is freed (issue #5788)

........
r7269 | kpfleming | 2005-12-01 17:49:44 -0600 (Thu, 01 Dec 2005) | 2 lines

don't block waiting for the Festival server forever when it goes away (issue #5882)

........
r7270 | kpfleming | 2005-12-01 18:26:12 -0600 (Thu, 01 Dec 2005) | 2 lines

allow variables to exist on both 'halves' of the Local channel (issue #5810)

........
r7271 | kpfleming | 2005-12-01 18:28:48 -0600 (Thu, 01 Dec 2005) | 2 lines

protect agent_bridgedchannel() from segfaulting when there is no bridged channel (issue #5879)

........
r7272 | kpfleming | 2005-12-01 18:39:00 -0600 (Thu, 01 Dec 2005) | 3 lines

properly handle password changes when mailbox is last line of config file and not followed by a newline (issue #5870)
reformat password changing code to conform to coding guidelines (issue #5870)

........
r7273 | kpfleming | 2005-12-01 18:42:40 -0600 (Thu, 01 Dec 2005) | 2 lines

allow previous context-searching behavior to be used if desired (issue #5899)

........
r7274 | kpfleming | 2005-12-01 18:51:15 -0600 (Thu, 01 Dec 2005) | 2 lines

inherit channel variables into channels created by Page() application (issue #5888)

........
r7275 | oej | 2005-12-01 18:52:13 -0600 (Thu, 01 Dec 2005) | 2 lines

Bug #5907. Improve SIP INFO DTMF debugging output. (1.2 & Trunk)

........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7276 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Kevin P. Fleming 20 years ago
parent 6b8a8926ab
commit 0242a69b3f

@ -592,17 +592,16 @@ datafiles: all
mkdir -p $(DESTDIR)$(AGI_DIR) mkdir -p $(DESTDIR)$(AGI_DIR)
update: update:
@if [ -d CVS ]; then \ @if [ -d .svn ]; then \
if [ -f patches/.applied ]; then \ echo "Updating from Subversion..." ; \
patches=`cat patches/.applied`; \ svn update | tee update.out; \
fi; \ rm -f .version; \
if [ ! -z "$$patches" ]; then \ if [ `grep -c ^C update.out` -gt 0 ]; then \
for x in $$patches; do \ echo ; echo "The following files have conflicts:" ; \
echo "Unapplying $$x..."; \ grep ^C update.out | cut -b4- ; \
patch -R -p0 < patches/$$x; \
done; \
rm -f patches/.applied; \
fi ; \ fi ; \
rm -f update.out; \
elif [ -d CVS ]; then \
echo "Updating from CVS..." ; \ echo "Updating from CVS..." ; \
cvs -q -z3 update -Pd | tee update.out; \ cvs -q -z3 update -Pd | tee update.out; \
rm -f .version; \ rm -f .version; \
@ -611,19 +610,8 @@ update:
grep ^C update.out | cut -d' ' -f2- ; \ grep ^C update.out | cut -d' ' -f2- ; \
fi ; \ fi ; \
rm -f update.out; \ rm -f update.out; \
if [ ! -z "$$patches" ]; then \
for x in $$patches; do \
if [ -f patches/$$x ]; then \
echo "Applying patch $$x..."; \
patch -p0 < patches/$$x; \
echo $$x >> patches/.applied; \
else \
echo "Patch $$x no longer relevant"; \
fi; \
done; \
fi; \
else \ else \
echo "Not CVS"; \ echo "Not under version control"; \
fi fi
NEWHEADERS=$(notdir $(wildcard include/asterisk/*.h)) NEWHEADERS=$(notdir $(wildcard include/asterisk/*.h))
@ -911,47 +899,3 @@ cleantest:
if cmp -s .cleancount .lastclean ; then echo ; else \ if cmp -s .cleancount .lastclean ; then echo ; else \
$(MAKE) clean; cp -f .cleancount .lastclean;\ $(MAKE) clean; cp -f .cleancount .lastclean;\
fi fi
patchlist:
@echo "Experimental Patches:"
@for x in patches/*; do \
patch=`basename $$x`; \
if [ "$$patch" = "CVS" ]; then \
continue; \
fi; \
if grep -q ^$$patch$$ patches/.applied; then \
echo "$$patch (applied)"; \
else \
echo "$$patch (available)"; \
fi; \
done
apply:
@if [ -z "$(PATCH)" ]; then \
echo "Usage: make PATCH=<patchname> apply"; \
elif grep -q ^$(PATCH)$$ patches/.applied 2>/dev/null; then \
echo "Patch $(PATCH) is already applied"; \
elif [ -f "patches/$(PATCH)" ]; then \
echo "Applying patch $(PATCH)"; \
patch -p0 < patches/$(PATCH); \
echo "$(PATCH)" >> patches/.applied; \
else \
echo "No such patch $(PATCH) in patches directory"; \
fi
unapply:
@if [ -z "$(PATCH)" ]; then \
echo "Usage: make PATCH=<patchname> unapply"; \
elif grep -v -q ^$(PATCH)$$ patches/.applied 2>/dev/null; then \
echo "Patch $(PATCH) is not applied"; \
elif [ -f "patches/$(PATCH)" ]; then \
echo "Un-applying patch $(PATCH)"; \
patch -p0 -R < patches/$(PATCH); \
rm -f patches/.tmpapplied || :; \
mv patches/.applied patches/.tmpapplied; \
cat patches/.tmpapplied | grep -v ^$(PATCH)$$ > patches/.applied; \
rm -f patches/.tmpapplied; \
else \
echo "No such patch $(PATCH) in patches directory"; \
fi

@ -133,7 +133,8 @@ Applications:
* The application VoiceMailMain now only matches the 'default' context if * The application VoiceMailMain now only matches the 'default' context if
none is specified in the arguments. (This was the previously none is specified in the arguments. (This was the previously
documented behavior, however, we didn't follow that behavior.) documented behavior, however, we didn't follow that behavior.) The old
behavior can be restored by setting searchcontexts=yes in voicemail.conf.
Queues: Queues:

@ -455,8 +455,20 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
/* This assumes only one waveform will come back, also LP is unlikely */ /* This assumes only one waveform will come back, also LP is unlikely */
wave = 0; wave = 0;
do { do {
int read_data;
for (n=0; n < 3; ) for (n=0; n < 3; )
n += read(fd,ack+n,3-n); {
read_data = read(fd,ack+n,3-n);
/* this avoids falling in infinite loop
* in case that festival server goes down
* */
if ( read_data == -1 )
{
ast_log(LOG_WARNING,"Unable to read from cache/festival fd");
return -1;
}
n += read_data;
}
ack[3] = '\0'; ack[3] = '\0';
if (strcmp(ack,"WV\n") == 0) { /* receive a waveform */ if (strcmp(ack,"WV\n") == 0) { /* receive a waveform */
ast_log(LOG_DEBUG,"Festival WV command\n"); ast_log(LOG_DEBUG,"Festival WV command\n");

@ -40,6 +40,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h" #include "asterisk/module.h"
#include "asterisk/file.h" #include "asterisk/file.h"
#include "asterisk/app.h" #include "asterisk/app.h"
#include "asterisk/chanvars.h"
static const char *tdesc = "Page Multiple Phones"; static const char *tdesc = "Page Multiple Phones";
@ -77,13 +78,14 @@ struct calloutdata {
char tech[64]; char tech[64];
char resource[256]; char resource[256];
char meetmeopts[64]; char meetmeopts[64];
struct ast_variable *variables;
}; };
static void *page_thread(void *data) static void *page_thread(void *data)
{ {
struct calloutdata *cd = data; struct calloutdata *cd = data;
ast_pbx_outgoing_app(cd->tech, AST_FORMAT_SLINEAR, cd->resource, 30000, ast_pbx_outgoing_app(cd->tech, AST_FORMAT_SLINEAR, cd->resource, 30000,
"MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, NULL, NULL); "MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, cd->variables, NULL);
free(cd); free(cd);
return NULL; return NULL;
} }
@ -91,6 +93,9 @@ static void *page_thread(void *data)
static void launch_page(struct ast_channel *chan, const char *meetmeopts, const char *tech, const char *resource) static void launch_page(struct ast_channel *chan, const char *meetmeopts, const char *tech, const char *resource)
{ {
struct calloutdata *cd; struct calloutdata *cd;
const char *varname;
struct ast_variable *lastvar = NULL;
struct ast_var_t *varptr;
pthread_t t; pthread_t t;
pthread_attr_t attr; pthread_attr_t attr;
cd = malloc(sizeof(struct calloutdata)); cd = malloc(sizeof(struct calloutdata));
@ -101,6 +106,29 @@ static void launch_page(struct ast_channel *chan, const char *meetmeopts, const
ast_copy_string(cd->tech, tech, sizeof(cd->tech)); ast_copy_string(cd->tech, tech, sizeof(cd->tech));
ast_copy_string(cd->resource, resource, sizeof(cd->resource)); ast_copy_string(cd->resource, resource, sizeof(cd->resource));
ast_copy_string(cd->meetmeopts, meetmeopts, sizeof(cd->meetmeopts)); ast_copy_string(cd->meetmeopts, meetmeopts, sizeof(cd->meetmeopts));
AST_LIST_TRAVERSE(&chan->varshead, varptr, entries) {
if (!(varname = ast_var_full_name(varptr)))
continue;
if (varname[0] == '_') {
struct ast_variable *newvar = NULL;
if (varname[1] == '_') {
newvar = ast_variable_new(varname, ast_var_value(varptr));
} else {
newvar = ast_variable_new(&varname[1], ast_var_value(varptr));
}
if (newvar) {
if (lastvar)
lastvar->next = newvar;
else
cd->variables = newvar;
lastvar = newvar;
}
}
}
pthread_attr_init(&attr); pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (ast_pthread_create(&t, &attr, page_thread, cd)) { if (ast_pthread_create(&t, &attr, page_thread, cd)) {

@ -110,6 +110,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define VM_ATTACH (1 << 11) #define VM_ATTACH (1 << 11)
#define VM_DELETE (1 << 12) #define VM_DELETE (1 << 12)
#define VM_ALLOCED (1 << 13) #define VM_ALLOCED (1 << 13)
#define VM_SEARCH (1 << 14)
#define ERROR_LOCK_PATH -100 #define ERROR_LOCK_PATH -100
@ -534,12 +535,11 @@ static struct ast_vm_user *find_user_realtime(struct ast_vm_user *ivm, const cha
ast_set_flag(retval, VM_ALLOCED); ast_set_flag(retval, VM_ALLOCED);
if (mailbox) if (mailbox)
ast_copy_string(retval->mailbox, mailbox, sizeof(retval->mailbox)); ast_copy_string(retval->mailbox, mailbox, sizeof(retval->mailbox));
if (context)
ast_copy_string(retval->context, context, sizeof(retval->context));
else
strcpy(retval->context, "default");
populate_defaults(retval); populate_defaults(retval);
var = ast_load_realtime("voicemail", "mailbox", mailbox, "context", retval->context, NULL); if (ast_test_flag((&globalflags), VM_SEARCH))
var = ast_load_realtime("voicemail", "mailbox", mailbox, NULL);
else
var = ast_load_realtime("voicemail", "mailbox", mailbox, "context", retval->context, NULL);
if (var) { if (var) {
tmp = var; tmp = var;
while(tmp) { while(tmp) {
@ -554,6 +554,8 @@ static struct ast_vm_user *find_user_realtime(struct ast_vm_user *ivm, const cha
ast_copy_string(retval->email, tmp->value, sizeof(retval->email)); ast_copy_string(retval->email, tmp->value, sizeof(retval->email));
} else if (!strcasecmp(tmp->name, "fullname")) { } else if (!strcasecmp(tmp->name, "fullname")) {
ast_copy_string(retval->fullname, tmp->value, sizeof(retval->fullname)); ast_copy_string(retval->fullname, tmp->value, sizeof(retval->fullname));
} else if (!strcasecmp(tmp->name, "context")) {
ast_copy_string(retval->context, tmp->value, sizeof(retval->context));
} else } else
apply_option(retval, tmp->name, tmp->value); apply_option(retval, tmp->name, tmp->value);
tmp = tmp->next; tmp = tmp->next;
@ -574,13 +576,14 @@ static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *contex
ast_mutex_lock(&vmlock); ast_mutex_lock(&vmlock);
cur = users; cur = users;
if (!context) if (!context && !ast_test_flag((&globalflags), VM_SEARCH))
context = "default"; context = "default";
while (cur) { while (cur) {
if ((!strcasecmp(context, cur->context)) && if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mailbox, cur->mailbox))
(!strcasecmp(mailbox, cur->mailbox))) break;
break; if ((!strcasecmp(context, cur->context)) && (!strcasecmp(mailbox, cur->mailbox)))
break;
cur=cur->next; cur=cur->next;
} }
if (cur) { if (cur) {
@ -660,91 +663,89 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
} }
while (!feof(configin)) { while (!feof(configin)) {
char *user = NULL, *pass = NULL, *rest = NULL, *comment = NULL, *tmpctx = NULL, *tmpctxend = NULL;
/* Read in the line */ /* Read in the line */
fgets(inbuf, sizeof(inbuf), configin); fgets(inbuf, sizeof(inbuf), configin);
linenum++; linenum++;
if (!feof(configin)) {
char *user = NULL, *pass = NULL, *rest = NULL,
*comment = NULL, *tmpctx = NULL, *tmpctxend = NULL;
if (ast_strlen_zero(inbuf)) {
fprintf(configout, "\n");
continue;
}
/* Make a backup of it */ if (ast_strlen_zero(inbuf)) {
ast_copy_string(orig, inbuf, sizeof(orig)); fprintf(configout, "\n");
continue;
/* }
Read the file line by line, split each line into a comment and command section
only parse the command portion of the line /* Make a backup of it */
*/ ast_copy_string(orig, inbuf, sizeof(orig));
if (inbuf[strlen(inbuf) - 1] == '\n')
inbuf[strlen(inbuf) - 1] = '\0'; /*
Read the file line by line, split each line into a comment and command section
only parse the command portion of the line
*/
if (inbuf[strlen(inbuf) - 1] == '\n')
inbuf[strlen(inbuf) - 1] = '\0';
if ((comment = strchr(inbuf, ';'))) if ((comment = strchr(inbuf, ';')))
*comment++ = '\0'; /* Now inbuf is terminated just before the comment */ *comment++ = '\0'; /* Now inbuf is terminated just before the comment */
if (ast_strlen_zero(inbuf)) { if (ast_strlen_zero(inbuf)) {
fprintf(configout, "%s", orig);
continue;
}
/* Check for a context, first '[' to first ']' */
if ((tmpctx = strchr(inbuf, '['))) {
tmpctxend = strchr(tmpctx, ']');
if (tmpctxend) {
/* Valid context */
ast_copy_string(currcontext, tmpctx + 1, tmpctxend - tmpctx);
fprintf(configout, "%s", orig); fprintf(configout, "%s", orig);
continue; continue;
} }
}
/* Check for a context, first '[' to first ']' */
if ((tmpctx = strchr(inbuf, '['))) { /* This isn't a context line, check for MBX => PSWD... */
tmpctxend = strchr(tmpctx, ']'); user = inbuf;
if (tmpctxend) { if ((pass = strchr(user, '='))) {
/* Valid context */ /* We have a line in the form of aaaaa=aaaaaa */
ast_copy_string(currcontext, tmpctx + 1, tmpctxend - tmpctx); *pass++ = '\0';
fprintf(configout, "%s", orig);
continue; user = ast_strip(user);
}
} if (*pass == '>')
/* This isn't a context line, check for MBX => PSWD... */
user = inbuf;
if ((pass = strchr(user, '='))) {
/* We have a line in the form of aaaaa=aaaaaa */
*pass++ = '\0'; *pass++ = '\0';
user = ast_strip(user);
if (*pass == '>') pass = ast_skip_blanks(pass);
*pass++ = '\0';
pass = ast_skip_blanks(pass); /*
Since no whitespace allowed in fields, or more correctly white space
/* inside the fields is there for a purpose, we can just terminate pass
Since no whitespace allowed in fields, or more correctly white space at the comma or EOL whichever comes first.
inside the fields is there for a purpose, we can just terminate pass */
at the comma or EOL whichever comes first. if ((rest = strchr(pass, ',')))
*/ *rest++ = '\0';
if ((rest = strchr(pass, ','))) } else {
*rest++ = '\0'; user = NULL;
}
/* Compare user, pass AND context */
if (!ast_strlen_zero(user) && !strcmp(user, vmu->mailbox) &&
!ast_strlen_zero(pass) && !strcmp(pass, vmu->password) &&
!strcasecmp(currcontext, vmu->context)) {
/* This is the line */
if (rest) {
fprintf(configout, "%s => %s,%s", user, newpassword, rest);
} else { } else {
user = NULL; fprintf(configout, "%s => %s", user, newpassword);
} }
/* If there was a comment on the line print it out */
/* Compare user, pass AND context */ if (comment) {
if (!ast_strlen_zero(user) && !strcmp(user, vmu->mailbox) && fprintf(configout, ";%s\n", comment);
!ast_strlen_zero(pass) && !strcmp(pass, vmu->password) &&
!strcasecmp(currcontext, vmu->context)) {
/* This is the line */
if (rest) {
fprintf(configout, "%s => %s,%s", user, newpassword, rest);
} else {
fprintf(configout, "%s => %s", user, newpassword);
}
/* If there was a comment on the line print it out */
if (comment) {
fprintf(configout, ";%s\n", comment);
} else {
fprintf(configout, "\n");
}
} else { } else {
/* Put it back like it was */ fprintf(configout, "\n");
fprintf(configout, "%s", orig);
} }
} else {
/* Put it back like it was */
fprintf(configout, "%s", orig);
} }
} }
fclose(configin); fclose(configin);
@ -5812,6 +5813,7 @@ static int load_config(void)
struct ast_variable *var; struct ast_variable *var;
char *notifystr = NULL; char *notifystr = NULL;
char *astattach; char *astattach;
char *astsearch;
char *astsaycid; char *astsaycid;
char *send_voicemail; char *send_voicemail;
char *astcallop; char *astcallop;
@ -5865,6 +5867,10 @@ static int load_config(void)
astattach = "yes"; astattach = "yes";
ast_set2_flag((&globalflags), ast_true(astattach), VM_ATTACH); ast_set2_flag((&globalflags), ast_true(astattach), VM_ATTACH);
if (!(astsearch = ast_variable_retrieve(cfg, "general", "searchcontexts")))
astsearch = "no";
ast_set2_flag((&globalflags), ast_true(astsearch), VM_SEARCH);
#ifdef USE_ODBC_STORAGE #ifdef USE_ODBC_STORAGE
strcpy(odbc_database, "asterisk"); strcpy(odbc_database, "asterisk");
if ((thresholdstr = ast_variable_retrieve(cfg, "general", "odbcstorage"))) { if ((thresholdstr = ast_variable_retrieve(cfg, "general", "odbcstorage"))) {

@ -909,8 +909,11 @@ void ast_channel_free(struct ast_channel *chan)
free(chan->tech_pvt); free(chan->tech_pvt);
} }
if (chan->sched)
sched_context_destroy(chan->sched);
ast_copy_string(name, chan->name, sizeof(name)); ast_copy_string(name, chan->name, sizeof(name));
/* Stop monitoring */ /* Stop monitoring */
if (chan->monitor) { if (chan->monitor) {
chan->monitor->stop( chan, 0 ); chan->monitor->stop( chan, 0 );
@ -1294,8 +1297,10 @@ int ast_hangup(struct ast_channel *chan)
ast_closestream(chan->stream); ast_closestream(chan->stream);
if (chan->vstream) /* Close video stream */ if (chan->vstream) /* Close video stream */
ast_closestream(chan->vstream); ast_closestream(chan->vstream);
if (chan->sched) if (chan->sched) {
sched_context_destroy(chan->sched); sched_context_destroy(chan->sched);
chan->sched = NULL;
}
if (chan->generatordata) /* Clear any tone stuff remaining */ if (chan->generatordata) /* Clear any tone stuff remaining */
chan->generator->release(chan, chan->generatordata); chan->generator->release(chan, chan->generatordata);

@ -910,15 +910,16 @@ static int agent_ack_sleep( void *data )
static struct ast_channel *agent_bridgedchannel(struct ast_channel *chan, struct ast_channel *bridge) static struct ast_channel *agent_bridgedchannel(struct ast_channel *chan, struct ast_channel *bridge)
{ {
struct agent_pvt *p; struct agent_pvt *p = bridge->tech_pvt;
struct ast_channel *ret=NULL; struct ast_channel *ret=NULL;
p = bridge->tech_pvt; if (p) {
if (chan == p->chan) if (chan == p->chan)
ret = bridge->_bridge; ret = bridge->_bridge;
else if (chan == bridge->_bridge) else if (chan == bridge->_bridge)
ret = p->chan; ret = p->chan;
}
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "Asked for bridged channel on '%s'/'%s', returning '%s'\n", chan->name, bridge->name, ret ? ret->name : "<none>"); ast_log(LOG_DEBUG, "Asked for bridged channel on '%s'/'%s', returning '%s'\n", chan->name, bridge->name, ret ? ret->name : "<none>");
return ret; return ret;

@ -320,6 +320,8 @@ static int local_call(struct ast_channel *ast, char *dest, int timeout)
{ {
struct local_pvt *p = ast->tech_pvt; struct local_pvt *p = ast->tech_pvt;
int res; int res;
struct ast_var_t *varptr = NULL, *new;
size_t len, namelen;
ast_mutex_lock(&p->lock); ast_mutex_lock(&p->lock);
if (p->owner->cid.cid_num) if (p->owner->cid.cid_num)
@ -345,9 +347,22 @@ static int local_call(struct ast_channel *ast, char *dest, int timeout)
strncpy(p->chan->language, p->owner->language, sizeof(p->chan->language) - 1); strncpy(p->chan->language, p->owner->language, sizeof(p->chan->language) - 1);
strncpy(p->chan->accountcode, p->owner->accountcode, sizeof(p->chan->accountcode) - 1); strncpy(p->chan->accountcode, p->owner->accountcode, sizeof(p->chan->accountcode) - 1);
p->chan->cdrflags = p->owner->cdrflags; p->chan->cdrflags = p->owner->cdrflags;
/* move the channel variables from the incoming channel to the outgoing channel */
AST_LIST_HEAD_SET_NOLOCK(&p->chan->varshead, AST_LIST_FIRST(&p->owner->varshead)); /* copy the channel variables from the incoming channel to the outgoing channel */
AST_LIST_HEAD_INIT_NOLOCK(&p->owner->varshead); /* Note that due to certain assumptions, they MUST be in the same order */
AST_LIST_TRAVERSE(&p->owner->varshead, varptr, entries) {
namelen = strlen(varptr->name);
len = sizeof(struct ast_var_t) + namelen + strlen(varptr->value) + 2;
new = malloc(len);
if (new) {
memcpy(new, varptr, len);
new->value = &(new->name[0]) + namelen + 1;
AST_LIST_INSERT_TAIL(&p->chan->varshead, new, entries);
} else {
ast_log(LOG_ERROR, "Out of memory!\n");
}
}
p->launchedpbx = 1; p->launchedpbx = 1;
/* Start switch on sub channel */ /* Start switch on sub channel */

@ -8604,8 +8604,6 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
return; return;
} }
if (sipdebug)
ast_verbose("* DTMF-relay event received: '%c'\n", buf[0]);
if (buf[0] == '*') if (buf[0] == '*')
event = 10; event = 10;
else if (buf[0] == '#') else if (buf[0] == '#')
@ -8618,6 +8616,8 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
/* send a FLASH event */ /* send a FLASH event */
struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_FLASH, }; struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_FLASH, };
ast_queue_frame(p->owner, &f); ast_queue_frame(p->owner, &f);
if (sipdebug)
ast_verbose("* DTMF-relay event received: FLASH\n");
} else { } else {
/* send a DTMF event */ /* send a DTMF event */
struct ast_frame f = { AST_FRAME_DTMF, }; struct ast_frame f = { AST_FRAME_DTMF, };
@ -8631,6 +8631,8 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
f.subclass = 'A' + (event - 12); f.subclass = 'A' + (event - 12);
} }
ast_queue_frame(p->owner, &f); ast_queue_frame(p->owner, &f);
if (sipdebug)
ast_verbose("* DTMF-relay event received: %c\n", f.subclass);
} }
transmit_response(p, "200 OK", req); transmit_response(p, "200 OK", req);
return; return;

@ -160,6 +160,9 @@ emaildateformat=%A, %B %d, %Y at %r
sendvoicemail=yes ; Context to Send voicemail from [option 5 from the advanced menu] sendvoicemail=yes ; Context to Send voicemail from [option 5 from the advanced menu]
; if not listed, sending messages from inside voicemail will not be ; if not listed, sending messages from inside voicemail will not be
; permitted ; permitted
; searchcontexts=yes ; Current default behavior is to search only the default context
; if one is not specified. The older behavior was to search all contexts.
; This option restores the old behavior [DEFAULT=no]
; callback=fromvm ; Context to call back from ; callback=fromvm ; Context to call back from
; if not listed, calling the sender back will not be permitted ; if not listed, calling the sender back will not be permitted
; review=yes ; Allow sender to review/rerecord their message before saving it [OFF by default ; review=yes ; Allow sender to review/rerecord their message before saving it [OFF by default

@ -282,7 +282,10 @@ should be enough. the messages are divided in asterisk and misdn parts.
Misdn Debug messages begin with an 'I', asterisk messages begin with an '*', Misdn Debug messages begin with an 'I', asterisk messages begin with an '*',
the rest is clear I think. the rest is clear I think.
Please take a trace of the problem and send this trace via mail to bugs@beronet.com Please take a trace of the problem and open a report in the Asterisk issue
tracker at http://bugs.digium.com in the "channel drivers" project,
"chan_misdn" category. Read the bug guidelines to make sure you
provide all the information needed.
Examples Examples

@ -5217,7 +5217,7 @@ int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout,
goto outgoing_app_cleanup; goto outgoing_app_cleanup;
} }
memset(as, 0, sizeof(struct async_stat)); memset(as, 0, sizeof(struct async_stat));
chan = ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name); chan = __ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name, &oh);
if (!chan) { if (!chan) {
free(as); free(as);
res = -1; res = -1;

Loading…
Cancel
Save