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
This commit is contained in:
Kevin P. Fleming 2005-12-02 01:01:11 +00:00
parent 6b8a8926ab
commit 0242a69b3f
12 changed files with 185 additions and 165 deletions

View File

@ -592,17 +592,16 @@ datafiles: all
mkdir -p $(DESTDIR)$(AGI_DIR)
update:
@if [ -d CVS ]; then \
if [ -f patches/.applied ]; then \
patches=`cat patches/.applied`; \
fi; \
if [ ! -z "$$patches" ]; then \
for x in $$patches; do \
echo "Unapplying $$x..."; \
patch -R -p0 < patches/$$x; \
done; \
rm -f patches/.applied; \
@if [ -d .svn ]; then \
echo "Updating from Subversion..." ; \
svn update | tee update.out; \
rm -f .version; \
if [ `grep -c ^C update.out` -gt 0 ]; then \
echo ; echo "The following files have conflicts:" ; \
grep ^C update.out | cut -b4- ; \
fi ; \
rm -f update.out; \
elif [ -d CVS ]; then \
echo "Updating from CVS..." ; \
cvs -q -z3 update -Pd | tee update.out; \
rm -f .version; \
@ -611,19 +610,8 @@ update:
grep ^C update.out | cut -d' ' -f2- ; \
fi ; \
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 \
echo "Not CVS"; \
echo "Not under version control"; \
fi
NEWHEADERS=$(notdir $(wildcard include/asterisk/*.h))
@ -911,47 +899,3 @@ cleantest:
if cmp -s .cleancount .lastclean ; then echo ; else \
$(MAKE) clean; cp -f .cleancount .lastclean;\
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

View File

@ -133,7 +133,8 @@ Applications:
* The application VoiceMailMain now only matches the 'default' context if
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:

View File

@ -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 */
wave = 0;
do {
int read_data;
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';
if (strcmp(ack,"WV\n") == 0) { /* receive a waveform */
ast_log(LOG_DEBUG,"Festival WV command\n");

View File

@ -40,6 +40,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/chanvars.h"
static const char *tdesc = "Page Multiple Phones";
@ -77,13 +78,14 @@ struct calloutdata {
char tech[64];
char resource[256];
char meetmeopts[64];
struct ast_variable *variables;
};
static void *page_thread(void *data)
{
struct calloutdata *cd = data;
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);
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)
{
struct calloutdata *cd;
const char *varname;
struct ast_variable *lastvar = NULL;
struct ast_var_t *varptr;
pthread_t t;
pthread_attr_t attr;
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->resource, resource, sizeof(cd->resource));
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_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (ast_pthread_create(&t, &attr, page_thread, cd)) {

View File

@ -110,6 +110,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define VM_ATTACH (1 << 11)
#define VM_DELETE (1 << 12)
#define VM_ALLOCED (1 << 13)
#define VM_SEARCH (1 << 14)
#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);
if (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);
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) {
tmp = var;
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));
} else if (!strcasecmp(tmp->name, "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
apply_option(retval, tmp->name, tmp->value);
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);
cur = users;
if (!context)
if (!context && !ast_test_flag((&globalflags), VM_SEARCH))
context = "default";
while (cur) {
if ((!strcasecmp(context, cur->context)) &&
(!strcasecmp(mailbox, cur->mailbox)))
break;
if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mailbox, cur->mailbox))
break;
if ((!strcasecmp(context, cur->context)) && (!strcasecmp(mailbox, cur->mailbox)))
break;
cur=cur->next;
}
if (cur) {
@ -660,91 +663,89 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
}
while (!feof(configin)) {
char *user = NULL, *pass = NULL, *rest = NULL, *comment = NULL, *tmpctx = NULL, *tmpctxend = NULL;
/* Read in the line */
fgets(inbuf, sizeof(inbuf), configin);
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 */
ast_copy_string(orig, inbuf, sizeof(orig));
/*
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 (ast_strlen_zero(inbuf)) {
fprintf(configout, "\n");
continue;
}
if ((comment = strchr(inbuf, ';')))
*comment++ = '\0'; /* Now inbuf is terminated just before the comment */
/* Make a backup of it */
ast_copy_string(orig, inbuf, sizeof(orig));
if (ast_strlen_zero(inbuf)) {
/*
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, ';')))
*comment++ = '\0'; /* Now inbuf is terminated just before the comment */
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);
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);
continue;
}
}
/* 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 */
}
/* 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';
user = ast_strip(user);
if (*pass == '>')
*pass++ = '\0';
user = ast_strip(user);
if (*pass == '>')
*pass++ = '\0';
pass = ast_skip_blanks(pass);
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
at the comma or EOL whichever comes first.
*/
if ((rest = strchr(pass, ',')))
*rest++ = '\0';
/*
Since no whitespace allowed in fields, or more correctly white space
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';
} else {
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 {
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 {
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 {
/* Put it back like it was */
fprintf(configout, "%s", orig);
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 {
/* Put it back like it was */
fprintf(configout, "%s", orig);
}
}
fclose(configin);
@ -5812,6 +5813,7 @@ static int load_config(void)
struct ast_variable *var;
char *notifystr = NULL;
char *astattach;
char *astsearch;
char *astsaycid;
char *send_voicemail;
char *astcallop;
@ -5865,6 +5867,10 @@ static int load_config(void)
astattach = "yes";
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
strcpy(odbc_database, "asterisk");
if ((thresholdstr = ast_variable_retrieve(cfg, "general", "odbcstorage"))) {

View File

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

View File

@ -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)
{
struct agent_pvt *p;
struct agent_pvt *p = bridge->tech_pvt;
struct ast_channel *ret=NULL;
p = bridge->tech_pvt;
if (chan == p->chan)
ret = bridge->_bridge;
else if (chan == bridge->_bridge)
ret = p->chan;
if (p) {
if (chan == p->chan)
ret = bridge->_bridge;
else if (chan == bridge->_bridge)
ret = p->chan;
}
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>");
return ret;

View File

@ -320,6 +320,8 @@ static int local_call(struct ast_channel *ast, char *dest, int timeout)
{
struct local_pvt *p = ast->tech_pvt;
int res;
struct ast_var_t *varptr = NULL, *new;
size_t len, namelen;
ast_mutex_lock(&p->lock);
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->accountcode, p->owner->accountcode, sizeof(p->chan->accountcode) - 1);
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));
AST_LIST_HEAD_INIT_NOLOCK(&p->owner->varshead);
/* copy the channel variables from the incoming channel to the outgoing channel */
/* 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;
/* Start switch on sub channel */

View File

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

View File

@ -160,6 +160,9 @@ emaildateformat=%A, %B %d, %Y at %r
sendvoicemail=yes ; Context to Send voicemail from [option 5 from the advanced menu]
; if not listed, sending messages from inside voicemail will not be
; 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
; 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

View File

@ -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 '*',
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

2
pbx.c
View File

@ -5217,7 +5217,7 @@ int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout,
goto outgoing_app_cleanup;
}
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) {
free(as);
res = -1;