]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
If a typo is found in a config file, we previous continued on with what was already...
authorJason Parker <jparker@digium.com>
Thu, 13 Dec 2007 00:11:09 +0000 (00:11 +0000)
committerJason Parker <jparker@digium.com>
Thu, 13 Dec 2007 00:11:09 +0000 (00:11 +0000)
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.

Isue #10690.

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

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

index 2ae04f08dc783968ac5802467889a04dc978f36c..a6290c8ea7eaac362fe9ec7394eb793b2fe91579 100644 (file)
@@ -2710,6 +2710,56 @@ static struct ast_cli_entry cli_h323[] = {
        show_tokens_usage },
 };
 
+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)
 {
        int format;
@@ -2733,6 +2783,12 @@ static int reload_config(int is_reload)
                return 1;
        }
 
+       if (is_reload) {
+               delete_users();
+               delete_aliases();
+               prune_peers();
+       }
+
        /* fire up the H.323 Endpoint */
        if (!h323_end_point_exist()) {
                h323_end_point_create();
@@ -2923,56 +2979,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(int fd, int argc, char *argv[])
 {
        ast_mutex_lock(&h323_reload_lock);
@@ -2988,9 +2994,6 @@ static int h323_reload(int fd, int argc, char *argv[])
 
 static int h323_do_reload(void)
 {
-       delete_users();
-       delete_aliases();
-       prune_peers();
        reload_config(1);
        return 0;
 }
index 39f3f6d87e34648a44fb3014cae85064ca0f62ae..63b358fd5df539d8e9bcb6e0ccb0b6efbc27c07a 100644 (file)
@@ -9534,6 +9534,20 @@ static void set_timing(void)
 #endif
 }
 
+static void set_config_destroy(void)
+{
+       strcpy(accountcode, "");
+       strcpy(language, "");
+       strcpy(mohinterpret, "default");
+       strcpy(mohsuggest, "");
+       amaflags = 0;
+       delayreject = 0;
+       ast_clear_flag((&globalflags), IAX_NOTRANSFER); 
+       ast_clear_flag((&globalflags), IAX_TRANSFERMEDIA);      
+       ast_clear_flag((&globalflags), IAX_USEJITTERBUF);       
+       ast_clear_flag((&globalflags), IAX_FORCEJITTERBUF);     
+       delete_users();
+}
 
 /*! \brief Load configuration */
 static int set_config(char *config_file, int reload)
@@ -9561,6 +9575,10 @@ static int set_config(char *config_file, int reload)
                return -1;
        }
 
+       if (reload) {
+               set_config_destroy();
+       }
+
        /* Reset global codec prefs */  
        memset(&prefs, 0 , sizeof(struct ast_codec_pref));
        
@@ -9886,7 +9904,7 @@ static int set_config(char *config_file, int reload)
        }
        ast_config_destroy(cfg);
        set_timing();
-       return capability;
+       return 1;
 }
 
 static void poke_all_peers(void)
@@ -9905,26 +9923,16 @@ static int reload_config(void)
        char *config = "iax.conf";
        struct iax2_registry *reg;
 
-       strcpy(accountcode, "");
-       strcpy(language, "");
-       strcpy(mohinterpret, "default");
-       strcpy(mohsuggest, "");
-       amaflags = 0;
-       delayreject = 0;
-       ast_clear_flag((&globalflags), IAX_NOTRANSFER); 
-       ast_clear_flag((&globalflags), IAX_TRANSFERMEDIA);      
-       ast_clear_flag((&globalflags), IAX_USEJITTERBUF);       
-       ast_clear_flag((&globalflags), IAX_FORCEJITTERBUF);     
-       delete_users();
-       set_config(config, 1);
-       prune_peers();
-       prune_users();
-       AST_LIST_LOCK(&registrations);
-       AST_LIST_TRAVERSE(&registrations, reg, entry)
-               iax2_do_register(reg);
-       AST_LIST_UNLOCK(&registrations);
-       /* Qualify hosts, too */
-       poke_all_peers();
+       if (set_config(config, 1) > 0) {
+               prune_peers();
+               prune_users();
+               AST_LIST_LOCK(&registrations);
+               AST_LIST_TRAVERSE(&registrations, reg, entry)
+                       iax2_do_register(reg);
+               AST_LIST_UNLOCK(&registrations);
+               /* Qualify hosts, too */
+               poke_all_peers();
+       }
        reload_firmware(0);
        iax_provision_reload();
 
index 78c2e8acc32273295c2c346ea45ea55d8f6dcb0a..66d06d2e27cc9992beda51ebe6546ce38fd46be9 100644 (file)
@@ -16660,6 +16660,36 @@ static int reload_config(enum channelreloadreason reason)
                return -1;
        }
        
+       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;
@@ -17668,35 +17698,6 @@ static void sip_send_all_registers(void)
 /*! \brief Reload module */
 static int sip_do_reload(enum channelreloadreason reason)
 {
-       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);
        reload_config(reason);
 
        /* Prune peers who still are supposed to be deleted */
index bb9037cdf4f2cca77bc939ee4006117e4f9c03b6..db347d65bec66d83b027dd0c724df59c793fdbbb 100644 (file)
@@ -745,7 +745,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;
 
                        } else {
                                ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",