Merged revisions 7265-7266,7268-7275 via svnmerge from
authorKevin P. Fleming <kpfleming@digium.com>
Fri, 2 Dec 2005 01:01:11 +0000 (01:01 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Fri, 2 Dec 2005 01:01:11 +0000 (01:01 +0000)
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

12 files changed:
Makefile
UPGRADE.txt
apps/app_festival.c
apps/app_page.c
apps/app_voicemail.c
channel.c
channels/chan_agent.c
channels/chan_local.c
channels/chan_sip.c
configs/voicemail.conf.sample
doc/README.misdn
pbx.c

index f2bb7ad..9c35ecb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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
-
index db9eab8..76e5577 100644 (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:
 
index 0375364..186a50a 100644 (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");
index 441208f..39a0eb4 100644 (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)) {
index 2dab9fa..1bc88ce 100644 (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;
+               }
+
+               /* 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 ((comment = strchr(inbuf, ';')))
-                               *comment++ = '\0'; /* Now inbuf is terminated just before the comment */
+               if ((comment = strchr(inbuf, ';')))
+                       *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);
                                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");
-                               }
+                               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 {
-                               /* Put it back like it was */
-                               fprintf(configout, "%s", orig);
+                               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"))) {
index e86afb2..85a2882 100644 (file)
--- a/channel.c
+++ b/channel.c
@@ -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);
index e2ef0f2..a754f8a 100644 (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;
index 6dec650..f843fd9 100644 (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 */
index 0daf12f..c93f21f 100644 (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;
index ba917ab..8558235 100644 (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
index 522cda9..2ff0b9b 100644 (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
diff --git a/pbx.c b/pbx.c
index 950cc2f..8ba552d 100644 (file)
--- a/pbx.c
+++ b/pbx.c
@@ -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;