Merged revisions 279410 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Sun, 25 Jul 2010 18:22:13 +0000 (18:22 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sun, 25 Jul 2010 18:22:13 +0000 (18:22 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r279410 | tilghman | 2010-07-25 13:21:27 -0500 (Sun, 25 Jul 2010) | 8 lines

  Don't re-register CDR module on reload.

  (closes issue #17304)
   Reported by: jnemeth
   Patches:
         20100507__issue17304.diff.txt uploaded by tilghman (license 14)
   Tested by: jnemeth
........

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

cdr/cdr_odbc.c

index e8a7ce8..ab4a145 100644 (file)
@@ -54,6 +54,7 @@ enum {
        CONFIG_USEGMTIME =         1 << 1,
        CONFIG_DISPOSITIONSTRING = 1 << 2,
        CONFIG_HRTIME =            1 << 3,
+       CONFIG_REGISTERED =        1 << 4,
 };
 
 static struct ast_flags config = { 0 };
@@ -242,14 +243,24 @@ static int odbc_load_module(int reload)
                ast_verb(3, "cdr_odbc: dsn is %s\n", dsn);
                ast_verb(3, "cdr_odbc: table is %s\n", table);
 
-               res = ast_cdr_register(name, ast_module_info->description, odbc_log);
-               if (res) {
-                       ast_log(LOG_ERROR, "cdr_odbc: Unable to register ODBC CDR handling\n");
+               if (!ast_test_flag(&config, CONFIG_REGISTERED)) {
+                       res = ast_cdr_register(name, ast_module_info->description, odbc_log);
+                       if (res) {
+                               ast_log(LOG_ERROR, "cdr_odbc: Unable to register ODBC CDR handling\n");
+                       } else {
+                               ast_set_flag(&config, CONFIG_REGISTERED);
+                       }
                }
        } while (0);
 
-       if (cfg && cfg != CONFIG_STATUS_FILEUNCHANGED && cfg != CONFIG_STATUS_FILEINVALID)
+       if (ast_test_flag(&config, CONFIG_REGISTERED) && (!cfg || dsn == NULL || table == NULL)) {
+               ast_cdr_unregister(name);
+               ast_clear_flag(&config, CONFIG_REGISTERED);
+       }
+
+       if (cfg && cfg != CONFIG_STATUS_FILEUNCHANGED && cfg != CONFIG_STATUS_FILEINVALID) {
                ast_config_destroy(cfg);
+       }
        return res;
 }