a quick fix to pbx_dundi.c to make it so it will compile. Hope I did the right thing...
[asterisk/asterisk.git] / main / pbx.c
index a05a654..2129898 100644 (file)
@@ -3630,9 +3630,23 @@ int ast_context_remove_extension2(struct ast_context *con, const char *extension
                                ex.priority = priority;
                                exten2 = ast_hashtab_lookup(exten->peer_tree, &ex);
                                if (exten2) {
+                                       if (exten2->label) /* if this exten has a label, remove that, too */
+                                               ast_hashtab_remove_this_object(exten->peer_label_tree,exten2);
                                        ast_hashtab_remove_this_object(exten->peer_tree, exten2);
                                        ast_log(LOG_NOTICE,"Removed priority %d from extension %s context %s table\n",
                                                        priority, exten->exten, con->name);
+                                       if (ast_hashtab_size(exten->peer_tree) == 0) {
+                                               /* well, if the last priority of an exten is to be removed,
+                                                  then, the extension is removed, too! */
+                                               struct match_char *x = add_exten_to_pattern_tree(con, exten);
+                                               if (x->exten) { /* this test for safety purposes */
+                                                       x->deleted = 1; /* with this marked as deleted, it will never show up in the scoreboard, and therefore never be found */
+                                                       x->exten = 0; /* get rid of what will become a bad pointer */
+                                                       ast_hashtab_remove_this_object(con->root_tree, exten);
+                                                       ast_log(LOG_NOTICE,"Removed extension %s from context %s table\n",
+                                                                       exten->exten, con->name);
+                                               }
+                                       }
                                } else {
                                        ast_log(LOG_ERROR,"Could not find priority %d of exten %s in context %s!\n",
                                                        priority, exten->exten, con->name);
@@ -3691,13 +3705,21 @@ int ast_context_remove_extension2(struct ast_context *con, const char *extension
                         * The next node is either the next priority or the next extension
                         */
                        struct ast_exten *next_node = peer->peer ? peer->peer : peer->next;
-
-                       if (!prev_exten)        /* change the root... */
+                       if (next_node == peer->peer) {
+                               next_node->peer_tree = exten->peer_tree; /* move the priority hash tabs over */
+                               exten->peer_tree = 0;
+                               next_node->peer_tree = exten->peer_label_tree;
+                               exten->peer_label_tree = 0;
+                       }
+                       if (!prev_exten) {      /* change the root... */
                                con->root = next_node;
-                       else
+                       } else {
                                prev_exten->next = next_node; /* unlink */
-                       if (peer->peer) /* XXX update the new head of the pri list */
+                       }
+                       if (peer->peer) { /* XXX update the new head of the pri list */
                                peer->peer->next = peer->next;
+                       }
+                       
                } else { /* easy, we are not first priority in extension */
                        previous_peer->peer = peer->peer;
                }