Merged revisions 92696 via svnmerge from
authorJason Parker <jparker@digium.com>
Thu, 13 Dec 2007 00:18:04 +0000 (00:18 +0000)
committerJason Parker <jparker@digium.com>
Thu, 13 Dec 2007 00:18:04 +0000 (00:18 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

(closes issue #10690)
........
r92696 | qwell | 2007-12-12 18:11:09 -0600 (Wed, 12 Dec 2007) | 7 lines

If a typo is found in a config file, we previous continued on with what was already loaded.
We do not want to do this (see bug below for details).

This makes it so that if a [ is found without a ], the entire config will fail, and nothing in it will be loaded.

Issue 10690.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@92697 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_h323.c
channels/chan_sip.c
main/config.c

index 6c5e7a3..f6f138c 100644 (file)
@@ -2746,6 +2746,56 @@ static struct ast_cli_entry cli_h323[] = {
        AST_CLI_DEFINE(handle_cli_h323_show_tokens, "Show all active call tokens"),
 };
 
+static void delete_users(void)
+{
+       int pruned = 0;
+
+       /* Delete all users */
+       ASTOBJ_CONTAINER_WRLOCK(&userl);
+       ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do {
+               ASTOBJ_RDLOCK(iterator);
+               ASTOBJ_MARK(iterator);
+               ++pruned;
+               ASTOBJ_UNLOCK(iterator);
+       } while (0) );
+       if (pruned) {
+               ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user);
+       }
+       ASTOBJ_CONTAINER_UNLOCK(&userl);
+
+       ASTOBJ_CONTAINER_WRLOCK(&peerl);
+       ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
+               ASTOBJ_RDLOCK(iterator);
+               ASTOBJ_MARK(iterator);
+               ASTOBJ_UNLOCK(iterator);
+       } while (0) );
+       ASTOBJ_CONTAINER_UNLOCK(&peerl);
+}
+
+static void delete_aliases(void)
+{
+       int pruned = 0;
+
+       /* Delete all aliases */
+       ASTOBJ_CONTAINER_WRLOCK(&aliasl);
+       ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do {
+               ASTOBJ_RDLOCK(iterator);
+               ASTOBJ_MARK(iterator);
+               ++pruned;
+               ASTOBJ_UNLOCK(iterator);
+       } while (0) );
+       if (pruned) {
+               ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias);
+       }
+       ASTOBJ_CONTAINER_UNLOCK(&aliasl);
+}
+
+static void prune_peers(void)
+{
+       /* Prune peers who still are supposed to be deleted */
+       ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
+}
+
 static int reload_config(int is_reload)
 {
        struct ast_config *cfg, *ucfg;
@@ -2973,56 +3023,6 @@ static int reload_config(int is_reload)
        return 0;
 }
 
-static void delete_users(void)
-{
-       int pruned = 0;
-
-       /* Delete all users */
-       ASTOBJ_CONTAINER_WRLOCK(&userl);
-       ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do {
-               ASTOBJ_RDLOCK(iterator);
-               ASTOBJ_MARK(iterator);
-               ++pruned;
-               ASTOBJ_UNLOCK(iterator);
-       } while (0) );
-       if (pruned) {
-               ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user);
-       }
-       ASTOBJ_CONTAINER_UNLOCK(&userl);
-
-       ASTOBJ_CONTAINER_WRLOCK(&peerl);
-       ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
-               ASTOBJ_RDLOCK(iterator);
-               ASTOBJ_MARK(iterator);
-               ASTOBJ_UNLOCK(iterator);
-       } while (0) );
-       ASTOBJ_CONTAINER_UNLOCK(&peerl);
-}
-
-static void delete_aliases(void)
-{
-       int pruned = 0;
-
-       /* Delete all aliases */
-       ASTOBJ_CONTAINER_WRLOCK(&aliasl);
-       ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do {
-               ASTOBJ_RDLOCK(iterator);
-               ASTOBJ_MARK(iterator);
-               ++pruned;
-               ASTOBJ_UNLOCK(iterator);
-       } while (0) );
-       if (pruned) {
-               ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias);
-       }
-       ASTOBJ_CONTAINER_UNLOCK(&aliasl);
-}
-
-static void prune_peers(void)
-{
-       /* Prune peers who still are supposed to be deleted */
-       ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
-}
-
 static int h323_reload(void)
 {
        ast_mutex_lock(&h323_reload_lock);
index 19d3dba..46c3b56 100644 (file)
@@ -18201,6 +18201,36 @@ static int reload_config(enum channelreloadreason reason)
                ASTOBJ_CONTAINER_MARKALL(&peerl);
        }
 
+       if (option_debug > 3)
+               ast_log(LOG_DEBUG, "--------------- SIP reload started\n");
+
+       clear_realm_authentication(authl);
+       clear_sip_domains();
+       authl = NULL;
+
+       /* First, destroy all outstanding registry calls */
+       /* This is needed, since otherwise active registry entries will not be destroyed */
+       ASTOBJ_CONTAINER_TRAVERSE(&regl, 1, do {
+               ASTOBJ_RDLOCK(iterator);
+               if (iterator->call) {
+                       if (option_debug > 2)
+                               ast_log(LOG_DEBUG, "Destroying active SIP dialog for registry %s@%s\n", iterator->username, iterator->hostname);
+                       /* This will also remove references to the registry */
+                       sip_destroy(iterator->call);
+               }
+               ASTOBJ_UNLOCK(iterator);
+       
+       } while(0));
+
+       /* Then, actually destroy users and registry */
+       ASTOBJ_CONTAINER_DESTROYALL(&userl, sip_destroy_user);
+       if (option_debug > 3)
+               ast_log(LOG_DEBUG, "--------------- Done destroying user list\n");
+       ASTOBJ_CONTAINER_DESTROYALL(&regl, sip_registry_destroy);
+       if (option_debug > 3)
+               ast_log(LOG_DEBUG, "--------------- Done destroying registry list\n");
+       ASTOBJ_CONTAINER_MARKALL(&peerl);
+
        /* Initialize copy of current global_regcontext for later use in removing stale contexts */
        ast_copy_string(oldcontexts, global_regcontext, sizeof(oldcontexts));
        oldregcontext = oldcontexts;
index 379aa2b..f2b54bc 100644 (file)
@@ -1008,7 +1008,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                if (!ast_strlen_zero(exec_file))
                                        unlink(exec_file);
                                if (!do_include)
-                                       return 0;
+                                       return -1;
                                /* XXX otherwise what ? the default return is 0 anyways */
 
        } else {