$NetBSD: patch-bd,v 1.3 2010/09/23 23:30:38 jnemeth Exp $ # reported upstream as https://issues.asterisk.org/view.php?id=17304 # revised patch from upstream at https://issues.asterisk.org/file_download.php?file_id=26021&type=bug --- cdr/cdr_odbc.c.orig 2009-01-15 20:18:53.000000000 +0000 +++ cdr/cdr_odbc.c @@ -55,6 +55,7 @@ enum { CONFIG_LOGUNIQUEID = 1 << 0, CONFIG_USEGMTIME = 1 << 1, CONFIG_DISPOSITIONSTRING = 1 << 2, + CONFIG_REGISTERED = 1 << 3, }; static struct ast_flags config = { 0 }; @@ -220,13 +221,23 @@ 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) ast_config_destroy(cfg); return res; }