This fixes a problem with pattern ranges; and corrects a situation in res_features...
authorSteve Murphy <murf@digium.com>
Fri, 16 Nov 2007 18:59:02 +0000 (18:59 +0000)
committerSteve Murphy <murf@digium.com>
Fri, 16 Nov 2007 18:59:02 +0000 (18:59 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@89329 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/pbx.c
res/res_features.c

index 9b3b629..359d2b0 100644 (file)
@@ -868,8 +868,10 @@ static void log_match_char_tree(struct match_char *node, char *prefix)
 static void cli_match_char_tree(struct match_char *node, char *prefix, int fd)
 {
        char my_prefix[1024];
 static void cli_match_char_tree(struct match_char *node, char *prefix, int fd)
 {
        char my_prefix[1024];
-       
-       ast_cli(fd, "%s%s:%c:%d:%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N', node->specificity, node->exten? "EXTEN:":"", node->exten ? node->exten->exten : "");
+       if (strlen(node->x) > 1 )
+               ast_cli(fd, "%s[%s]:%c:%d:%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N', node->specificity, node->exten? "EXTEN:":"", node->exten ? node->exten->exten : "");
+       else
+               ast_cli(fd, "%s%s:%c:%d:%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N', node->specificity, node->exten? "EXTEN:":"", node->exten ? node->exten->exten : "");
        strcpy(my_prefix,prefix);
        strcat(my_prefix,"+       ");
        if (node->next_char)
        strcpy(my_prefix,prefix);
        strcat(my_prefix,"+       ");
        if (node->next_char)
@@ -1084,6 +1086,7 @@ struct match_char *add_exten_to_pattern_tree(struct ast_context *con, struct ast
                if (pattern && *s1 == '[' && *(s1-1) != '\\') {
                        char *s2 = buf;
                        buf[0] = 0;
                if (pattern && *s1 == '[' && *(s1-1) != '\\') {
                        char *s2 = buf;
                        buf[0] = 0;
+                       s1++; /* get past the '[' */
                        while (*s1 != ']' && *(s1-1) != '\\' ) {
                                if (*s1 == '\\') {
                                        if (*(s1+1) == ']') {
                        while (*s1 != ']' && *(s1-1) != '\\' ) {
                                if (*s1 == '\\') {
                                        if (*(s1+1) == ']') {
@@ -1110,6 +1113,7 @@ struct match_char *add_exten_to_pattern_tree(struct ast_context *con, struct ast
                                        *s2++ = *s1++;
                                }
                        }
                                        *s2++ = *s1++;
                                }
                        }
+                       *s2 = 0; /* null terminate the exploded range */
                        specif = strlen(buf);
                } else {
                        if (*s1 == '\\') {
                        specif = strlen(buf);
                } else {
                        if (*s1 == '\\') {
index 5e1d352..34c5661 100644 (file)
@@ -2104,8 +2104,15 @@ static void *do_parking_thread(void *ignore)
                                        }
                                        if (con) {
                                                char returnexten[AST_MAX_EXTENSION];
                                        }
                                        if (con) {
                                                char returnexten[AST_MAX_EXTENSION];
+                                               char peername_flat[AST_MAX_EXTENSION]; /* using something like Zap/52 for an extension name is NOT a good idea */
+                                               int i;
+                                               ast_copy_string(peername_flat,peername,sizeof(peername_flat));
+                                               for(i=0; peername_flat[i] && i < AST_MAX_EXTENSION; i++) {
+                                                       if (peername_flat[i] == '/') 
+                                                               peername_flat[i]= '0';
+                                               }
                                                snprintf(returnexten, sizeof(returnexten), "%s,,t", peername);
                                                snprintf(returnexten, sizeof(returnexten), "%s,,t", peername);
-                                               ast_add_extension2(con, 1, peername, 1, NULL, NULL, "Dial", ast_strdup(returnexten), ast_free_ptr, registrar);
+                                               ast_add_extension2(con, 1, peername_flat, 1, NULL, NULL, "Dial", ast_strdup(returnexten), ast_free_ptr, registrar);
                                        }
                                        if (comebacktoorigin) { 
                                                set_c_e_p(chan, parking_con_dial, peername, 1);
                                        }
                                        if (comebacktoorigin) { 
                                                set_c_e_p(chan, parking_con_dial, peername, 1);