$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;
 }
